在 PHP 中使用變數輸入來準備及執行 SQL 陳述式 (ibm_db2)

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

開始之前

在 ibm_db2 API 中呼叫其中一個連線函數,以取得連線資源。 請參閱 在 PHP 中連接至 IBM 資料伺服器資料庫 (ibm_db2)

程序

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

  1. 呼叫 db2_prepare 函數,並傳遞列出的引數:
    連線
    db2_connectdb2_pconnect 函數傳回的有效資料庫連線資源。
    statement
    包含 SQL 陳述式的字串,包括需要變數輸入之任何直欄或述詞值的問號 (?) 作為參數標記。 此字串可以包括稱為 XMLQUERY 函數的 XQuery 表示式。 您只能使用參數標記作為直欄或述詞值的位置保留元。 SQL 編譯器無法為使用參數記號取代直欄名稱、表格名稱或其他 SQL ID 的陳述式建立存取計劃。
    選項
    選用: 指定陳述式選項的聯合陣列:
    DB2_ATTR_CASE
    為了與未遵循 SQL 標準的資料庫系統相容,此選項會設定直欄名稱將傳回應用程式的大小寫。 依預設,大小寫設為 DB2_CASE_NATURAL,這會在資料庫傳回直欄名稱時傳回直欄名稱。 您可以將此參數設為 DB2_CASE_LOWER ,以將直欄名稱強制設為小寫,或設為 DB2_CASE_UPPER ,以將直欄名稱強制設為大寫。
    DB2_ATTR_CURSOR
    此選項會設定 ibm_db2 針對結果集傳回的游標類型。 依預設, ibm_db2 會傳回僅限向前游標 (DB2_FORWARD_ONLY) ,它會針對 db2_fetch_arraydb2_fetch_assocdb2_fetch_bothdb2_fetch_objectdb2_fetch_row的每一次呼叫,傳回結果集中的下一列。 您可以將此參數設為 DB2_SCROLLABLE 以要求可捲動的游標,以便 ibm_db2 提取函數接受第二個引數,指定您要在結果集內存取之列的絕對位置。

    如果函數呼叫成功,則會傳回陳述式控點資源,您可以在與此查詢相關的後續函數呼叫中使用該資源。

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

  2. 選用: 針對 SQL 字串中的每一個參數標記,呼叫 db2_bind_param 函數,並傳遞列出的引數。 將輸入值連結至參數標記可確保將每一個輸入值視為單一參數,這可防止對應用程式進行 SQL 注入攻擊。
    STMT
    db2_prepare 函數的呼叫所傳回的備妥陳述式。
    參數-數字
    代表 SQL 陳述式中參數標記的位置的整數。
    變數名稱
    此字串指定要連結至 parameter-number所指定參數的 PHP 變數名稱。
  3. 呼叫 db2_execute 函數,並傳遞列出的引數:
    STMT
    db2_prepare 函數傳回的備妥陳述式。
    參數
    選用項目: 包含要依序用來取代參數標記的值的陣列。

    如需 ibm_db2 API 的相關資訊,請參閱 http://www.php.net/docs.php

範例

準備並執行包含變數輸入的陳述式。

$sql = "SELECT firstnme, lastname FROM employee WHERE bonus > ? AND bonus < ?";
$stmt = db2_prepare($conn, $sql);
if (!$stmt) {
  // Handle errors
}

// Explicitly bind parameters
db2_bind_param($stmt, 1, $_POST['lower']);
db2_bind_param($stmt, 2, $_POST['upper']);

db2_execute($stmt);
// Process results

// Invoke prepared statement again using dynamically bound parameters
db2_execute($stmt, array($_POST['lower'], $_POST['upper']));

下一步

如果 SQL 陳述式傳回一或多個結果集,您可以開始從陳述式資源提取列。