有很多方法可以从WordPress数据库中检索数据,例如WP_Query、get_posts()、wp_get_post_terms() 等。建议使用WordPress自带函数进行数据库交互,因为它具有更好的性能,例如数据库缓存。但是,对于自定义数据库表,我们将需要使用$wpdb直接调用WordPress数据库数据。
wpdb 类和 $wpdb 全局变量
WordPress定义了一个名为 wpdb
的类,其中包含一组用于与数据库进行交互的方法。其主要目的是提供与WordPress数据库的接口,也可用来与任何其他适当的数据库进行通信。
请不要直接调用wpdb
类中的方法。WordPress定义了$wpdb
全局变量,所以请直接调用该全局变量$wpdb
的实例来操作数据库。 由于它是一个全局对象,因此我们可以使用全局声明在任何地方调用它。
global $wpdb;
$wpdb
对象可以用来操作WordPress数据库中的每一个表,不仅仅是WordPress自动创建的基本表。例如,我们有一个自定义的表叫做mytable,那么可以使用如下语句来查询:
$myrows = $wpdb->get_results( "SELECT id, name FROM mytable" );
更多的介绍,可以阅读官方文档: https://codex.wordpress.org/Class_Reference/wpdb
以下是访问wpdb对象的示例:
$id = $_GET['id'];
$results = $wpdb->get_results( "SELECT * FROM $wpdb->property_listing WHERE ID = $id" );
以上代码虽然可以正确获取到数据,但是具有SQL注入漏洞,因为此查询使访问者无需进行过滤检查即可直接与数据库进行交互,如果$_GET['id']
是绝对数字,那没有问题,但是访问者可以在此处轻松添加恶意代码。
那么与WORDPRESS数据库进行交互的更好方法是什么呢?
$id = (int) $_GET['id'];
$results = $wpdb->get_results( "SELECT * FROM $wpdb->property_listing WHERE ID = $id" );
上面的查询检查了$_GET['id']
,相对安全,但仍然不建议使用。我们无需清理代码中的输入,因为WordPress使用prepare()
函数可以提供更好的清理效果。
与WORDPRESS数据库进行交互的正确方法!
prepare()
函数会进行几项检查,如果它不是一个整数(在我们的例子),那么它将调用名为函数mysql_real_escape_string()
。请注意,%d
用于整数数据输入,%s
用于字符串数据。
这是组合字符串和整数的示例:
$id = $_GET['id'];
$string = $_GET['location']; // 南美洲
$results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->property_listing WHERE ID = %d AND location = %s", $id, $string ) );
因此,每当我们需要直接与数据库进行交互时,请始终使用prepare()
函数。
目前,全世界排名前1000万的网站有33.4%是用WordPress搭建的,作为一名WordPress用户,我非常自豪。但是,这也使WordPress成为黑客最有针对性的攻击目标:为什么您的WordPress网站会容易被黑客攻击。所以,让我们从安全的层面上去编写我们的代码,让WordPress更加安全!
来源:
https://www.wpdaxue.com/how-to-interact-correctly-with-wordpress-database.html