假设我有一个数组:
$elements = array('foo', 'bar', 'tar', 'dar');
然后我想建立一个DELETE IN
SQL查询:
$SQL = "DELETE FROM elements
WHERE id IN ('" . implode(',', $elements) . "')";
的问题是,在元件阵列中的ID不单独引用的每个。 IE查询的样子:
$SQL = "DELETE FROM elements
WHERE id IN ('foo,bar,tar,dar');
什么是最好的,最elegants的方式来解决这一问题?
引号添加到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);
您可以使用array_walk
遍历所有元素中端阵列传递参考元素,以下面的方式加引号。
<?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它可以调用使用array_map使用对象方法real_escape_string callable
形式。 下面是一个例子,假设$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);