PHP での SQL ステートメントの準備と実行 (PDO)

変数入力を含む SQL ステートメントを準備および実行するには、PDO::preparePDOStatement::bindParam、および PDOStatement::execute メソッドを使用します。 ステートメントを準備することで、データ取り出し用に最適化されたアクセス・プランがデータベース・サーバーによって作成され、ステートメントの再実行時にこれを再利用できるため、パフォーマンスが向上します。

始める前に

PDO コンストラクターを呼び出して、接続オブジェクトを取得します。 PHP(PDO) IBMに接続するを参照してください。

プロシージャー

パラメーター・マーカーを含む SQL ステートメントを準備および実行するには、次のようにします。

  1. PDO::prepare メソッドを呼び出し、リストされた引数を渡します。
    ステートメント
    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 の方法を使用して、エラーに関する診断情報を取得することができます。

  2. オプション: SQL 文字列内の各パラメータマーカーについて、 PDOStatement::bindParam メソッドを呼び出し、リストされた引数を渡します。 入力値をパラメーター・マーカーにバインドすると、それぞれの入力値が単一のパラメーターとして扱われるため、アプリケーションに対する SQL インジェクション・アタックを防止できます。
    パラメーター (Parameter)
    パラメーターの ID。 疑問符パラメーター・マーカー (?) の場合、これは SQL ステートメント内のパラメーターの 1 から順に番号付けされた位置を表す整数です。 名前付きパラメーター・マーカー (:name) の場合、これはパラメーター名を表すストリングです。
    変数
    パラメーター・マーカーの代わりに使用する値
  3. PDOStatement::execute メソッドをコールし、オプションとして、パラメータマーカーの代わりに使用する値を含む配列を渡します。クエスチョンマークパラメータマーカーの場合は順番に、名前付きパラメータマーカーの場合は :name => value 連想配列として渡します。

    PDO APIの詳細については http://php.net/manual/en/book.pdo.php をご覧ください。

変数入力を含むステートメントを準備および実行します。

$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 メソッドを呼び出すことにより、ステートメント・リソースからの行のフェッチを開始できます。