$wpdb->prepare() の使い方|説明・引数・注意点

説明

$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

コメント

タイトルとURLをコピーしました