ブログ
WordPressのSQLでLIKEのワイルドカードがうまく使えない件について
仕事で、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句のところで、使っている%が原因ということがわかりました。
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が実行されました。
この事象を自分のPC環境で再現しようとしましたがErrorになりませんでした。
SELECT ID FROM posts_table WHERE name LIKE “%山%”;のようなSQL文をprepare関数に渡しても、Errorにならない。
現場のWordpressは古いバージョンを使っており、どこかの時点のバージョンアップでこの問題が解決されているようです。
もしWordpressのSQLを書いていてうまくいかない場合はこちらを試してみていただければと思います。
関連記事
2024.09.30
2024.09.30
2024.04.08