我终于想出了如何使用数组元素作为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 );
...
}
说实话,我在这方面非常缺乏。谢谢你的任何建议。
$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'] );
}
假设数组是从某种形式的输入创建的。
答案 0 :(得分:1)
由于您正在使用prepare语句,因此您的应用程序将受到SQL注入保护。
从PHP文档开始:
准备好的陈述的参数不需要引用;驱动程序自动处理这个。如果应用程序专门使用预准备语句,开发人员可以确保不会发生SQL注入(但是,如果使用非转义输入构建查询的其他部分,仍然可以进行SQL注入)。
答案 1 :(得分:0)
不幸的是,如果$array
中的任何内容来自您在WHERE IN ()
语句中使用的任何形式的请求输入,则不会受到SQL注入的保护。有关如何正确绑定IN条件的参数,请参阅Can I bind an array to an IN() condition?。