假设我有一个数组:
$elements = array('foo', 'bar', 'tar', 'dar');
Run Code Online (Sandbox Code Playgroud)
然后我想建立一个DELETE INSQL查询:
$SQL = "DELETE FROM elements
WHERE id IN ('" . implode(',', $elements) . "')";
Run Code Online (Sandbox Code Playgroud)
问题是element数组中的id不是单独引用的.IE查询看起来像:
$SQL = "DELETE FROM elements
WHERE id IN ('foo,bar,tar,dar');
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方式是什么?
nic*_*ckb 115
在implode电话中添加引号:(我假设你的意思implode)
$SQL = 'DELETE FROM elements
WHERE id IN ("' . implode('", "', $elements) . '")';
Run Code Online (Sandbox Code Playgroud)
这会产生:
DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar")
Run Code Online (Sandbox Code Playgroud)
防止SQL注入的最佳方法是确保正确转义元素.
一个简单的事情应该工作(但我没有测试它)是使用array_map或array_walk,并转义每个参数,如下所示:
$elements = array();
$elements = array_map( 'mysql_real_escape_string', $elements);
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法array_walk来迭代数组中将引用传递给元素的所有元素,并添加引号。
<?php
$arr = ['a','b','c'];
array_walk($arr, function(&$x) {$x = "'$x'";});
echo implode(',', $arr); // 'a','b','c'
?>
Run Code Online (Sandbox Code Playgroud)