假设我有一个数组:
$elements = array('foo', 'bar', 'tar', 'dar');
然后我想构建一个DELETE IN
SQL查询:
$SQL = "DELETE FROM elements
WHERE id IN ('" . implode(',', $elements) . "')";
问题是每个元素数组中的id都没有引用。 I.E查询如下:
$SQL = "DELETE FROM elements
WHERE id IN ('foo,bar,tar,dar');
解决这个问题的最佳方法是什么?
答案 0 :(得分:107)
将引号添加到implode
调用中:(我假设您的意思是implode
)
$SQL = 'DELETE FROM elements
WHERE id IN ("' . implode('", "', $elements) . '")';
这会产生:
DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar")
防止SQL注入的最佳方法是确保正确转义元素。
一件容易的事情应该可行(但我还没有测试过)是使用array_map
或array_walk
,并转义每个参数,如下所示:
$elements = array();
$elements = array_map( 'mysql_real_escape_string', $elements);
答案 1 :(得分:3)
您可以使用array_walk
迭代数组中传递元素引用的所有元素,并按以下方式添加引号。
<?php
$arr = ['a','b','c'];
array_walk($arr, function(&$x) {$x = "'$x'";});
echo implode(',', $arr); // 'a','b','c'
?>
答案 2 :(得分:0)
您可以运行一个简单的array_map()函数将字符串包装在引号中,然后将其包装在implode()周围以添加逗号:
$array = ["one", "two", "three", "four"];
implode(",", array_map(function($string) {
return '"' . $string . '"';
}, $array));
答案 3 :(得分:0)
这里只是添加到顶部答案,即使您使用MySQLi,也可以使用对象方法callable
形式使用array_map调用real_escape_string。这是一个示例,假设$conn
是您的MySQLi连接:
$elements = array('foo', 'bar', 'tar', 'dar');
$cleanedElements = array_map([$conn, 'real_escape_string'], $ids);
$SQL = 'DELETE FROM elements WHERE id IN ("' . implode('", "', $elements) . '")';
请注意,array_map的第一个参数是一个数组,其对象后跟方法名称。这与对数组中的每个项执行以下操作相同:
$newItem = $conn->real_escape_string($item);
答案 4 :(得分:0)
您也可以这样做
$elements = array('foo', 'bar', 'tar', 'dar');
$data = '"' . implode('", "', $elements) . '"';
echo $data; // "foo", "bar", "tar", "dar"
答案 5 :(得分:0)
我只想指出,最重要的答案不能完全起作用。在爆破结束时,您将缺少一个元素。
所以代替:
DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar")
您将获得:
DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar)
请注意,结尾元素“ dar现在缺少引号。
答案 6 :(得分:0)
json_encode怎么样?
$arr=array("foo","bar","tar","dar");
$str=json_encode($arr);
echo $str;
结果: [“ foo”,“ bar”,“ tar”,“ dar”]