logo-sm

お電話はこちら 03-6912-0139

ブログ

WordPressのSQLでLIKEのワイルドカードがうまく使えない件について

2022.08.11

仕事で、WordpressのSQLを作っていたところ、うまくいかない事象がありました。

WordPressからデータを取得する際にSQLを書く必要があるのか?

WordPressは基本的にはWordpressに設定されている関数である程度のDBの情報は取得できます。

しかし、細かい条件の情報を取得する場合は、SQL文を作ることが必要です。

例としてはこんな感じでWordpressの関数にSQLを渡してSQLを実行します。

$results = $wpdb->get_results(“SELECT post_title FROM $wpdb->posts”);

今回の事象

今回書いていたSQLは、ある権限をもつユーザーが作成したデータを取得するというもので、LIKE句を含んだSELECTの記述でした。

実際のものは結合など複雑なSQLのため問題箇所を簡単に書くと

SELECT ID FROM posts_table WHERE name LIKE “%山%”;

こんなSQLを渡したらERRRORになりました。

色々調べた結果SQLの中のLIKE句のところで、使っている%が原因ということがわかりました。

WordPressでSQLを使う場合は、prepare関数でSQLインジェクション対策をする

prepare関数ではプレースホルダが使用できるようで、その際に%を利用します。

prepare関数の例(プレースホルダは赤字箇所)

$sql = “SELECT * FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s“;

$query = $wpdb->prepare( $sql, 1, “PHP” );

この%とLIKEに使った%の問題でエラーになっていたようです。

解決方法

%をふたつ入れ込んであげてそれをprepare関数に渡してあげると解決。

prepare関数で『%(パーセント記号)』は特殊記号なので、エスケープ処理をする必要があります。

『%』のエスケープは『%%』のようです。

SQLの例

SELECT ID FROM posts_table WHERE name LIKE “%%山%%

このようなSQLをprepare関数に渡すと想定通りSQLが実行されました。

最新版のWordpress

この事象を自分のPC環境で再現しようとしましたがErrorになりませんでした。

SELECT ID FROM posts_table WHERE name LIKE “%山%”;のようなSQL文をprepare関数に渡しても、Errorにならない。

現場のWordpressは古いバージョンを使っており、どこかの時点のバージョンアップでこの問題が解決されているようです。

もしWordpressのSQLを書いていてうまくいかない場合はこちらを試してみていただければと思います。

 

関連記事

  • Cisco資格試験の学習法について
    2022年3月にAWS SAA資格取得の記事を書きました。その後、2022年7月にCCNP ENARSI試験を […]

    2022.09.28

  • jQueryでHTMLをパーツ化した際に読み込み箇所にJavascriptが効かない件の対処法
    jQueryでHTMLをパーツ化するための関数でloadという関数があります。 headerやfooterなど […]

    2022.08.11

  • 【最新版】git hubでサイトを公開する方法
    git hubでサイトが公開できるのでその方法を記述します。 ちょこちょこgit hubをでサイト公開を行う記 […]

    2022.08.11

  • パートナー

  • 人材育成