我知道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);
}
那么为什么第一种方式不起作用?将数组值映射到函数的最佳方法是什么?
答案 0 :(得分:31)
传递给array_walk
的回调函数应该接受两个参数,一个用于值,一个用于键:
通常, funcname 采用两个参数。 array 参数的值是第一个,键/索引是第二个。
但mysql_real_escape_string
期望第二个参数是资源。这就是你得到这个错误的原因。
使用array_map
代替,它只获取每个项目的值并将其传递给给定的回调函数:
array_map('mysql_real_escape_string', $_POST);
将省略第二个参数,因此使用最后打开的连接。
如果需要传递第二个参数,则需要将函数调用包装在另一个函数中,例如: anonymous function:
array_map(function($string) use ($link) { return mysql_real_escape_string($string, $link); }, $_POST);
答案 1 :(得分:2)
这是因为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');
答案 2 :(得分:2)
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不正确,但我认为你会理解这一点。
答案 3 :(得分:2)
mysql_real_escape_string()
将无效。它之所以如此酷,是因为它会以适合表格类型的方式转义字符。第二个[可选]参数是对mysql连接的引用。
$_POST
始终设置为key->value
。因此,array_walk
来电mysql_real_escape_string(value, key)
。请注意,第二个参数不是引用。
这就是为什么它不起作用。上面已经提到了几种解决方案。
答案 4 :(得分:1)
我知道OP要求调用函数,但是在您不需要调用函数的情况下,您可以定义anonymous one:
$ids = [1,2,3];
array_walk($ids,function(&$id){$id += 1000;});
答案 5 :(得分:0)
PHP 7.4样式:
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
array_map(fn($string) => mysqli_real_escape_string($string, $link), $_POST);
答案 6 :(得分:-2)
我无法使用已接受的答案,因为它导致我出错,原因是我无法解决。因此,对于任何遇到array_walk或array_map问题的人,我发现这可以工作。
foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv);