PHP内爆但在报价中包装每个元素

时间:2012-05-08 00:14:31

标签: php implode

假设我有一个数组:

 $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');

解决这个问题的最佳方法是什么?

7 个答案:

答案 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_maparray_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”]