在mysql中反斜杠转义引号吗?

时间:2015-07-23 18:21:03

标签: php mysql

这是一个失败的查询的var_dump

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服务器版本对应的手册,以便在's Weight Loss Class.png','2015-01-01T01:00''附近使用正确的语法''

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

$query = "INSERT INTO event(name, description, location, ".($imageForEvent?"image, ":"")."datetime) VALUES('$evName', '$evDescription', '$evLocation', ".($imageForEvent?"'".basename($imageForEvent)."', ":"")."'$evDatetime')";

根据mysql docs,反斜杠字符用于转义单引号。

然而,根据How to escape apostrophe (') in MySql?,正确的方法似乎是将引号加倍。

我已经测试了两种方式,并且它们在同一个地方发出相同的错误。任何人都可以对这个问题有所了解吗?

2 个答案:

答案 0 :(得分:1)

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

但你应该做的是使用mysqli或pdo并在查询中绑定你的值。 mysql_ *函数已被弃用,将引发错误,并将在以后的版本中删除。避免他们。绑定很容易,并且可以完全解决这个问题,以至于您无需担心它。

答案 1 :(得分:0)

您的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错误。