PHP MySQLi中的准备好的语句

示例

请阅读防止通过参数化查询进行SQL注入,以全面了解为何准备好的语句可帮助您保护SQL语句免受SQL Injection攻击

$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();
  //现在使用变量$column_1,就像其他任何PHP变量一样
  $stmt->close();
}

程序风格

if ($stmt = mysqli_prepare($conn, $sql)) {
  mysqli_stmt_bind_param($stmt, "si", $column_2_value, $column_3_value);
  mysqli_stmt_execute($stmt);
  // 在这里获取数据
  mysqli_stmt_close($stmt);
}

的第一个参数$stmt->bind_param或第二个参数mysqli_stmt_bind_param由SQL查询中相应参数的数据类型确定:

参数绑定参数的数据类型
i整数
d
s
b斑点

参数列表需要按照查询中提供的顺序进行。在此示例中si,第一个参数(column_2 = ?)是字符串,第二个参数(column_3 > ?)是整数。

有关检索数据,请参见如何从准备好的语句中获取数据。