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

 

関連記事

  • 自宅に構築!仮想環境 ~BIG-IP VE導入編~
    【導入】 前回は、自宅サーバにProxmoxを導入しました。 今回はその上に仮想マシンとしてBIG-IP VE […]

    2024.09.30

  • 自宅に構築!仮想環境 ~Proxmox導入編~
    【導入】 以前から学習用に自宅仮想環境をつくりたく思っていたところ、BIG-IP(の仮想版)に触れる必要が出て […]

    2024.09.30

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

    2024.04.08

  • パートナー

  • 人材育成・採用情報