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

有关检索数据的信息,请参阅如何从预准备语句中获取数据