・SQLに変数を組み込むならprepare、execute
・変数がないならSQLはqueryでもいい。基本的にprepareでOK
・パラメータ部分を示す記号「?」のことをプレースホルダと呼び、そこへ実際の値を割り当てることを「バインドする」と呼びます。
・bindValueは文字列以外の型とプレスホルダーの値を渡す(使わなくてもOK)
・prepare:入力を受け取る準備
・プレスホルダー:入力をSQL文に含める
・execute:SQL文の実行
疑問符プレスホルダー
$stmt = $pdo->prepare('SELECT * FROM users WHERE city = ? AND gender = ?');
$stmt->execute([$city, $gender]);
名前付きプレスホルダー
$stmt = $pdo->prepare('SELECT * FROM users WHERE city = :city AND gender = :gender');
$stmt->execute([':city' => $city, ':gender' => $gender]);
$stmt = $pdo->prepare('INSERT INTO users (id,title,uptime) VALUES (null,?,?)');
$params = [];
$params[] = $title;
$params[] = $uptime;
$stmt->execute($params);
バインドについて
・エミュレーションがONの時、変数は文字列型になる。PHP5.2以降のデフォルトは true
・文字列で渡したくないなら、bindValueで型指定をする
・配列で渡す場合には
・executeの引数に配列を渡すと、バインドされて、全てが文字列で渡される
・すでにバインドしていても無視されるから、引数でバインドする
静的、動的プレスホルダーについて
・PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, [true または false]);
デフォルト、true
の一文を実行するとき以外実際にどちらのプレスホルダーを使用しているのかを意識する必要はほぼない
・また、動的プレスホルダーを利用する場合でも、進んでエスケープする必要はない