PHP破灭但包裹每个元素行情(PHP Implode But Wrap Each Element I

2019-07-29 07:25发布

假设我有一个数组:

 $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的方式来解决这一问题?

Answer 1:

引号添加到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);


Answer 2:

您可以使用array_walk遍历所有元素中端阵列传递参考元素,以下面的方式加引号。

<?php

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

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

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

?>


Answer 3:

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

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

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


Answer 4:

我想补充顶端回答了一下这里,即使你使用的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);


文章来源: PHP Implode But Wrap Each Element In Quotes
标签: php implode