我只是想知道如果我多次使用 mysql_real_escape 数据是否会有所不同?
因此,如果我在网站的一部分中转义了数据,然后又在代码的另一部分中转义了数据。这会是个问题吗?还是有所作为?
我只是想知道如果我多次使用 mysql_real_escape 数据是否会有所不同?
因此,如果我在网站的一部分中转义了数据,然后又在代码的另一部分中转义了数据。这会是个问题吗?还是有所作为?
mysql_real_escape 的正确位置是在您发送查询以保存数据之前。脚本中其他任何地方的所有其他实例都是一个主要的设计缺陷。
当然,最好在自己的数据库类中。
是的。你会得到额外的不必要的反斜杠。
是的,这将是一个问题。
例如:
如果a是“Joe's House”,第一个调用将产生“Joe\'s House”,第二个调用将产生“Joe\\\'s 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)
[我编辑了答案以反映以下评论中的更正]
无法区分转义字符串和未转义字符串,因为看起来像转义字符串的东西是预期的未转义字符串。因此,再次尝试转义,将逃脱转义 - 转义一次的文本将是 MySQL 读取的内容。
因此,您永远不应该多次逃脱。
但是,更好的解决方案是使用参数化查询,因为那时您根本不需要转义。
是的,这将是一个过度擒纵问题。这对于任何转义都是一样的,不管它到底做了什么。例如,如果您要按照通用规则转义字符串中的双引号:
bla "foo"
一次逃跑后变成
bla \"foo\"
两个之后变成
bla \\\"foo\\\"
等等。“unescapements”的数量必须与“escapements”的数量完全匹配。您可能会在某些站点上看到此问题的表现,这些站点过度转义了文本字段中的某些字符,因此\'
输出时会出现简单的撇号。
当然,数据会被双重转义。
您根本不应该使用,通过mysqlimysql_real_escape()
进行的参数化查询已经存在了足够长的时间。
是的,它有所作为:
$string = "I'm Chuck!";
mysql_escape_string($string); // I\'m Chuck!
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck!