wordpress提供了一系列用于數(shù)據(jù)庫(kù)操作的函數(shù)類 $wpdb,此類是一個(gè)全局變量,每次使用時(shí)都需要先global $wpdb。
執(zhí)行數(shù)據(jù)庫(kù)查詢
你可以通過(guò)query函數(shù)在WordPress數(shù)據(jù)庫(kù)中執(zhí)行任何SQL查詢。不過(guò)我們推薦為SELECT查詢使用更為具體的函數(shù)。
query(‘query’); ?>
query
(字符串)你希望執(zhí)行的SQL語(yǔ)句。
函數(shù)返回一個(gè)與選定內(nèi)容的行數(shù)相應(yīng)的整數(shù)。如果發(fā)生MySQL錯(cuò)誤,函數(shù)返回FALSE。(注意:0和FALSE都可能被返回,確保使用正確的比較運(yùn)算符:equality == vs. identicality ===)。
注意:使用wpdb類中所有可執(zhí)行SQL查詢的函數(shù)時(shí),都需要將所有輸入內(nèi)容/inputs進(jìn)行字符轉(zhuǎn)義(如wpdb->escape($user_entered_data_string))。見(jiàn)下文。
刪除ID為13的文章的“gargle”元關(guān)鍵字和值。
$wpdb->query(”DELETE FROM $wpdb->postmeta WHERE post_id = ’13’AND meta_key = ‘gargle’”);
由delete_post_meta執(zhí)行。
將頁(yè)面7設(shè)為頁(yè)面15的父級(jí)。
$wpdb->query(”UPDATE $wpdb->posts SET post_parent = 7WHERE ID = 15 AND post_status = ‘static’”);
選擇一個(gè)變量
get_var函數(shù)返回一個(gè)來(lái)自數(shù)據(jù)庫(kù)的變量。雖然只返回一個(gè)變量,但查詢結(jié)果會(huì)被整體緩存,供后期使用。如果沒(méi)有查詢結(jié)果,返回NULL。
get_var(‘query’,column_offset,row_offset); ?>
query
(字符串)你希望執(zhí)行的查詢。將該參數(shù)設(shè)為null會(huì)使函數(shù)返回上一個(gè)查詢緩存結(jié)果中的具體變量。
column_offset
(整數(shù))預(yù)計(jì)的數(shù)據(jù)庫(kù)表的列數(shù)(0為表中第一列)。默認(rèn)值為0。
row_offset
(整數(shù))預(yù)計(jì)的數(shù)據(jù)庫(kù)表的行數(shù)(0為表中第一行)。默認(rèn)值為0。
示例
檢索并返回用戶數(shù)量。
get_var($wpdb->prepare(“SELECT COUNT(*) FROM $wpdb->users;”));echo ‘
User count is ‘ . $user_count . ‘
’;?>
檢索并返回自定義字段值得總數(shù)。
get_var($wpdb->prepare(“SELECT sum(meta_value) FROM $wpdb->postmeta WHERE meta_key = %s”, $meta_key));echo ‘
Total miles is ‘.$allmiles . ‘
’;?>
選擇表行
從某個(gè)查詢中檢索一整行內(nèi)容,可使用get_row函數(shù)。該函數(shù)可將行作為對(duì)象、關(guān)聯(lián)數(shù)組或數(shù)值索引數(shù)組返回。如果查詢返回了多個(gè)行,函數(shù)只返回指定行,但所有返回的行都將被緩存以供日后使用。
get_row(‘query’, output_type, row_offset); ?>
query
(字符串)你希望執(zhí)行的查詢語(yǔ)句。
output_type
三個(gè)預(yù)定義的常量之一。默認(rèn)值為OBJECT。
OBJECT —— 返回的結(jié)果以對(duì)象形式輸出ARRAY_A ——返回的結(jié)果以關(guān)聯(lián)數(shù)組形式輸出ARRAY_N —— 返回的結(jié)果以數(shù)值索引數(shù)組形式輸出row_offset
(整數(shù))預(yù)計(jì)的數(shù)據(jù)庫(kù)表的行數(shù)(0為表中第一行)。默認(rèn)值為0。
示例
獲取ID為10的鏈接的所有資料。
$mylink = $wpdb->get_row(“SELECT * FROM $wpdb->links WHERE link_id = 10”);$mylink對(duì)象的屬性即SQL查詢結(jié)果的行名稱(在該例中,即 $wpdb->links表中的所有行)。
echo $mylink->link_id; // prints “10”使用
$mylink = $wpdb->get_row(“SELECT * FROM $wpdb->links WHERE link_id = 10”, ARRAY_A);則會(huì)生成一個(gè)關(guān)聯(lián)數(shù)組:
echo $mylink[‘link_id’]; // prints “10”而
$mylink = $wpdb->get_row(“SELECT * FROM $wpdb->links WHERE link_id = 10”, ARRAY_N);則會(huì)生成一個(gè)數(shù)值索引數(shù)組:
echo $mylink[1]; // prints “10”
選擇表列
要選擇數(shù)據(jù)庫(kù)表中的一列內(nèi)容,可使用get_col函數(shù)。該函數(shù)輸出一個(gè)空間數(shù)組,如果查詢返回了多個(gè)列,函數(shù)只返回指定列,但所有返回的列都將被緩存以供日后使用。
get_col(‘query’,column_offset); ?>
query
(字符串)你希望執(zhí)行的查詢。將該參數(shù)設(shè)為null會(huì)使函數(shù)返回上一個(gè)查詢的緩存結(jié)果中的執(zhí)行表列。
column_offset
(整數(shù))預(yù)計(jì)的數(shù)據(jù)庫(kù)表的列數(shù)(0為表中第一列)。默認(rèn)值為0。
示例
在這個(gè)例子中,我們假設(shè)有一個(gè)專注于發(fā)布汽車資訊的博客,博客中每篇文章都介紹了一輛特別的汽車(如1969 Ford Mustang)。此外我們將三個(gè)自定義字段——manufacture、model和year指定給各篇文章。這里我們的目的是顯示manufacturer(生產(chǎn)商)為Ford的所有文章的標(biāo)題,各個(gè)標(biāo)題按模型和年份排列。
可以利用wpdb類的get_col形式返回一個(gè)符合要求、以正確順序排列的文章ID數(shù)組。然后通過(guò)foreach構(gòu)造函數(shù)重復(fù)該文章ID數(shù)組,顯示每篇文章的標(biāo)題。本示例的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_idFROM $wpdb->postmeta key3INNER JOIN $wpdb->postmeta key1on key1.post_id = key3.post_idand key1.meta_key = %sINNER JOIN $wpdb->postmeta key2on key2.post_id = key3.post_idand key2.meta_key = %sWHERE key3.meta_key = %sand key3.meta_value = %sORDER 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);?>
” rel=”bookmark” title=”Permanent Link to ”>
選擇生成的結(jié)果
get_results可以從數(shù)據(jù)庫(kù)中抽取函數(shù)生成的多行結(jié)果。Wpdb函數(shù)以數(shù)組形式返回整個(gè)查詢結(jié)果。數(shù)組中每個(gè)元素都對(duì)應(yīng)查詢結(jié)果中的一行,如get_row既可以是對(duì)象,也可以是關(guān)聯(lián)數(shù)組或數(shù)值型數(shù)組。
get_results(‘query’, output_type); ?>
query
(字符串)你希望執(zhí)行的查詢語(yǔ)句。將該參數(shù)設(shè)為null會(huì)使函數(shù)返回上一個(gè)查詢的緩存結(jié)果中的信息。
output_type
三個(gè)預(yù)定義的常量之一。默認(rèn)值為OBJECT。更多信息請(qǐng)見(jiàn)上文中的“選擇表行”。
OBJECT —— 以對(duì)象形式輸出返回的結(jié)果ARRAY_A ——以關(guān)聯(lián)數(shù)組形式輸出返回的結(jié)果ARRAY_N —— 以數(shù)值索引數(shù)組形式輸出返回的結(jié)果示例
獲取ID為5的用戶的所有文章草稿的ID和標(biāo)題并回應(yīng)標(biāo)題。
$fivesdrafts = $wpdb->get_results(“SELECT ID, post_title FROM $wpdb->postsWHERE post_status = ‘draft’ AND post_author = 5”);
foreach ($fivesdrafts as $fivesdraft) {echo $fivesdraft->post_title;}
獲取ID為5的用戶的所有文章草稿信息。
get_results(“SELECT * FROM $wpdb->postsWHERE post_status = ‘draft’ AND post_author = 5″);if ($fivesdrafts) :foreach ($fivesdrafts as $post) :setup_postdata($post);?>
” rel=”bookmark”title=”Permanent Link to ”>
Not Found
插入表行/列
在數(shù)據(jù)庫(kù)表中插入一行/列內(nèi)容。
示例
在一行中插入兩列內(nèi)容,第一個(gè)列的值為字符串,第二列的值為數(shù)字:
$wpdb->insert( ‘table’, array( ‘column1’ => ‘value1’, ‘column2’ => 123 ), array( ‘%s’, ‘%d’ ) )可能的值:- %s 為字符串,- %d 為十進(jìn)制數(shù)字,- %f 為浮點(diǎn)。
更新表行/列
更新數(shù)據(jù)庫(kù)表中某行/列的內(nèi)容。
示例
要更新一個(gè)表行,其ID為1,該行第一列中的值是一個(gè)字符串,第二列中的值是一個(gè)數(shù)字:
$wpdb->update( ‘table’, array( ‘column1’ => ‘value1’, ‘column2’ => ‘value2’ ), array( ‘ID’ => 1 ), array( ‘%s’, ‘%d’ ), array( ‘%d’ ) )防止數(shù)據(jù)庫(kù)查詢?cè)獾絊QL注入式攻擊更多在WordPress中避免SQL攻擊的信息,請(qǐng)看數(shù)據(jù)驗(yàn)證。這是WordPress代碼編寫者和插件開發(fā)者的必讀文章。
簡(jiǎn)單地說(shuō),執(zhí)行SQL查詢以阻止SQL注入式攻擊前,SQL查詢中的所有數(shù)據(jù)都需要經(jīng)過(guò)SQL字符轉(zhuǎn)義??梢酝ㄟ^(guò)prepare方法快速完成字符轉(zhuǎn)義,該方法使用 sprintf()-like語(yǔ)句。
prepare( ‘query'[, value_parameter, value_parameter … ] ); ?>
query
(字符串)你希望執(zhí)行的SQL查詢,以 %s 與%d作為占位符。
value_parameter
(字符串)提交到占位符中的值。該值此時(shí)必須沒(méi)有被SQL轉(zhuǎn)義。
示例
將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()執(zhí)行。
注意,這時(shí)你無(wú)須擔(dān)心引用字符串。不要直接將變量傳遞給SQL查詢,可將 %s作為字符串的占位符, %d作為整數(shù)的占位符。你可以傳遞任意個(gè)值,每一個(gè)都可以作為prepare()方法的新參數(shù)。
顯示/隱藏SQL錯(cuò)誤
你可以用show_errors來(lái)顯示SQL錯(cuò)誤,也可以用hide_errors隱藏SQL錯(cuò)誤。
show_errors(); ?>hide_errors(); ?>
同樣也可以用print_error輸出近期的查詢所生成的錯(cuò)誤。
print_error(); ?>
獲取數(shù)據(jù)庫(kù)表中某列信息利用get_col_info可以檢索到近期查詢的表列信息。當(dāng)你不了解某個(gè)函數(shù)返回的對(duì)象的屬性時(shí),就可以通過(guò)get_col_info函數(shù)獲取信息。該函數(shù)從指定列中輸出所需信息,如果沒(méi)有指定某列,則函數(shù)輸出一個(gè)以查詢結(jié)果中所有列的信息為內(nèi)容的數(shù)組。
get_col_info(‘type’, offset); ?>
type
(字符串)你希望檢索的信息。可能為以下任何值之一(摘自 ezSQL文檔)。默認(rèn)值為name。
name ——表列的名稱。默認(rèn)值table ——列所屬表格的表格名稱max_length —— 表列的最大長(zhǎng)度not_null —— 若表列不為Null則值為1primary_key —— 若表列是一個(gè)主鍵,值為1unique_key —— 若表列是唯一鍵,值為1multiple_key —— 若表列是非唯一鍵,值為1numeric —— 若表列是數(shù)值型,值為1blob —— 若表列為BLOB,值為1type —— 表列的類型unsigned —— 若表列無(wú)符號(hào),值為1zerofill —— 若表列為zero-filled,值為1offset
(整數(shù))從某個(gè)檢索信息的表中指定表列(0為表中第一列)。默認(rèn)值為-1。
-1 —— 從所有表列中檢索信息。輸出一個(gè)數(shù)組。默認(rèn)值。非負(fù)整數(shù) —— 從指定的表列中檢索信息(0為表中第一列)。
清除緩存
用flush清除SQL結(jié)果緩存。
flush(); ?>
這會(huì)清除$wpdb->last_result、$wpdb->last_query以及$wpdb->col_info信息。
類變量$show_errors
是否顯示SQL錯(cuò)誤信息。默認(rèn)為TRUE。
$num_queries
已經(jīng)被執(zhí)行的查詢次數(shù)
$last_query
最近一次已經(jīng)被執(zhí)行的查詢
$queries
將SAVEQUERIES常量設(shè)為TRUE(該常量默認(rèn)值為FALSE),可以保存所有數(shù)據(jù)庫(kù)查詢及其停止時(shí)間。如果SAVEQUERIES值為TRUE,你的查詢會(huì)被作為數(shù)組保存在$queries變量中。
$last_result
最近一次查詢結(jié)果。
$col_info
最近一次查詢結(jié)果的表列信息。參見(jiàn)獲取表列信息。
$insert_id
最近一次INSERT查詢?yōu)锳UTO_INCREMENT列生成的ID。
$num_rows
最近一次查詢返回的行數(shù)。
表在wpdb類中可以引用WordPress數(shù)據(jù)庫(kù)表。
$posts
關(guān)于文章的數(shù)據(jù)庫(kù)表
$users
關(guān)于用戶的數(shù)據(jù)庫(kù)表
$comments
評(píng)論表
$links
鏈接表
$options
選項(xiàng)表
$postmeta
元數(shù)據(jù)(自定義字段)表
$usermate
usermeta表中含有用戶的其它信息,如昵稱、個(gè)人說(shuō)明與權(quán)限。
$terms
terms表中包括對(duì)分類目錄、鏈接分類、標(biāo)簽的“說(shuō)明”(description)
$term_taxonomy
term_taxonomy表介紹了WordPress的不同分類(taxonomy)。分類目錄、鏈接分類、標(biāo)簽都是一種分類。
$term_relationships
term_relationships表中含有術(shù)語(yǔ)以及使用術(shù)語(yǔ)的對(duì)象之間的鏈接,即該表可以指向日志所屬的分類目錄。