MySQLi 中的準備語句

請閱讀使用引數化查詢防止 SQL 注入, 以全面討論為什麼預準備語句可幫助你保護 SQL 語句免受 SQL 注入攻擊的影響

這裡的 $conn 變數是一個 MySQLi 物件。有關更多詳細資訊,請參閱 MySQLi connect 示例

對於這兩個例子,我們假設 $sql

$sql = "SELECT column_1 
    FROM table 
    WHERE column_2 = ? 
        AND column_3 > ?";

? 代表我們稍後將提供的值。請注意,無論型別如何,我們都不需要佔位符的引號。我們也只能在查詢的資料部分提供佔位符,意思是 SETVALUESWHERE。你不能在 SELECTFROM 部分使用佔位符。

物件導向的風格

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 > ? 是整數。

有關檢索資料的資訊,請參閱如何從預準備語句中獲取資料