如何與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和被它折騰 ^_^

暫無評論

發表評論