[WordPress] $wpdb を使って SELECT 結果取得
WordPress には、データベースを操作するための wpdb クラスが用意されている。 wpdb クラスを通じて、データベース接続や、クエリ操作を行おう。 SQL インジェクション対策に必要なプリペアドステートメントも用意されている。
準備
wpdb クラスを使うには、グローバル変数として $wpdb を宣言する。
// wp-load.php を読み込んでいない場合、
require_once ( dirname(__FILE__) . "/wp-load.php");
global $wpdb;
$wpdb は、 wpdb クラスのインスタンスである。 wpdb クラスのメソッドに直接アクセスしてはいけない。
プリペアドステートメント
wpdb クラスは、任意の SQL を発行する query 関数や、 update 、 delete 関数を持っているが、一番よく使う(であろう)のはプレースホルダーが使える prepare 関数。
(プレースホルダは、 SQL インジェクション攻撃の対策として用いられる。プレースホルダとして指定された文字列(値)は、 SQL エスケープされ、SQL 文の中で値としてのみ扱われる。)
$wpdb->prepare( $query, $value_parameter[, $value_parameter ... ] );引数の説明
$query : SQL クエリ。 %s (文字列), %d (整数), %f (浮動小数点数)がプレースホルダーになる。$value_parameter : プレースホルダーへ代入する値。
$query = "SELECT * FROM $wpdb->posts WHERE post_author = %d AND post_type = %s";
$results = $wpdb->get_results( $wpdb->prepare( $query, 1, $type ) );
foreach($results as $row) {
$id = $row->ID;
$title = $row->post_title;
}
WHERE 句に指定した post_author は int型 、 post_type は varchar型 なので、 WHERE post_author = %d AND post_type = %s となる。
$wpdb->prepare の第二引数以降に、 %d と %s に入いる値を指定した。
$wpdb->prepare() は、SELECT した結果を取得の項にある結果を取得する関数とともに使用する( SELECT の場合)。この例では、取得結果が複数県になるため、$wpdb->get_results を使っている。
%d , %f , %s はいずれもクォートで囲まない。 %s は、クエリ組み立て時に wpdb が値(文字列)をクオートで勝手に囲んでくれる。
SELECT した結果を取得
WHERE 句使わないとか外部からの入力値を使わないとか、プレースホルダーが必要ない場合は、 prepare 関数を使わないで、結果を取得する関数の第一引数に、そのままクエリを渡すこともできる。
複数件の結果を取得
$wpdb->get_results( $query, $output_type );引数の説明
$query : SQL 文。$output_type : 結果をどんな配列(以下 4 つのいずれか)で受け取るか指定する。初期値は OBJECT- OBJECT – 結果をインデックス配列として出力。要素は行オブジェクト。
- OBJECT_K – 結果を連想配列として出力。第1カラムの値をキー(重複は無視される)、行オブジェクトを値とする。
- ARRAY_A – 結果をインデックス配列として出力。要素は1行を表す連想配列で、そのキーはカラム名。
- ARRAY_N – 結果をインデックス配列として出力。要素は1行を表すインデックス配列。
1 行も見つからないか、データベースエラーが発生した場合、戻り値は空の配列
$query が空文字列であるか、無効な $output_type を指定すると、戻り値は NULL
OBJECTの使い方
$result = $wpdb->get_results("SELECT * FROM $wpdb->terms");
foreach($result as $row) {
$name = $row->name;
}
array(2) {
[0]=>
object(stdClass)#463 (4) {
["term_id"]=>
string(1) "1"
["name"]=>
string(9) "未分類"
["slug"]=>
string(27) "%e6%9c%aa%e5%88%86%e9%a1%9e"
["term_group"]=>
string(1) "0"
}
[1]=>
object(stdClass)#4770 (4) {
["term_id"]=>
string(1) "2"
["name"]=>
string(15) "東南アジア"
["slug"]=>
string(14) "southeast-asia"
["term_group"]=>
string(1) "0"
}
}
OBJECT_Kの使い方
$result = $wpdb->get_results("SELECT * FROM $wpdb->terms", OBJECT_K);
foreach($result as $row) {
$name = $row->name;
}
array(2) {
[1]=>
object(stdClass)#4892 (4) {
["term_id"]=>
string(1) "1"
["name"]=>
string(9) "未分類"
["slug"]=>
string(27) "%e6%9c%aa%e5%88%86%e9%a1%9e"
["term_group"]=>
string(1) "0"
}
[2]=>
object(stdClass)#4893 (4) {
["term_id"]=>
string(1) "2"
["name"]=>
string(15) "東南アジア"
["slug"]=>
string(14) "southeast-asia"
["term_group"]=>
string(1) "0"
}
}ARRAY_Aの使い方
$result = $wpdb->get_results("SELECT * FROM $wpdb->terms", ARRAY_A);
foreach($result as $row) {
$name = $row['name'];
}
array(2) {
[0]=>
array(4) {
["term_id"]=>
string(1) "1"
["name"]=>
string(9) "未分類"
["slug"]=>
string(27) "%e6%9c%aa%e5%88%86%e9%a1%9e"
["term_group"]=>
string(1) "0"
}
[1]=>
array(4) {
["term_id"]=>
string(1) "2"
["name"]=>
string(15) "東南アジア"
["slug"]=>
string(14) "southeast-asia"
["term_group"]=>
string(1) "0"
}
}ARRAY_Nの使い方
$result = $wpdb->get_results("SELECT * FROM $wpdb->terms", ARRAY_N );
foreach($result as $row) {
$name = $row[1];
}
array(2) {
[0]=>
array(4) {
[0]=>
string(1) "1"
[1]=>
string(9) "未分類"
[2]=>
string(27) "%e6%9c%aa%e5%88%86%e9%a1%9e"
[3]=>
string(1) "0"
}
[1]=>
array(4) {
[0]=>
string(1) "2"
[1]=>
string(15) "東南アジア"
[2]=>
string(14) "southeast-asia"
[3]=>
string(1) "0"
}
}1件取得
$wpdb->get_row( $query, $output_type, $row_offset );
引数の説明
$query : SQL 文。$output_type : 結果をどんな配列(以下 3 つのいずれか)で受け取るか指定する。初期値は OBJECT- OBJECT – 結果をオブジェクトとして出力。
- ARRAY_A – 結果を連想配列として出力。
- ARRAY_N – 結果をインデックス配列として出力。
マッチする行がなければ NULL を返す。
OBJECT
$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE ID = 1");
echo $user->display_name;
ARRAY_A
$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE ID = 1", ARRAY_A);
echo $user['display_name'];
ARRAY_A
$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE ID = 1", ARRAY_N);
echo $user[9];
結果が値1つだけ
count(*) とか、特定の ID で絞った特定のフィールド値を取得するときとか、値が 1 つしか返ってこないときに使う。
$wpdb->get_var( $query, $column_offset, $row_offset );
引数の説明
$query : SQL 文。NULL にすると、キャッシュされた前回の結果から指定した値が返ってくる。$column_offset : 必要としている列のオフセット(整数) 初期値は 0。
$row_offset : 必要としている行のオフセット(整数) 初期値は 0。
マッチする値がなければ NULL を返す。
$count = $wpdb->get_var("SELECT count(*) FROM my_table");
echo $count;
特定の列を取得
例えば、wp_posts テーブルから、タイトル一覧を取得したいときとか。
$wpdb->get_col( $query, $column_offset );
引数の説明
$query : SQL 文。NULL にすると、キャッシュされた前回の結果から指定した値が返ってくる。$column_offset : 必要としている列のオフセット(整数) 初期値は 0。
$titles = $wpdb->get_col( "SELECT post_title FROM $wpdb->posts" );
foreach ( $titles as $title ) {
echo $title;
}
結果の件数を取得
検索して返ってきた行数を取得する。
$wpdb->get_results( $query );
$num = $wpdb->num_rows;