Php 反斜杠在mysql中是否转义引号?

Php 反斜杠在mysql中是否转义引号?,php,mysql,Php,Mysql,下面是失败的查询的var_转储 string 'INSERT INTO event(name, description, location, image, datetime) VALUES('Nica\'s Weight Loss Class', 'Description goes here!', 'Location', 'Nica's Weight Loss Class.png', '2015-01-01T01:00')' (length=189)` 错误是 您的SQL语法有错误;查看与您的

下面是失败的查询的var_转储

string 'INSERT INTO event(name, description, location, image, datetime) VALUES('Nica\'s Weight Loss Class', 'Description goes here!', 'Location', 'Nica's Weight Loss Class.png', '2015-01-01T01:00')' (length=189)`
错误是

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near's Weight Loss Class.png'、'2015-01-01T01:00')的正确语法

创建查询字符串的代码行是:(所有变量都是先转义的)

根据定义,反斜杠字符用于转义单引号

然而,根据研究,正确的方法似乎是将引号加倍


我已经测试了两种方法,它们在同一个地方给出了相同的错误。有人能解释一下这个问题吗?

你只是在逃避字符串中的第一个
。你有两个地方,
Nica的…
,但你只是在逃避第一个。第二个似乎是图像名称。如果您坚持使用mysql_*函数,那么您应该在查询中的每个变量上使用。引号不是唯一需要转义的字符,它将正确地转义它们


但是您真正应该做的是使用mysqli或pdo并在查询中绑定您的值。mysql_*函数已被弃用,将抛出错误,并将在将来的版本中删除。避开它们。绑定很容易,可以完全解决这个问题,您永远不必担心它。

您的MySQL查询本身是正确的。由于单引号位于单引号字符串文字中,因此需要反斜杠对其进行转义,以便将其解析为字符串文字的一部分,而不是字符串文字的结尾。您的第一个参考资料MySQL文档链接指出,您也可以使用两个单引号来实现相同的功能

但是,问题在于,您可能将MySQL查询作为字符串文本分配到PHP变量中(您在问题中共享的输出仅来自var_dump,因此不清楚SQL查询的分配位置)。与MySQL类似,PHP要求您在单引号字符串文字中转义单引号字符,否则它将被解释为字符串文字的结尾

为了让它发挥作用,你需要逃避两次。一次用于PHP,然后用于MySQL:

$query = 'INSERT INTO event(name, description, location, image, datetime) VALUES('Nica\\\'s Weight Loss Class', 'Description goes here!', 'Location', 'Nica's Weight Loss Class.png', '2015-01-01T01:00')';
注意
\\\'
。当PHP解释该行并将查询发送到MySQL时,它将是
\'
;第一个
\
正在逃过一次反冲

更新


OP已经更新了这个问题。SQL查询的这一部分来自变量。这是一种不好的做法,在XSS攻击之前可能会导致很多问题。最好与PDO或其他自动执行转义的SQL库一起使用绑定。然而,为了回答这个问题,通过
addslashes
运行变量可以解决MySQL错误。

如果sql是
'INSERT-INTO…'
而不是
“INSERT-INTO…”
加双引号,那么这就可以解释了。使用准备好的语句并完成它。@Fred ii-我将更新问题以显示创建查询字符串的代码行。我用了双引号。@Fred ii-我相信这是var_转储的结果。但是对于这个问题,您只需要转义字符串中的第一个
。你有两个地方,
Nica的…
,但你只是在逃避第一个。第二个可能是图像名称。请小心,通常很难发现“”和“”之间文档中的差异“其中前一个是两个连续的单引号,后一个是双引号。退出/清理数据,就像晚餐一样。在这种情况下,输入来自希望能够使用html标记的站点管理员。”。转义是在一个单独的地方完成的——我只是遗漏了一个字段(图像url)。我选择不逃避它,因为文件名应该在上传过程中被修改-它没有被正确更改。
$query = 'INSERT INTO event(name, description, location, image, datetime) VALUES('Nica\\\'s Weight Loss Class', 'Description goes here!', 'Location', 'Nica's Weight Loss Class.png', '2015-01-01T01:00')';