12,964
回編集
370行目: | 370行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== PDO::executeメソッド ==== | ==== PDO::executeメソッド(3ステップ) ==== | ||
<code>PDO::prepare</code>メソッド → <code>PDOStatement::bindValue</code>メソッド → <code>PDOStatement::execute</code>メソッドの3ステップでクエリを実行する。<br> | <code>PDO::prepare</code>メソッド → <code>PDOStatement::bindValue</code>メソッド → <code>PDOStatement::execute</code>メソッドの3ステップでクエリを実行する。<br> | ||
ユーザ入力からクエリを動的に作成する場合、プリペアドステートメントとプレースホルダを使用する。<br> | ユーザ入力からクエリを動的に作成する場合、プリペアドステートメントとプレースホルダを使用する。<br> | ||
427行目: | 427行目: | ||
<code>PDOStatement::bindParam</code>メソッドを使用する必要はない。<br> | <code>PDOStatement::bindParam</code>メソッドを使用する必要はない。<br> | ||
エミュレーションが有効の場合、実行後にバインドした変数が文字列型に変換する仕様もあるので、注意すること。<br> | エミュレーションが有効の場合、実行後にバインドした変数が文字列型に変換する仕様もあるので、注意すること。<br> | ||
<br> | |||
==== PDO::executeメソッド(2ステップ) ==== | |||
<code>PDO::prepare</code>メソッド → <code>PDOStatement::execute</code>メソッドの2ステップでクエリを実行する。<br> | |||
<code>PDOStatement::execute</code>メソッドの引数に配列を渡す場合、それらを全てバインドした後そのままクエリが実行される。<br> | |||
<br> | |||
ただし、以下の条件に注意すること。<br> | |||
<u>NULL値以外は全て<code>PDO::PARAM_STR</code>扱いになる。</u><br> | |||
もし、間違った型でバインドする場合はMySQL / SQLiteはデータベース側で自動的にキャストし直すが、<br> | |||
パフォーマンスの低下やバグの原因になるため、可能な限り避けること。(PostgreSQLの場合はエラーになる)<br> | |||
<br> | |||
また、既に<code>PDOStatement::bindValue</code>メソッドで値がバインドされている場合でも、それらは全て無視される。<br> | |||
これを用いる場合、全てのバインドをこの引数で行わなければならない。<br> | |||
<br> | |||
* 疑問符プレースホルダ | |||
*: <code>PDOStatement::bindValue</code>メソッドとは異なり、<code>?</code>のインデックスは0から始まる。 | |||
<syntaxhighlight lang="php"> | |||
$stmt = $pdo->prepare('SELECT * FROM users WHERE city = ? AND gender = ?'); | |||
$stmt->execute([$city, $gender]); | |||
// キーを設定して順番を変えて指定することもできる | |||
$stmt->execute([1 => $gender, 0 => $city]); | |||
</syntaxhighlight> | |||
<br> | |||
* 名前付きプレースホルダ | |||
<syntaxhighlight lang="php"> | |||
$stmt = $pdo->prepare('SELECT * FROM users WHERE city = :city AND gender = :gender'); | |||
$stmt->execute([':city' => $city, ':gender' => $gender]); | |||
// 先頭のコロンは省略できる | |||
$stmt->execute(['city' => $city, 'gender' => $gender]); | |||
// compact関数を使用する場合 | |||
$stmt->execute(compact('city', 'gender')); | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||