LoginSignup
3
6

More than 5 years have passed since last update.

$wpdb->prepare のプレースホルダの書き方

Last updated at Posted at 2018-08-18

WordPresのDBに対して、PHPを使用してSQLを投げ、DBから値を引っ張ってきてごちゃごちゃしたかった。
ただ、PHPの変数値をSQLの中に埋め込む再に、直接以下のようにドット演算子で繋げて文字列を書くと見通しが悪くなる。

$sql = "SELECT * FROM wp_posts WHERE ID = ". $ID . ";";

また、直接変数を埋め込むのはSQLインジェクションの危険性がある。

そのため以下のようにプレースホルダを使用して書く。

    $prepared_fetch_category = $wpdb->prepare(
            "
              SELECT WPP.ID FROM wp_posts AS WPP
              INNER JOIN wp_term_relationships AS WPTR
              ON WPP.ID = WPTR.object_id
              INNER JOIN wp_term_taxonomy AS WPTT
              ON WPTR.term_taxonomy_id = WPTT.term_taxonomy_id
              INNER JOIN wp_terms AS WPT
              ON WPTT.term_id = WPT.term_id
              WHERE WPP.post_type = %s     //(='books')
              AND WPP.post_status = %s     //(='publish')
              AND WPT.slug = %s            //(= $KEY)
              ORDER BY ". $SORT_KEY. " ". $SORT_VALUE.
              "
              LIMIT %d , %d;              //(=$start_page_num, $max_page_num)
              ",
        'books', 'publish', $KEY, $start_page_num, $max_page_num
    );
// %d -> 整数
// $s -> 文字列
// $f -> 小数
// ただし%sが文字列に置換される再に値がクオートで囲まれるため、WHERE句の値では使用できるが
// 'DESC'のようにORDER句などのクオートで囲む必要の内部分で使用するとSQLが正しく処理されない。
// そのため、クオートで囲う必要のない部分はドット演算子でPHP変数を繋ぐ必要がありそう。

上記のようにプリペアードステートメントを用意してから、下記のようにget_resultsで値を取得するのが望ましいようです。

$rows = $wpdb -> get_results($prepared_fetch_category);

もっとよい記載の方法などありましたら、是非ご教授ください。

参考

関数リファレンス/wpdb Class

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6