使用mysqli转义字符串转义数组[重复]
Posted
技术标签:
【中文标题】使用mysqli转义字符串转义数组[重复]【英文标题】:Escaping arrays using mysqli escape string [duplicate] 【发布时间】:2016-06-26 17:50:21 【问题描述】:我需要转义数组,我正在使用 array_map
和 mysqli_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转义字符串转义数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章