我知道
array_walk()
和array_map()
。然而,当像这样使用前者时(在旧项目上)它失败了
array_walk($_POST, 'mysql_real_escape_string');
警告:mysql_real_escape_string() 期望参数 2 是资源, 给出的字符串。
所以我选择了这个稍微难看的版本
foreach($_POST as $key => $value) {
$_POST[$key] = mysql_real_escape_string($value);
}
那么为什么第一种方法不起作用呢?将数组的值映射到函数的最佳方法是什么?
array_walk
的回调函数预计接受两个参数,一个用于值,一个用于键:
通常,funcname采用两个参数。 array 参数的值是第一个,键/索引是第二个。
mysql_real_escape_string
希望第二个参数是资源。这就是您收到该错误的原因。
array_map
代替,它只获取每个项目的值并将其传递给给定的回调函数:
array_map('mysql_real_escape_string', $_POST);
第二个参数将被省略,因此使用最后打开的连接。
如果需要传递第二个参数,则需要将函数调用包装在另一个函数中,例如一个匿名函数:
array_map(function($string) use ($link) { return mysql_real_escape_string($string, $link); }, $_POST);
我知道OP要求调用一个函数,但是在您实际上不需要调用函数的情况下,您可以定义一个匿名函数:
$ids = [1,2,3];
array_walk($ids,function(&$id){$id += 1000;});
这是因为 mysql_real_escape_string 被赋予了两个参数,都是字符串。
http://php.net/manual/en/function.mysql-real-escape-string.php
http://www.phpbuilder.com/manual/en/function.array-map.php:
array_map() 返回一个数组 包含arr1的所有元素 应用回调函数后 给每一个。参数个数 回调函数接受 应匹配数组的数量 传递给 array_map()
你可以做
function myescape($val)
{
return mysql_real_escape_string($val);
}
...然后
array_walk($_POST, 'myescape');
mysql_real_escape_string()
将不起作用。 它如此酷的原因是它会以适合表类型的方式转义字符。 第二个[可选]参数是对 mysql 连接的引用。
$_POST
始终设置为 key->value
。 所以,你array_walk
打电话给mysql_real_escape_string(value, key)
。 请注意,第二个参数不是引用。
这就是它不起作用的原因。 上面已经提到了几种解决方案。
http://php.net/manual/en/function.array-walk.php 表示 array_walk 将使用 2 个参数(值和键)调用该函数。您应该编写一个新函数来包装 mysql_real_escape_string。比如:
function wrapper($val, $key){
return mysql_real_escape_string($val);
}
然后:
array_walk($_POST, 'wrapper');
抱歉,如果我的 PHP 不正确,但我想您会明白总体思路。
PHP 7.4 风格:
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
array_map(fn($string) => mysqli_real_escape_string($string, $link), $_POST);
我在使用已接受的答案时遇到了麻烦,因为它因我无法解决的原因而导致了我的错误。因此,对于任何在 array_walk 或 array_map 方面遇到问题的人,我发现这很有效。
foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv);