[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;