使用mysqli escape string转义数组

3

我需要转义数组,我正在使用array_mapmysqli_real_escape_string

我有多个数组,例如

$_post['countries'];
$_post['categories'];
.
.

如何对这些数组执行转义?
我是这样做的。
$countries=array_map('mysqli_real_escape_string', $_POST['countries']);
$categories=array_map('mysqli_real_escape_string', $_POST['categories']);
.
.

但是它显示了一个错误:警告:mysqli_real_escape_string()期望恰好有2个参数,但只提供了1个

还要做什么?

$categories=mysqli_real_escape_string($connection, $_POST['categories']); 

出错信息为

Warning: mysqli_real_escape_string() expects parameter 2 to be string, array given in

请查看并提出一种方法或另一种更好的方法来完成这个任务。
谢谢。

mysqli_real_escape_string是一个函数,你是如何使用它的? - Deep Kakkar
@Anant 我先尝试了这种方法,但是它报错了,显示“警告:mysqli_real_escape_string()函数期望第二个参数为字符串,但实际传递的是数组”。 - user1411607
在mysqli中,几乎总是需要提供两个参数,第一个是连接,第二个是查询等等。 - rray
2
使用array_map函数对$_POST['countries']数组中的每个元素进行转义,代码如下:array_map(function($arrayElement) use ($databaseConnection) { return mysqli_real_escape_string($databaseConnection, $arrayElement); }, $_POST['countries']);。但是,如果您已经在使用MySQLi,则应切换到使用绑定变量的预处理语句,这样就不需要转义了。 - Mark Baker
2
@TallboY - 如果你认为这是额外的安全措施,那就不是......使用绑定变量会自动完成这个过程;而你手动转义的结果是“双重转义”,这并不好。 - Mark Baker
显示剩余2条评论
2个回答

2

您需要使用匿名函数将 mysqli_real_escape_string() 调用包装起来,以便在 array_map() 中使用,就像这样:

// $connection_object is a mysqli object declared somewhere above

$countries = array_map(function($item) use($connection_object) {
  return mysqli_real_escape_string($connection_object, $item);
}, $_POST['countries']);

是的,我认为这应该是你的代码所期望的。你能在你的起始主题中添加一个print_r($_POST['countries'])调用的结果吗? - Max Zuber

2

这里有很多解决方案。

考虑到你想坚持使用 mysqli(PDO 现在是推荐的方式,但仍然是一种选择),并且你想继续在此上下文中使用 array_map,你需要检查 array_map 原型:http://php.net/array_map

array array_map ( callable $callback , array $array1 [, array $... ] )

所以:

  1. 使用数组映射的动态参数

    注意:这个解决方案是错误的,已经被误导。

    原始答案:$myArray = array_map('mysqli_real_escape_string', $db, $myArray);

    更新后的答案:$myArray = array_map('mysqli_real_escape_string', $myArray, array_fill(0, count($myArray), $db));,但这对于 mysqli 对象来说是一个坏主意。

  2. 使用数组回调函数

    因为 mysqli_real_escape_string 也是 mysqli 的方法...

    $myArray = array_map(array($db, 'real_escape_string'), $myArray);

  3. 使用闭包

    $myArray = array_map(function($e) use($db) { return mysqli_escape_string($db, $e); }, $myArray);

    或者

    $myArray = array_map(function($e) use($db) { return $db->real_escape_string($e); }, $myArray);


$db是指数据库或连接? - user1411607
是的,你必须用你的mysqli对象替换$db,就像我之前说的一样 ;) mysqli总是使用这个对象。显然,你还必须用你的数组替换$myArray。 - Lpu8er
好的,我会更新答案。不要使用第一个解决方案,使用第二个或第三个。 - Lpu8er
数组(大小=2) 0 => 字符串'5'(长度=1) 1 => 字符串'8'(长度=1) - user1411607
第二个和第三个哪个更快? - user1411607
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接