$wpdb->prepareでSQL文を作り、ワードプレスで実行する方法を解説いたします。
$wpdb->prepareでエスケープしつつ、SQL文を作成
下記のようなSQL文は、悪意のあるハッカーによって改ざんされる脆弱性があります。
global $wpdb; $wpdb->get_results("SELECT * FROM wp_user where user_login = '".$_GET['user_login']."'");
この場合にSQL文をエスケープ処理(特定の文字列が改ざんされてもデータベースの内容を書き換えたりSQL文の意味合いを変えるのを防ぐ)してくれるのが$wpdb->prepareです。
上記のプログラムの場合下記のように書き換えられます。
global $wpdb; $sql = $wpdb->prepare("SELECT * FROM ".$wpdb->prefix."user where user_login = %s",$_GET['user_login']); $wpdb->get_results($sql);
%s は文字列として”(シングルクオーテーション)付きで文字列をエスケープして$_GET[‘user_login’]の内容と置き換えてくれます。
※ワードプレスは’%s’としてしまってもシングルクオーテーションが2重になってしまわないように処理してくれますので、’%s’と書いても問題ございません。
シングルクオーテーションを付けたくない場合
テーブル名等を指定する場合にシングルクオーテーションを付けたくない場合は、%1$sもしくは、%1sを使用します。
数字をエスケープする
数字をエスケープするには %d を使用します。(小数の場合%fを使用します)
global $wpdb; $sql = $wpdb->prepare("SELECT * FROM ".$wpdb->prefix."user where ID = %d",$_GET['ID']); $wpdb->get_results($sql);
$wpdb->get_resultsの内容を次から次に処理する
$rows = $wpdb->get_results($sql); if ($wpdb->num_rows>0){ foreach ($rows as $row) { echo $row->ID; } }
上記コードでは、get_resultsで取得したデータの数が$wpdb->num_rowsで0個以上ある場合にforeach ($rows as $row) で繰り返しデータを取得・処理しています。
ご参考になりましたら幸いです。
WordPress ワードプレスのテーマやプラグインの修正・修復・カスタマイズのご依頼・ご相談はWPドクターまでお気軽にお送りください