74

假设我有一个数组:

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

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

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

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

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

解决这个问题的最好、最优雅的方法是什么?

4

7 回答 7

136

在通话中添加引号implode:(我假设您的意思是implode

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

这会产生:

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

防止 SQL 注入的最佳方法是确保您的元素被正确转义。

一个简单的事情应该可行(但我没有测试过)是使用array_mapor array_walk,并转义每个参数,如下所示:

$elements = array();
$elements = array_map( 'mysql_real_escape_string', $elements);
于 2012-05-08T00:15:37.980 回答
12

您可以使用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 或更早版本

<?php

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

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

echo implode(',', $arr); // 'a','b','c'
于 2018-02-01T13:09:32.263 回答
2

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

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

implode(",", array_map(function($string) {
    return '"' . $string . '"';
}, $array));
于 2018-02-01T17:27:52.547 回答
1

你也可以这样做

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

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

echo $data; // "foo", "bar", "tar", "dar" 
于 2019-11-23T15:34:54.163 回答
0

callable只是在这里添加一点答案,即使您使用的是 MySQLi,也可以通过使用对象方法形式使用 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);
于 2018-03-27T21:36:16.003 回答
0

我只想指出,最佳答案不会完全起作用。内爆结束时您将缺少一个元素。

所以而不是:

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

你会得到:

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

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

于 2020-01-02T20:33:58.847 回答
0

json_encode 怎么样?

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

结果:["foo","bar","tar","dar"]

于 2020-08-02T16:02:02.763 回答