MySQLi 中的準備語句
請閱讀使用引數化查詢防止 SQL 注入, 以全面討論為什麼預準備語句可幫助你保護 SQL 語句免受 SQL 注入攻擊的影響
這裡的 $conn
變數是一個 MySQLi 物件。有關更多詳細資訊,請參閱 MySQLi connect 示例 。
對於這兩個例子,我們假設 $sql
是
$sql = "SELECT column_1
FROM table
WHERE column_2 = ?
AND column_3 > ?";
?
代表我們稍後將提供的值。請注意,無論型別如何,我們都不需要佔位符的引號。我們也只能在查詢的資料部分提供佔位符,意思是 SET
,VALUES
和 WHERE
。你不能在 SELECT
或 FROM
部分使用佔位符。
物件導向的風格
if ($stmt = $conn->prepare($sql)) {
$stmt->bind_param("si", $column_2_value, $column_3_value);
$stmt->execute();
$stmt->bind_result($column_1);
$stmt->fetch();
//Now use variable $column_1 one as if it were any other PHP variable
$stmt->close();
}
程式風格
if ($stmt = mysqli_prepare($conn, $sql)) {
mysqli_stmt_bind_param($stmt, "si", $column_2_value, $column_3_value);
mysqli_stmt_execute($stmt);
// Fetch data here
mysqli_stmt_close($stmt);
}
$stmt->bind_param
的第一個引數或 mysqli_stmt_bind_param
的第二個引數由 SQL 查詢中相應引數的資料型別決定:
引數 | 繫結引數的資料型別 |
---|---|
i |
整數 |
d |
double |
s |
字串 |
b |
BLOB |
你的引數列表必須符合查詢中提供的順序。在這個例子中,si
表示第一個引數 (column_2 = ?
) 是字串,第二個引數 (column_3 > ?
) 是整數。
有關檢索資料的資訊,請參閱如何從預準備語句中獲取資料