logo-sm

お問い合わせは Webフォームから

ブログ

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を書いていてうまくいかない場合はこちらを試してみていただければと思います。

 

関連記事

  • WindowsのWSL2上のDockerでup時に’ContainerConfig’のエラーが出た。
    当社の開発環境はMacとWindowsが混在したDocker上での開発を行っています。なのでMacでOKだけど […]

    2024.04.08

  • VSCode (内のPowerShell)でアドレス設定を切り替え!
    【経緯】 最近携わった案件で大量のNW機器のキッティングをした際、それぞれにSSHでの接続性などを確認するテス […]

    2023.10.13

  • PaloaltoでWindows NTPサーバに同期
    【事象と対処法】 オフライン環境のPaloaltoでNTPの機能確認をする必要があり、Windows標準のNT […]

    2023.10.13

  • パートナー

  • 人材育成・採用情報