與數據庫建立接口
WordPress為用戶提供了一系列用於數據庫操作的函數類——wpdb。Wpdb類建立在Justin Vincent編寫並維護的ezSQL類的基礎上。
使用須知
不可直接調用wpdb類中的方法,應使用全局變量$wpdb。$wpdb是WordPress提供的一個全局變量,該全局變量是負責與WordPress數據庫交流的類的實例化。(在自定義函數中使用$wpdb前,請記住全局化$wpdb。)
可以用$wpdb對象從任何一個WordPress數據庫表(而非僅僅標准數據庫表)中讀取數據。例如,如果你需要從一個名為“mytable”的自定義表中選定一些信息,可以使用以下代碼:
$myrows = $wpdb->get_results( "SELECT id, name FROM mytable" );
$wpdb對象可以與任何數量的數據庫表交流,但這些數據庫表只能來自一個數據庫——WordPress數據庫。如果你要連接到其它數據庫(極少情況),那么你就需要用相應的連接細節信息從wpdb類中將你的對象實例化。如果需要設置多個數據庫,可以考慮使用 hyperdb。
執行數據庫查詢
你可以通過query函數在WordPress數據庫中執行任何SQL查詢。不過我們推薦為SELECT查詢使用更為具體的函數。
<?php $wpdb->query('query'); ?>
query
(字符串)你希望執行的SQL語句。
函數返回一個與選定內容的行數相應的整數。如果發生MySQL錯誤,函數返回FALSE。(注意:0和FALSE都可能被返回,確保使用正確的比較運算符:equality == vs. identicality ===)。
注意:使用wpdb類中所有可執行SQL查詢的函數時,都需要將所有輸入內容/inputs進行字符轉義(如wpdb->escape($user_entered_data_string))。見下文。
示例
刪除ID為13的文章的“gargle”元關鍵字和值。
$wpdb->query("
DELETE FROM $wpdb->postmeta WHERE post_id = '13'
AND meta_key = 'gargle'");
由delete_post_meta執行。
將頁面7設為頁面15的父級。
$wpdb->query("
UPDATE $wpdb->posts SET post_parent = 7
WHERE ID = 15 AND post_status = 'static'");
選擇一個變量
get_var函數返回一個來自數據庫的變量。雖然只返回一個變量,但查詢結果會被整體緩存,供后期使用。如果沒有查詢結果,返回NULL。
<?php $wpdb->get_var('query',column_offset,row_offset); ?>
query
(字符串)你希望執行的查詢。將該參數設為null會使函數返回上一個查詢緩存結果中的具體變量。
column_offset
(整數)預計的數據庫表的列數(0為表中第一列)。默認值為0。
row_offset
(整數)預計的數據庫表的行數(0為表中第一行)。默認值為0。
示例
檢索並返回用戶數量。
<?php
$user_count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users;"));
echo '<p>User count is ' . $user_count . '</p>';
?>
檢索並返回自定義字段值的總數。
<?php
$meta_key = 'miles';//set this to appropriate custom field meta key
$allmiles=$wpdb->get_var($wpdb->prepare("SELECT sum(meta_value) FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key));
echo '<p>Total miles is '.$allmiles . '</p>';
?>
選擇表行
從某個查詢中檢索一整行內容,可使用get_row函數。該函數可將行作為對象、關聯數組或數值索引數組返回。如果查詢返回了多個行,函數只返回指定行,但所有返回的行都將被緩存以供日后使用。
<?php $wpdb->get_row('query', output_type, row_offset); ?>
query
(字符串)你希望執行的查詢語句。
output_type
三個預定義的常量之一。默認值為OBJECT。
- OBJECT —— 返回的結果以對象形式輸出
- ARRAY_A ——返回的結果以關聯數組形式輸出
- ARRAY_N —— 返回的結果以數值索引數組形式輸出
row_offset
(整數)預計的數據庫表的行數(0為表中第一行)。默認值為0。
示例
獲取ID為10的鏈接的所有資料。
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10");
$mylink對象的屬性即SQL查詢結果的行名稱(在該例中,即 $wpdb->links表中的所有行)。
echo $mylink->link_id; // prints "10"
使用
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_A);
則會生成一個關聯數組:
echo $mylink['link_id']; // prints "10"
而
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_N);
則會生成一個數值索引數組:
echo $mylink[1]; // prints "10"
選擇表列
要選擇數據庫表中的一列內容,可使用get_col函數。該函數輸出一個空間數組,如果查詢返回了多個列,函數只返回指定列,但所有返回的列都將被緩存以供日后使用。
<?php $wpdb->get_col('query',column_offset); ?>
query
(字符串)你希望執行的查詢。將該參數設為null會使函數返回上一個查詢的緩存結果中的執行表列。
column_offset
(整數)預計的數據庫表的列數(0為表中第一列)。默認值為0。
示例
在這個例子中,我們假設有一個專注於發布汽車資訊的博客,博客中每篇文章都介紹了一輛特別的汽車(如1969 Ford Mustang)。此外我們將三個自定義字段——manufacture、model和year指定給各篇文章。這里我們的目的是顯示manufacturer(生產商)為Ford的所有文章的標題,各個標題按模型和年份排列。
可以利用wpdb類的get_col形式返回一個符合要求、以正確順序排列的文章ID數組。然后通過foreach構造函數重復該文章ID數組,顯示每篇文章的標題。本示例的SQL查詢由 Andomar編寫。
<?php
$meta_key1 = 'model';
$meta_key2 = 'year';
$meta_key3 = 'manufacturer';
$meta_key3_value = 'Ford';
$postids=$wpdb->get_col($wpdb->prepare("
SELECT key3.post_id
FROM $wpdb->postmeta key3
INNER JOIN $wpdb->postmeta key1
on key1.post_id = key3.post_id
and key1.meta_key = %s
INNER JOIN $wpdb->postmeta key2
on key2.post_id = key3.post_id
and key2.meta_key = %s
WHERE key3.meta_key = %s
and key3.meta_value = %s
ORDER BY key1.meta_value, key2.meta_value",$meta_key1, $meta_key2, $meta_key3, $meta_key3_value));
if ($postids) {
echo 'List of $meta_key3_value . '(s), sorted by ' . $meta_key1 . ', ' . $meta_key2;
foreach ($postids as $id) {
$post=get_post(intval($id));
setup_postdata($post);?>
<p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
<?php
}
}
?>
選擇生成的結果
get_results可以從數據庫中抽取函數生成的多行結果。Wpdb函數以數組形式返回整個查詢結果。數組中每個元素都對應查詢結果中的一行,如get_row既可以是對象,也可以是關聯數組或數值型數組。
<?php $wpdb->get_results('query', output_type); ?>
query
(字符串)你希望執行的查詢語句。將該參數設為null會使函數返回上一個查詢的緩存結果中的信息。
output_type
三個預定義的常量之一。默認值為OBJECT。更多信息請見上文中的“選擇表行”。
- OBJECT —— 以對象形式輸出返回的結果
- ARRAY_A ——以關聯數組形式輸出返回的結果
- ARRAY_N —— 以數值索引數組形式輸出返回的結果
示例
獲取ID為5的用戶的所有文章草稿的ID和標題並回應標題。
$fivesdrafts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts
WHERE post_status = 'draft' AND post_author = 5");
foreach ($fivesdrafts as $fivesdraft) {
echo $fivesdraft->post_title;
}
獲取ID為5的用戶的所有文章草稿信息。
<?php
$fivesdrafts = $wpdb->get_results("SELECT * FROM $wpdb->posts
WHERE post_status = 'draft' AND post_author = 5");
if ($fivesdrafts) :
foreach ($fivesdrafts as $post) :
setup_postdata($post);
?>
<h2><a href="<?php the_permalink(); ?>" rel="bookmark"
title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
<?php
endforeach;
else :
?>
<h2> Not Found</h2>
<?php endif; ?>
插入表行/列
在數據庫表中插入一行/列內容。
示例
在一行中插入兩列內容,第一個列的值為字符串,第二列的值為數字:
$wpdb->insert( 'table', array( 'column1' => 'value1', 'column2' => 123 ), array( '%s', '%d' ) )
可能的值:- %s 為字符串,- %d 為十進制數字,- %f 為浮點。
更新表行/列
更新數據庫表中某行/列的內容。
示例
要更新一個表行,其ID為1,該行第一列中的值是一個字符串,第二列中的值是一個數字:
$wpdb->update( 'table', array( 'column1' => 'value1', 'column2' => 'value2' ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) )
防止數據庫查詢遭到SQL注入式攻擊
更多在WordPress中避免SQL攻擊的信息,請看數據驗證。這是WordPress代碼編寫者和插件開發者的必讀文章。
簡單地說,執行SQL查詢以阻止SQL注入式攻擊前,SQL查詢中的所有數據都需要經過SQL字符轉義。可以通過prepare方法快速完成字符轉義,該方法使用 sprintf()-like語句。
<?php $sql = $wpdb->prepare( 'query'[, value_parameter, value_parameter ... ] ); ?>
query
(字符串)你希望執行的SQL查詢,以 %s 與%d作為占位符。
value_parameter
(字符串)提交到占位符中的值。該值此時必須沒有被SQL轉義。
示例
將Meta key => value pair "Harriet's Adages" => "WordPress' database interface is like Sunday Morning: Easy."添加到ID為10的文章。
$metakey = "Harriet's Adages";
$metavalue = "WordPress' database interface is like Sunday Morning: Easy.";
$wpdb->query( $wpdb->prepare( "
INSERT INTO $wpdb->postmeta
( post_id, meta_key, meta_value )
VALUES ( %d, %s, %s )",
10, $metakey, $metavalue ) );
由add_meta()執行。
注意,這時你無須擔心引用字符串。不要直接將變量傳遞給SQL查詢,可將 %s作為字符串的占位符, %d作為整數的占位符。你可以傳遞任意個值,每一個都可以作為prepare()方法的新參數。
顯示/隱藏SQL錯誤
你可以用show_errors來顯示SQL錯誤,也可以用hide_errors隱藏SQL錯誤。
<?php $wpdb->show_errors(); ?>
<?php $wpdb->hide_errors(); ?>
同樣也可以用print_error輸出近期的查詢所生成的錯誤。
<?php $wpdb->print_error(); ?>
獲取數據庫表中某列信息
利用get_col_info可以檢索到近期查詢的表列信息。當你不了解某個函數返回的對象的屬性時,就可以通過get_col_info函數獲取信息。該函數從指定列中輸出所需信息,如果沒有指定某列,則函數輸出一個以查詢結果中所有列的信息為內容的數組。
<?php $wpdb->get_col_info('type', offset); ?>
type
(字符串)你希望檢索的信息。可能為以下任何值之一(摘自 ezSQL文檔)。默認值為name。
- name ——表列的名稱。默認值
- table ——列所屬表格的表格名稱
- max_length —— 表列的最大長度
- not_null —— 若表列不為Null則值為1
- primary_key —— 若表列是一個主鍵,值為1
- unique_key —— 若表列是唯一鍵,值為1
- multiple_key —— 若表列是非唯一鍵,值為1
- numeric —— 若表列是數值型,值為1
- blob —— 若表列為BLOB,值為1
- type —— 表列的類型
- unsigned —— 若表列無符號,值為1
- zerofill —— 若表列為zero-filled,值為1
offset
(整數)從某個檢索信息的表中指定表列(0為表中第一列)。默認值為-1。
- -1 —— 從所有表列中檢索信息。輸出一個數組。默認值。
- 非負整數 —— 從指定的表列中檢索信息(0為表中第一列)。
清除緩存
用flush清除SQL結果緩存。
<?php $wpdb->flush(); ?>
這會清除$wpdb->last_result、$wpdb->last_query以及$wpdb->col_info信息。
類變量
$show_errors
是否顯示SQL錯誤信息。默認為TRUE。
$num_queries
已經被執行的查詢次數
$last_query
最近一次已經被執行的查詢
$queries
將SAVEQUERIES常量設為TRUE(該常量默認值為FALSE),可以保存所有數據庫查詢及其停止時間。如果SAVEQUERIES值為TRUE,你的查詢會被作為數組保存在$queries變量中。
$last_result
最近一次查詢結果。
$col_info
最近一次查詢結果的表列信息。參見獲取表列信息。
$insert_id
最近一次INSERT查詢為AUTO_INCREMENT列生成的ID。
$num_rows
最近一次查詢返回的行數。
表
在wpdb類中可以引用WordPress數據庫表。
$posts
關於文章的數據庫表
$users
關於用戶的數據庫表
$comments
評論表
$links
鏈接表
$options
選項表
$postmeta
元數據(自定義字段)表
$usermate
usermeta表中含有用戶的其它信息,如昵稱、個人說明與權限。
$terms
terms表中包括對分類目錄、鏈接分類、標簽的“說明”(description)
$term_taxonomy
term_taxonomy表介紹了WordPress的不同分類(taxonomy)。分類目錄、鏈接分類、標簽都是一種分類。
$term_relationships
term_relationships表中含有術語以及使用術語的對象之間的鏈接,即該表可以指向日志所屬的分類目錄。