$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ドクターまでお気軽にお送りください