Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql\u real\u不止一次逃脱_Php_Mysql_Mysql Real Escape String - Fatal编程技术网

Php mysql\u real\u不止一次逃脱

Php mysql\u real\u不止一次逃脱,php,mysql,mysql-real-escape-string,Php,Mysql,Mysql Real Escape String,我只是想知道如果我多次逃逸数据是否会有不同 因此,如果我在我的网站的一部分转义了数据,然后又在另一部分代码中转义了数据。这会是个问题吗?或者改变 是的。你会得到额外的不必要的反斜杠。当然,数据会被双重转义 您根本不应该使用mysql\u real\u escape(),通过的参数化查询已经存在了足够长的时间。无法区分转义字符串和未转义字符串,因为看起来像转义字符串的东西是预期的未转义字符串。因此,再次尝试转义将转义,转义后的文本将是MySQL读取的内容 因此,你不应该逃避超过一次 但是,更好的解

我只是想知道如果我多次逃逸数据是否会有不同


因此,如果我在我的网站的一部分转义了数据,然后又在另一部分代码中转义了数据。这会是个问题吗?或者改变

是的。你会得到额外的不必要的反斜杠。

当然,数据会被双重转义


您根本不应该使用
mysql\u real\u escape()
,通过的参数化查询已经存在了足够长的时间。

无法区分转义字符串和未转义字符串,因为看起来像转义字符串的东西是预期的未转义字符串。因此,再次尝试转义将转义,转义后的文本将是MySQL读取的内容

因此,你不应该逃避超过一次


但是,更好的解决方案是使用参数化查询,因为这样您根本不需要转义。

是的,这将是一个问题

例如:
如果a是“Joe's House”,第一个调用将生成“Joe's House”,第二个调用将生成“Joe\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

这类似于当web服务器启用了magic quotes并且您在客户端的输入上使用mysql\u real\u escape\u字符串时出现的问题。这可以通过以下方式解决:

if (! get_magic_quotes_gpc()) {
    $value = mysql_real_escape_string($_GET["value"]);
} else {
    $value = mysql_real_escape_string(stripslashes($_GET["value"])); 
}
(关于后一个示例,请参见)


[我编辑了答案以反映以下评论中的更正]

是的,这将是一个过度擒纵问题。这对于任何逃逸都是一样的,不管它到底做了什么。例如,如果要按照常见规则对字符串中的双引号进行转义:

bla "foo"
一次逃跑后

bla \"foo\"
两岁以后

bla \\\"foo\\\"

等等。“逃逸”的数量必须与“逃逸”的数量完全匹配。您可以在一些网站上看到此问题的表现,这些网站在文本字段中过度转义了一些字符,因此在输出时,简单的撇号变成了
\'

是的,这会有所不同:

$string = "I'm Chuck!";
mysql_escape_string($string); // I\'m Chuck!
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck!

mysql\u real\u escape的正确位置是在发送查询以保存数据之前。 脚本中其他地方的每个实例都是一个主要的设计缺陷


当然最好是在自己的db类中。

为什么不试试并打印结果呢?
mysql\u real\u escape\u string
不是幂等函数。魔引号执行的转义与mysql(i)\u(real)\u escape string不同。如果无法禁用魔法引号,正确的方法是使用stripslashes删除它们,然后在必要时应用转义(即,如果不能使用参数化查询)。理想情况下,您应该在一开始就删除神奇的引号,以避免每次需要在非DB上下文中输出它们时都必须删除它们。我不会因为您的分数而否决投票,但这种方法是错误的。转义应该只是
$value=mysql\u real\u escape\u字符串($\u GET[“value”])无条件。在脚本的最顶端,在编写查询之前,要做的另一件事就是去掉神奇的引号。如果你不做
$value=mysql\u real\u escape\u string(stripslashes($\u GET[“value”]),我将不得不对你投反对票最后一个条件。对不起,伙计们,我不知道。谢谢你提供的信息,我也会更正我的代码:-)@Alix,但这种方法也是错误的。别管数据库转义了。这与魔法格言无关。出于许多原因,Maguc斜杠必须去掉。你的应用程序不是只有这一行吗?这是正确的地方,但不是处理问题的最佳方式。@Blair想解释一下吗?什么问题?什么是最好的?处理注射的问题。参数化查询是更好的处理方法。但是就像我说的,你的回答给了OP要求的正确位置。@谁否决了这个:一个解释就好了。