我只是想知道如果我多次使用mysql_real_escape数据是否会产生影响?
因此,如果我在我的网站的一部分中转发数据,然后再在另一部分代码中转义。这会是个问题吗?还是有所作为?
答案 0 :(得分:8)
mysql_real_escape的正确位置是之前您发送查询以保存数据。 脚本中任何其他位置的每个其他实例都是一个主要的设计缺陷。
当然,最好是在自己的db-class中。
答案 1 :(得分:3)
是。你会得到额外的不必要的反斜杠。
答案 2 :(得分:2)
是的,这将是一个问题。
例如:
如果 a 是“Joe's House”,第一个调用将生成“Joe's House”,第二个调用将生成“Joe \\\ House”,从而在数据库中保存反斜杠。
这类似于当Web服务器启用了魔术引号并且您在客户端输入时使用mysql_real_escape_string时出现的问题。这可以通过以下方式解决:
if (! get_magic_quotes_gpc()) {
$value = mysql_real_escape_string($_GET["value"]);
} else {
$value = mysql_real_escape_string(stripslashes($_GET["value"]));
}
(对于后一个示例,请参阅http://www.php.net/get_magic_quotes_gpc)
[我编辑了答案以反映下面评论中的更正]
答案 3 :(得分:1)
当然,数据会被双重转义。
你根本不应该使用mysql_real_escape()
,mysqli的参数化查询已经坚持了很长时间。
答案 4 :(得分:1)
无法区分转义字符串和非转义字符串,因为看起来像转义字符串的字符串是预期的未转义字符串。因此,试图再次逃脱,将逃避逃避 - 并且逃脱一次的文本将是MySQL读取的。
因此,你不应该多次逃避。
然而,更好的解决方案是使用参数化查询,因为那时你根本不需要转义。
答案 5 :(得分:1)
是的,这将是一个过度擒纵的问题。对于任何转义,这都是相同的,无论它究竟是什么。例如,如果您按照通用规则转义字符串中的双引号:
bla "foo"
一次逃脱后
bla \"foo\"
之后
bla \\\"foo\\\"
等等。 “unescapements”的数量必须与“擒纵机构”的数量完全匹配。你可以在某些网站上看到这个问题的表现形式,这些网站过度转义了文本字段中的某些字符,因此简单的撇号在输出时变为\'
。
答案 6 :(得分:0)
是的,它有所不同:
$string = "I'm Chuck!";
mysql_escape_string($string); // I\'m Chuck!
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck!