PHP 内爆,但用引号包装每个元素

假设我有一个数组:

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

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

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

问题在于元素数组中的 id 没有单独引用,也就是说查询看起来像:

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

什么是最好的,最优雅的方式来解决这个问题?

65122 次浏览

Add the quotes into the implode call: (I'm assuming you meant implode)

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

This produces:

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

The best way to prevent against SQL injection is to make sure your elements are properly escaped.

一个简单的方法就是使用 array_map或者 array_walk,并且转义所有的参数,就像这样:

$elements = array();
$elements = array_map( 'mysql_real_escape_string', $elements);

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

Php 7.4或更新

<?php


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


array_walk($arr, fn(&$x) => $x = "'$x'");


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

php 7.3 or older version

<?php


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


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


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

您可以运行一个简单的 array _ map ()函数,将字符串包装成引号,然后将其包装成内爆() ,以添加逗号:

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


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

在这里,我们再补充一点,即使您正在使用 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);

你也可以这样做

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


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


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

我只是想指出,最佳答案不会完全奏效。在你的内爆结束时,你会失去一个元素。

所以不是:

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

You will get:

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

注意,结束元素“ dar 现在缺少一个引号。

那 json _ encode 呢?

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

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