PHP隐喻但将每个元素括在引号中


70

假设我有一个数组:

 $elements = array('foo', 'bar', 'tar', 'dar');

然后我想建立一个 DELETE INSQL查询:

 $SQL = "DELETE FROM elements
               WHERE id IN ('" . implode(',', $elements) . "')";

问题是在elements数组中的id并没有单独引用。IE查询看起来像:

 $SQL = "DELETE FROM elements
               WHERE id IN ('foo,bar,tar,dar');

解决此问题的最好,最优雅的方法是什么?


要非常小心...您可能会接受一些严重的SQL注入。
布拉德

nickb届时提供的解决方案防止SQL注入的最佳方法是什么?谢谢。
贾斯汀

Answers:


131

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

完美,那么如Brad建议的那样,防止SQL注入的最佳方法是什么?
贾斯汀

1
@Jusin我编辑了答案,并提出了有关防止SQL注入的建议。
nickb'5


1
不要使用mysql_函数。
ryantxr

7

您可以使用以下方法array_walk来迭代数组中将引用传递给元素的所有元素,并添加引号。

<?php

$arr = ['a','b','c'];

array_walk($arr, function(&$x) {$x = "'$x'";});

echo implode(',', $arr); // 'a','b','c'

?>

请说明为什么这是一个答案。这对您来说似乎微不足道,但是由于您不添加任何解释,因此您的建议可以解释其用法。
Glubus '18

链接是“说明”
签名

2

您可以运行一个简单的array_map()函数将字符串用引号引起来,然后将其包裹在implode()周围以添加逗号:

$array = ["one", "two", "three", "four"];

implode(",", array_map(function($string) {
    return '"' . $string . '"';
}, $array));

1

你也可以这样

$elements = array('foo', 'bar', 'tar', 'dar');

$data = '"' . implode('", "', $elements) . '"';

echo $data; // "foo", "bar", "tar", "dar" 

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

0

我只想指出,最佳答案无法完全解决。在爆破结束时,您将缺少一个元素。

所以代替:

DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar")

你会得到:

DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar)

请注意,结尾元素“ dar现在缺少引号。


0

json_encode怎么样?

$arr=array("foo","bar","tar","dar");
$str=json_encode($arr);
echo $str;

结果:[“ foo”,“ bar”,“ tar”,“ dar”]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.