変数入力を含む SQL ステートメントを準備および実行するには、PDO::prepare、PDOStatement::bindParam、および PDOStatement::execute メソッドを使用します。 ステートメントを準備することで、データ取り出し用に最適化されたアクセス・プランがデータベース・サーバーによって作成され、ステートメントの再実行時にこれを再利用できるため、パフォーマンスが向上します。
プロシージャー
パラメーター・マーカーを含む SQL ステートメントを準備および実行するには、次のようにします。
- PDO::prepare メソッドを呼び出して、リストされた引数を渡します。
- statement
- SQL ステートメントを含むストリング (変数入力を必要とする列値または述部値のパラメーター・マーカーとして疑問符 (?) または名前付き変数 (
:name
) を含む)。 パラメーター・マーカーは、列の値または述部の値のプレースホルダーとしてのみ使用できます。 列名、表名、その他の SQL ID の代わりにパラメーター・マーカーを使用するステートメントについては、SQL コンパイラーでアクセス・プランを作成することはできません。 疑問符 (?) パラメーター・マーカーと名前付きパラメーター・マーカー (:name
) の両方を同じ SQL ステートメントで使用することはできません。
- ドライバー・オプション
- オプション: 次のようなステートメント・オプションを格納する配列。
- PDO::ATTR_CURSOR
- このオプションは、PDO が結果セットに戻すカーソルの型を設定します。 デフォルトでは、PDO は前方スクロール・カーソル (PDO::CURSOR_FWDONLY) を戻します。
これにより、
PDOStatement::fetch()
の各呼び出しに対する、結果セット内の次の行が戻されます。 両方向スクロール・カーソルを要求するには、このパラメーターを PDO::CURSOR_SCROLL に設定できます。
関数呼び出しが成功した場合、PDOStatement オブジェクトが戻され、この照会に関連した後続のメソッド呼び出しでこれを使用することができます。
関数呼び出しが失敗した場合 (戻ります)False)。 PDO::errorCode または PDO::errorInfo メソッドを使用して、エラーに関する診断情報を取得できます。
- オプション: SQL ストリング内のパラメーター・マーカーごとに、 PDOStatement::bindParam メソッドを呼び出して、リストされた引数を渡します。 入力値をパラメーター・マーカーにバインドすると、それぞれの入力値が単一のパラメーターとして扱われるため、アプリケーションに対する SQL インジェクション・アタックを防止できます。
- パラメーター (Parameter)
- パラメーターの ID。 疑問符パラメーター・マーカー (?) の場合、これは SQL ステートメント内のパラメーターの 1 から順に番号付けされた位置を表す整数です。 名前付きパラメーター・マーカー (
:name
) の場合、これはパラメーター名を表すストリングです。
- 変数
- パラメーター・マーカーの代わりに使用する値
- PDOStatement::execute メソッドを呼び出します。オプションで、パラメーター・マーカーの代わりに使用する値を含む配列を、疑問符 (?) のパラメーター・マーカーの順序で渡すか、名前付きパラメーター・マーカーの
:name => value
連想配列として渡します。
例
変数入力を含むステートメントを準備および実行します。
$sql = "SELECT firstnme, lastname FROM employee WHERE bonus > ? AND bonus < ?";
$stmt = $conn->prepare($sql);
if (!$stmt) {
// Handle errors
}
// Explicitly bind parameters
$stmt->bindParam(1, $_POST['lower']);
$stmt->bindParam(2, $_POST['upper']);
$stmt->execute($stmt);
// Invoke statement again using dynamically bound parameters
$stmt->execute($stmt, array($_POST['lower'], $_POST['upper']));
次の作業
SQL ステートメントが 1 つ以上の結果セットを戻す場合、PDOStatement::fetch または PDOStatement::fetchAll メソッドを呼び出すことにより、ステートメント・リソースからの行のフェッチを開始できます。