[WordPress] $wpdb を使って SELECT 結果取得

WordPressSQL

WordPress には、データベースを操作するための wpdb クラスが用意されている。 wpdb クラスを通じて、データベース接続や、クエリ操作を行おう。 SQL インジェクション対策に必要なプリペアドステートメントも用意されている。

準備

wpdb クラスを使うには、グローバル変数として $wpdb を宣言する。

SQL を使うファイルに書く

// wp-load.php を読み込んでいない場合、
require_once ( dirname(__FILE__) . "/wp-load.php");
global $wpdb;

$wpdb は、 wpdb クラスのインスタンスである。 wpdb クラスのメソッドに直接アクセスしてはいけない。

プリペアドステートメント

wpdb クラスは、任意の SQL を発行する query 関数や、 updatedelete 関数を持っているが、一番よく使う(であろう)のはプレースホルダーが使える 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_authorint型 、 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;
}
ver_dumpでの出力結果

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;
}
ver_dumpでの出力結果

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'];
}
ver_dumpでの出力結果

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];
}
ver_dumpでの出力結果

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;

Posted by Agopeanuts