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

ナビゲーションに移動 検索に移動
344行目: 344行目:
<br>
<br>
==== PDO::executeメソッド ====
==== PDO::executeメソッド ====
PDO::prepareメソッド → PDOStatement::bindValueメソッド → PDOStatement::executeメソッドの3ステップでクエリを実行する。<br>
<code>PDO::prepare</code>メソッド <code>PDOStatement::bindValue</code>メソッド <code>PDOStatement::execute</code>メソッドの3ステップでクエリを実行する。<br>
ユーザ入力からクエリを動的に作成する場合、プリペアドステートメントとプレースホルダを使用する。<br>
ユーザ入力からクエリを動的に作成する場合、プリペアドステートメントとプレースホルダを使用する。<br>
* プレースホルダ
* プレースホルダ
350行目: 350行目:
*: プレースホルダには2種類あり、<u>疑問符プレースホルダを使用する方法</u>と<u>名前付きプレースホルダ使用する方法</u>がある。
*: プレースホルダには2種類あり、<u>疑問符プレースホルダを使用する方法</u>と<u>名前付きプレースホルダ使用する方法</u>がある。
*: これらを混ぜて使用する場合はエラーとなる。
*: これらを混ぜて使用する場合はエラーとなる。
* プリペアドステートメント:
* プリペアドステートメント
*: プレースホルダを使用するために作成する。
*: プレースホルダを使用するために作成する。
<br>
<br>
372行目: 372行目:
  $stmt->execute();
  $stmt->execute();
  </syntaxhighlight>
  </syntaxhighlight>
<br>
* 名前付きプレースホルダ
*: <code>:</code>(コロン)を先頭に付加して、半角英数字とアンダースコアにて構成する。
*: バインド時の先頭は、<code>:</code>(コロン)は省略できる。
*: エミュレーションが有効の場合、明示的なキャストが必要である。
<syntaxhighlight lang="php">
// エミュレーションが有効の場合
$stmt = $pdo->prepare('SELECT * FROM users WHERE age = :age AND gender = :gender');
$stmt->bindValue(':age', (int)$age, PDO::PARAM_INT);
$stmt->bindValue(':gender', $gender);
</syntaxhighlight>
<br>
<syntaxhighlight lang="php">
// バインド時において、先頭の:(コロン)を省略する場合
$stmt->bindValue('gender', $gender);
</syntaxhighlight>
<br>
<syntaxhighlight lang="php">
// IDが20で年齢も20歳の人を取得
$n = 20;
$stmt = $pdo->prepare('SELECT * FROM users WHERE age = :n AND id = :n');  // エミュレーションが有効の場合のみ、同名のプレースホルダを複数使用できる
$stmt->bindValue(':n', (int)$age, PDO::PARAM_INT);
$stmt->execute();
</syntaxhighlight>
<br>
なお、 値を即時にバインドせずに、変数を参照的にバインドしておき、実行時に値をバインドする<code>PDOStatement::bindParam</code>メソッドも存在するが、<br>
<code>PDOStatement::bindParam</code>メソッドを使用する必要はない。<br>
エミュレーションが有効の場合、実行後にバインドした変数が文字列型に変換する仕様もあるので、注意すること。<br>
<br><br>
<br><br>


案内メニュー