【问题标题】:Escaping arrays using mysqli escape string [duplicate]使用mysqli转义字符串转义数组[重复]
【发布时间】: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 - 如果您认为这是额外的安全性,那不是......使用绑定变量会为您自动 ;你最终会做这个手动转义的是“双重转义”,这不好

标签: php arrays mysqli


【解决方案1】:

这里有很多解决方案。

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

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

所以:

  1. 使用 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 对象来说是个坏主意。

  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 数据库或连接?
  • 既没有数据库也没有连接。那是 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']); 的结果吗?调用你的开始主题?
猜你喜欢
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多