PHP内爆但在报价中包装每个元素

Jus*_*tin 58 php implode

假设我有一个数组:

 $elements = array('foo', 'bar', 'tar', 'dar');
Run Code Online (Sandbox Code Playgroud)

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

 $SQL = "DELETE FROM elements
               WHERE id IN ('" . implode(',', $elements) . "')";
Run Code Online (Sandbox Code Playgroud)

问题是element数组中的id不是单独引用的.IE查询看起来像:

 $SQL = "DELETE FROM elements
               WHERE id IN ('foo,bar,tar,dar');
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最佳方式是什么?

nic*_*ckb 115

implode电话中添加引号:(我假设你的意思implode)

$SQL = 'DELETE FROM elements
           WHERE id IN ("' . implode('", "', $elements) . '")';
Run Code Online (Sandbox Code Playgroud)

这会产生:

DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar")
Run Code Online (Sandbox Code Playgroud)

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

一个简单的事情应该工作(但我没有测试它)是使用array_maparray_walk,并转义每个参数,如下所示:

$elements = array();
$elements = array_map( 'mysql_real_escape_string', $elements);
Run Code Online (Sandbox Code Playgroud)

  • @Justin最好的方法是使用准备好的语句http://php.net/manual/en/pdo.prepared-statements.php http://php.net/manual/en/mysqli.prepare.php (4认同)
  • 不要使用 mysql_ 函数。 (2认同)

ins*_*ign 6

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

<?php

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

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

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

?>
Run Code Online (Sandbox Code Playgroud)

  • 该链接是“澄清” (2认同)