PHP 内爆,但将每个元素括在引号中

2022-08-30 08:27:07

假设我有一个数组:

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

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

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

问题在于元素数组中的 id 没有单独引用。即查询如下所示:

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

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


答案 1

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

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

这会产生:

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

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

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

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

答案 2

可以使用 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'

推荐