我终于弄清楚了如何使用数组元素作为 WHERE 子句的一部分,但现在我不确定以下查询是否受到 SQL 注入保护。
$elements = ( implode ( "', '", $array ) );
if ( $stmt = $mysqli -> prepare ( "SELECT * FROM config_errors WHERE error_assoc_id IN ('$elements') AND row_type = ?" ) ) {
$row_type = "some_value";
$stmt -> bind_param ( "s", $row_type );
...
}
老实说,我在这方面非常缺乏。感谢您的任何建议。
编辑(@Wing连)这不是重要的事情,但$array
是在另一个语句中创建的:
$array = array();
if ( $stmt = $mysqli -> prepare ( "SELECT * FROM config_errors WHERE row_type = ? AND error_type = ?" ) ) {
bind params
execution of the query and the result
mysqli_num_rows condition
while $row loop
value (characters) conditions
array_push ( $array, $row['value'] );
}
假设数组是从某种形式的输入创建的。
由于您使用的是 prepare 语句,因此您的应用程序将受到 SQL 注入保护。
截至 PHP 文档:
预准备语句的参数不需要用引号引起来;驱动程序会自动处理此问题。如果应用程序只使用预准备语句,开发人员可以确保不会发生 SQL 注入(但是,如果使用未转义的输入构建查询的其他部分,则仍然可以进行 SQL 注入)。
文档的其余部分
不幸的是,
如果$array
中的任何内容来自您在 WHERE IN ()
语句中使用的任何形式的请求输入,则无法防止 SQL 注入。请参阅我可以将数组绑定到 IN() 条件吗?关于如何正确绑定 IN 条件的参数。