如何与WordPress数据库正确交互

有很多方法可以从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更加安全!

倡萌

一个文科IT宅男,喜欢折腾WordPress和被它折腾 ^_^

暂无评论

发表评论