在 PHP (PDO) 中準備及執行 SQL 陳述式

若要準備及執行包含變數輸入的 SQL 陳述式,請使用 PDO::preparePDOStatement::bindParamPDOStatement::execute 方法。 準備陳述式可增進效能,因為資料庫伺服器會建立資料擷取的最佳化存取計劃,如果重新執行陳述式,它可以重複使用。

開始之前

呼叫 PDO 建構子來取得連線物件。 請參閱 使用 PHP (PDO) 連接至 IBM 資料伺服器資料庫

程序

若要準備及執行包括參數標記的 SQL 陳述式,請執行下列動作:

  1. 呼叫 PDO::prepare 方法,並傳遞列出的引數:
    statement
    包含 SQL 陳述式的字串,包括問號 (?) 或具名變數 (:name) 作為需要變數輸入之任何直欄或述詞值的參數標記。 您只能使用參數標記作為直欄或述詞值的位置保留元。 SQL 編譯器無法為使用參數記號取代直欄名稱、表格名稱或其他 SQL ID 的陳述式建立存取計劃。 您無法在相同的 SQL 陳述式中同時使用問號 (?) 參數標記及具名參數標記 (:name)。
    驅動程式選項
    選用: 包含陳述式選項的陣列:
    PDO: :ATTR_CURSOR
    此選項設定 PDO 針對結果集傳回的游標類型。 依預設, PDO 會傳回僅向前游標 (PDO: :CURSOR_FWDONLY) ,這會針對每個 PDOStatement::fetch()呼叫傳回結果集中的下一列。 您可以將此參數設為 PDO: :CURSOR_SCROLL ,以要求可捲動的游標。

    如果函數呼叫成功,則它會傳回 PDOStatement 物件,您可以在與此查詢相關的後續方法呼叫中使用該物件。

    如果函數呼叫失敗 (傳回False) ,您可以使用 PDO::errorCodePDO::errorInfo 方法來擷取錯誤的診斷資訊。

  2. 選用: 針對 SQL 字串中的每一個參數標記,呼叫 PDOStatement::bindParam 方法,並傳遞列出的引數。 將輸入值連結至參數標記可確保將每一個輸入值視為單一參數,這可防止對應用程式進行 SQL 注入攻擊。
    參數
    參數 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 陳述式傳回一或多個結果集,您可以呼叫 PDOStatement::fetchPDOStatement::fetchAll 方法,開始從陳述式資源提取列。