使用mysqli转义字符串转义数组[重复]

Posted

技术标签:

【中文标题】使用mysqli转义字符串转义数组[重复]【英文标题】:Escaping arrays using mysqli escape string [duplicate] 【发布时间】:2016-06-26 17:50:21 【问题描述】:

我需要转义数组,我正在使用 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']);
.
.

但它显示错误为Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in

也在做

$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 是一个函数,你是如何使用它的。 @Anant 我首先尝试了这种方式,但它给出了错误Warning: mysqli_real_escape_string() expects parameter 2 to be string, array given in 在 mysqli 中几乎没有 ;) 你需要提供 2 个参数,第一个是连接,第二个是查询等 array_map(function($arrayElement) use ($databaseConnection) return mysqli_real_escape_string($databaseConnection, $arrayElement); , $_POST['countries']);.... 但是如果你已经在使用 MySQLi,那么切换到使用带有绑定变量的预处理语句,你不需要转义这些 @TallboY - 如果您认为这是额外的安全性,那不是......使用绑定变量会为您自动 ;你最终会做这个手动转义的是“双重转义”,这不好 【参考方案1】:

这里有很多解决方案。

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

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

所以:

    使用 array_map 的动态参数

    注意:这个解决方案很糟糕,而且是错误的。

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

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

    使用可调用数组

    因为mysqli_real_escape_string也是mysqli的一个方法... $myArray = array_map(array($db, 'real_escape_string'), $myArray);

    使用闭包

    $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 数据库或连接? 既没有数据库也没有连接。那是 mysqli 对象。它可能处理一个连接,可能是一个数据库......或者不是。这只是要使用的 mysqli 的基础对象。您必须创建它,可能使用新的 mysqli。 收到错误Notice: Undefined variable: db & Warning: array_map(): Argument #2 should be an array 是的,你必须用你的 mysqli 对象替换 $db,正如我之前所说的 ;) mysqli 总是与这个对象一起工作。显然,您还必须用您的数组替换 $myArray。 什么 mysqli 对象,我不明白。【参考方案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']); 的结果吗?调用你的开始主题?

以上是关于使用mysqli转义字符串转义数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

真正的转义字符串与绑定参数

json_encode() 转义 / 带有 \ [重复]

Python转义“”符号[重复]

转义序列与空白字符(\s)[重复]

JSTL转义特殊字符[重复]

bash别名中的转义字符[重复]