SQL操作を安全に行うために用意されているWordpressの「$wpdb->prepare」関数。
基本的に変数はプレースホルダー 経由で渡すのですが、SQL文の中にワイルドカード『%(パーセント記号)』を使うことがあったので、エスケープ記述などの備忘録です。
関数リファレンス/wpdb Class
で、上記のページにも書いてありますが、Wordpressのプレースホルダーは、文字列が『 %s 』で、整数型は『 %d 』を使用します。
ですが『%(パーセント)』記号はオリジナルのSQL文でもワイルドカードとして使用することがあります。また、%自体を検索ワードに含めたい!ということもあるでしょう。
で、今回そういうケースが発生したので、備忘録として記述例を紹介します。
ワイルドカード検索を使用して、『Warning: Missing argument X for wpdb::prepare()』エラーが出てしまった場合も参考になるかも知れません。(Xは数字。)
■メタキーに「キーワード」を含む結果を取得したい。(前後にワイルドカード)
■『%』のエスケープは『%%』。
パーセント自体を検索ワードに含めたい場合は、出力されたSQL上で%%になるように調整すればオーケーです。
■検索ワードに%が含まれる場合
■「%キーワード」というワードを含む結果を取得したい場合。(前後にワイルドカード)
ちなみに、『$meta_key = 'キーワード';』の段階で『$meta_key = ' %キーワード'』のように%を入れておいても大丈夫です。
■参考URL
How to use wildcards in $wpdb queries using $wpdb->get_results & $wpdb->prepare?
基本的に変数はプレースホルダー 経由で渡すのですが、SQL文の中にワイルドカード『%(パーセント記号)』を使うことがあったので、エスケープ記述などの備忘録です。
WordressのSQLプレースホルダーは%sや%d形式
今回はSQLの基礎については割愛します。興味が沸いた方は、下記のリファレンスにWordpressのSQLについて詳しく載っているので参考にして下さい。関数リファレンス/wpdb Class
で、上記のページにも書いてありますが、Wordpressのプレースホルダーは、文字列が『 %s 』で、整数型は『 %d 』を使用します。
ですが『%(パーセント)』記号はオリジナルのSQL文でもワイルドカードとして使用することがあります。また、%自体を検索ワードに含めたい!ということもあるでしょう。
で、今回そういうケースが発生したので、備忘録として記述例を紹介します。
ワイルドカード検索を使用して、『Warning: Missing argument X for wpdb::prepare()』エラーが出てしまった場合も参考になるかも知れません。(Xは数字。)
『LIKE %キーワード%』等、SQL内でワイルドカードを使用したい場合
$wpdb->prepare関数で『%(パーセント記号)』は特殊記号なので、エスケープ処理をする必要があります。■メタキーに「キーワード」を含む結果を取得したい。(前後にワイルドカード)
■『%』のエスケープは『%%』。
$meta_key = 'キーワード';
$sql = $wpdb->prepare( "
SELECT *
FROM $wpdb->postmeta
WHERE meta_key LIKE %%%s%% //これで %プレースホルダー値% と認識される。
",$meta_key);
↓出力SQLSELECT * FROM wp_postmeta WHERE meta_key LIKE '%キーワード%'
パーセント自体を検索ワードに含めたい場合は、出力されたSQL上で%%になるように調整すればオーケーです。
■検索ワードに%が含まれる場合
■「%キーワード」というワードを含む結果を取得したい場合。(前後にワイルドカード)
WHERE meta_key LIKE %%%%%s%%
//SQL上では%%キーワード%と認識され%キーワードを含むワードがHITする。
ちなみに、『$meta_key = 'キーワード';』の段階で『$meta_key = ' %キーワード'』のように%を入れておいても大丈夫です。
■参考URL
How to use wildcards in $wpdb queries using $wpdb->get_results & $wpdb->prepare?
- カテゴリ:
- この記事のカテゴリ:Wordpress