mysql_real_escape_string和array_map返回空字符串?

时间:2013-09-05 00:05:59

标签: php mysql array-map

我还没有学会如何使用参数化查询(根据本网站上的其他一些帖子,明天上午我绝对需要做的事情),我想把表单数据搞砸到查询中逃脱了。

两次,我遇到过这个解决方案:

$_POST = array_map('mysqli_real_escape_string', $_POST);

根据我的判断,这可以通过escape函数运行$ _POST数组中的所有变量。我已经看到完全行被upvoted,但当我将它添加到我现有的PHP时,它会创建一堆空白值。

我的印象是mysqli_real_escape_string需要第二个参数 - 链接/连接。这是什么导致了我的问题?如果删除该行并且我的变量从$ _POST获取未转义的值,数据在数据库中就可以了。

3 个答案:

答案 0 :(得分:3)

array_map返回新数组,如果您覆盖$_POST,更好的解决方案是使用array_walk

array_walk($_POST, function(&$string) use ($link) { 
  $string = mysqli_real_escape_string($link, $string);
});

请注意,$link必须是有效的连接。

Function [ <internal:mysqli> function mysqli_real_escape_string ] {

  - Parameters [2] {
    Parameter #0 [ <required> $link ]
    Parameter #1 [ <required> $string_to_escape ]
  }
}

答案 1 :(得分:1)

您必须将转义的值传递给另一个变量:

$post = array_map('mysqli_real_escape_string', $_POST);

或者:

foreach($_POST as $k => $v) {
    $_POST[$k] = mysqli_real_escape_string($v);
}
  

注意:除非引用了数组,否则foreach将对指定数组的副本进行操作,而不是数组本身。

答案 2 :(得分:0)

然后是的,这是你的答案:

mysql_real_escape_string()需要连接数据库,因为它使用数据库的字符集来确定需要转义的内容。
没有这个,PHP不知道你正在使用什么字符集,所以要逃避什么。

有很多:
http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
并且所有人都有不同的角色。