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 > ?
) 是整数。
有关检索数据的信息,请参阅如何从预准备语句中获取数据