在WHERE中匹配保留字符...匹配...反对...声明?

时间:2016-06-16 05:25:54

标签: mysql escaping full-text-search prepared-statement

我的查询包含一些导致语法错误的字符,因为包含保留字符,我正在努力了解如何正确地转义字符串。

查询是:

SELECT * FROM `products` 
WHERE MATCH (code, description) 
AGAINST (UPPER(+("intel"*) +("cpu"*)) IN BOOLEAN MODE) 

但是当我运行此查询时,我收到以下错误:

  

1064 - 您的SQL语法出错;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近')+(“cpu”*)))在BOOLEAN MODE)'第1行

好的,它不喜欢),因为它表明AGAINST正在关闭,但它不是(还)。所以我试图用反斜杠来逃避它,但它仍然会引发同样的错误。

如果我在PHP中使用预准备语句尝试此操作,同时将搜索字符串+("intel"*) +("cpu"*)绑定到它工作的语句中。因此,似乎它逃脱它的方式不是反斜杠或其他东西。

所以我正在查看mysqlescapestring的PHP文档,我看到它:“将反斜杠添加到以下字符:\ x00,\ n,\ r,\,',”和\ x1a。“

这表明单引号和双引号需要转义,我尝试这样做但它只是抛出相同的语法错误但是在双引号字符上,即to use near '\"intel\"*\)...

我确实理解最好使用预处理语句并且这解决了问题,但我只想了解我在这里做错了什么以及如何在AGAINST子句中转义这样的字符串正如我在这里所做的那样。

如果有人能说明我的错误,那么我们将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

好吧,我设法解决了这个问题。

我在another so question上读到了一个帮助我的答案。我意识到当预准备语句包含相对对象时,它会用引号将其封装起来,所以实际上UPPER(?)会变成UPPER("prepared string"),这意味着UPPER(+("intel"*) +("cpu"*))实际应该是UPPER('+("intel"*) +("cpu"*)') }。

结果是:

SELECT * FROM `product` 
WHERE MATCH (code, description) 
AGAINST (UPPER('+("intel"*) +("cpu"*)') IN BOOLEAN MODE)

哪种方法没有语法错误。

作为一个注释,如果你在MySQL中转义字符串,那么值得注意的是MySQL uses C escape syntax in strings