如何从ODBC查询中转义单引号

时间:2012-12-21 22:52:43

标签: php mysql odbc

  

可能重复:
  Correct way to escape input data before passing to ODBC

我从查询ODBC查询得到的错误是:

(pos: 72 '...M = 'Owen O'^Donavon' AND...') - syntax error

当我试图逃避它时:

(pos: 73 '... = 'Owen O\'^Donavon' AND...') - syntax error

^意味着它正在打破

我尝试了以下内容:

NAM = '".$var."'

还有这个:

NAM = '".mysql_escape_string($var)."'

然后我绝望了

NAM = \"".$var."\"

其中$ var是包含'in in。

的任何名称

如果您需要整个查询:

UPDATE TABLE SET COLUMN1 = 'ERR' WHERE COLUMN_NAM = '".mysql_escape_string($var)."' AND COLUMN7 = 0");

是否有人知道我如何才能正确转义报价?

1 个答案:

答案 0 :(得分:4)

要在MySQL字符串文字中包含单引号(由单引号分隔),请使用两个单引号字符。 e.g。

'I don''t like it'

实际上,当MySQL解析它时,它会看到两个单引号字符,并将其解释为文字中的一个单引号,而不是看到字符串文字的“结束”。

但是(正如你所发现的那样)当你只有一个单引号时,MySQL解析器对它有一种神秘的感觉。考虑这个例子:

'I don't like it' 

MySQL解析器看到的是一个字符串文字,长度为五个字符,包含'I don'。然后MySQL看到该文字后面跟着一些需要解析的标记:t like it。解析器不会将其视为字符串文字的一部分。之前的单引号标记了字符串文字的结尾。

现在,MySQL解析器无法对t like it应该是什么做出正面或反面。它将这些标记后面的单引号视为另一个字符串文字的开头。 (所以,你可能会非常聪明地看到那里出现的东西,并设法得到MySQL确实理解的东西......而这可能会更糟糕。)

(注意:此问题并非特定于ODBC;这会影响在MySQL查询文本中使用字符串文字的客户端。)


避免此类问题的一种方法是在查询文本中使用绑定变量,而不是字符串文字。 (但是对于MySQL,无论如何发生的事情是逃避,发送到MySQL服务器的内容(可以这么说)是一个字符串文字。

有时我们需要在查询文本中包含字符串文字,我们不应该要求使用绑定变量作为变通方法。因此,最好知道如何在一个用单引号括起的字符串文字中“转义”单个引号。