説明
$wpdb->prepare() は、SQL文に値を安全に埋め込むためのメソッドです。SQLインジェクションの対策として必須です。
基本構文
$wpdb->prepare( string $query, mixed ...$args ): string|void
引数
$query:プレースホルダー付きのSQL(%s、%d、%f)...$args:埋め込む値
戻り値
安全に整形されたSQL文。
使い方(サンプル)
global $wpdb;
$sql = $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_author = %d", 1 );
注意点
- プレースホルダーに引用符は付けません。
%sが自動で引用符付きになります。 - LIKE句の値は
$wpdb->esc_like()を併用します。 - プレースホルダーがないクエリを渡すと警告が出ます。
実務での使いどころ
- ユーザー入力や、変数を含むSQLを、安全に組み立てるとき(SQLインジェクション対策)。
WHERE句に、数値や文字列の値を渡すとき。LIKE検索で、キーワードを渡すとき。
よくあるミスと対処
- 変数をSQLの文字列に直接埋め込んでいる。SQLインジェクションの原因になります。
- プレースホルダーを、引用符で囲んでいる(
'%s')。prepare()が自動で引用符を付けるため、囲みません(%1$sのような番号付きの書式は、引用符が自動では付かないため、自分で付けます)。 LIKE検索で、キーワード中の%や_をそのまま渡している。$wpdb->esc_like()を通し、前後の%は、値の側に付けます。- プレースホルダーが1つもないクエリに、
prepare()を使っている。使う意味がなく、警告の原因にもなります。
NG例
$wpdb->get_results( "SELECT * FROM {$wpdb->posts} WHERE post_title = '$title'" );
OK例
$wpdb->get_results(
$wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE post_title = %s", $title )
);
// LIKE検索の場合
$like = '%' . $wpdb->esc_like( $keyword ) . '%';
$wpdb->get_results(
$wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_title LIKE %s", $like )
);
使い分け早見表
| メソッド | 取得するもの |
|---|---|
$wpdb->get_var() |
1つの値 |
$wpdb->get_row() |
1行 |
$wpdb->get_col() |
1列(値の配列) |
$wpdb->get_results() |
複数行 |
関連項目
$wpdb->get_results()、$wpdb->esc_like()、esc_sql()、$wpdb->get_row()、$wpdb->get_var()、$wpdb->get_col()
公式リファレンス:wpdb::prepare() | Class method | WordPress Developer Resources

コメント