「PHPとデータベース - PDO」の版間の差分

ナビゲーションに移動 検索に移動
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>


案内メニュー