SQL操作を安全に行うために用意されているWordpressの「$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);

↓出力SQL
SELECT * 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? 
前の記事次の記事