若要準備及執行包含變數輸入的 SQL 陳述式,請使用 db2_prepare、 db2_bind_param及 db2_execute 函數。 準備陳述式可增進效能,因為資料庫伺服器會建立資料擷取的最佳化存取計劃,如果重新執行陳述式,它可以重複使用。
程序
若要準備及執行包括參數標記的 SQL 陳述式,請執行下列動作:
- 呼叫 db2_prepare 函數,並傳遞列出的引數:
- 連線
- 從 db2_connect 或 db2_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_array、 db2_fetch_assoc、 db2_fetch_both、 db2_fetch_object或 db2_fetch_row的每一次呼叫,傳回結果集中的下一列。 您可以將此參數設為 DB2_SCROLLABLE 以要求可捲動的游標,以便 ibm_db2 提取函數接受第二個引數,指定您要在結果集內存取之列的絕對位置。
如果函數呼叫成功,則會傳回陳述式控點資源,您可以在與此查詢相關的後續函數呼叫中使用該資源。
如果函數呼叫失敗 (傳回False) ,您可以使用 db2_stmt_error 或 db2_stmt_errormsg 函數來擷取錯誤的診斷資訊。
- 選用: 針對 SQL 字串中的每一個參數標記,呼叫 db2_bind_param 函數,並傳遞列出的引數。 將輸入值連結至參數標記可確保將每一個輸入值視為單一參數,這可防止對應用程式進行 SQL 注入攻擊。
- STMT
- 對 db2_prepare 函數的呼叫所傳回的備妥陳述式。
- 參數-數字
- 代表 SQL 陳述式中參數標記的位置的整數。
- 變數名稱
- 此字串指定要連結至 parameter-number所指定參數的 PHP 變數名稱。
- 呼叫 db2_execute 函數,並傳遞列出的引數:
範例
準備並執行包含變數輸入的陳述式。
$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 陳述式傳回一或多個結果集,您可以開始從陳述式資源提取列。