php - 在变量中使用破折号 (-) 时出现 PDO 错误
问题描述
我有以下错误:
Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 syntax error, unexpected '-'
这是它发生的一段代码:
$stmt = $db->prepare(
"
SELECT
product_id,
name
FROM
products
WHERE
MATCH(name) AGAINST(:name IN BOOLEAN MODE)
"
);
$stmt->bindParam(':name',$name,PDO::PARAM_STR);
$stmt->execute();
当名称中包含破折号 (-) 时,就会出现问题。当名称为“正常”(没有破折号)时,它可以工作。
我尝试了这个问题的解决方案(PDO 和 PHP / MySQL 中的 UTF-8 特殊字符?),但这不起作用。
任何人的想法?
提前致谢!
编辑
@lonesomeday 答案有效,但我找到了另一个解决方案。通过将“IN BOOLEAN MODE”更改为“IN NATURAL LANGUAGE MODE”,错误消失了。
解决方案
问题是IN BOOLEAN MODE
全文搜索。-
搜索字符串中的字符(以及其他几个字符)具有特殊含义(不包括搜索中的单词)。我认为,您的错误来自一个-
字符前面有一个单词,没有中间空格。
在任何情况下,-
都不会像其他运算符一样成为搜索的一部分,因此最简单的方法是将其与其他运算符一起剥离。
$name = str_replace(['-', '+', '<', '>', '(', ')', '~', '*', '\'', '"'], ' ', $name);
仅当您真的想要它们在此上下文中的特定含义时才包含这些字符。
推荐阅读
- github - 语言学家文档在 github 中不起作用?
- c++ - 超过二分图问题的时间限制
- azure-sql-database - 从 Javascript 对象到 CSV 到 Azure SQL 的正确文本编码管道
- php - 使用 PHP 和 xpath 从 html 源获取下一个兄弟
- html - 如何在 html 页面中嵌入 Word 文件?
- git - 如何只推送git的一些分支
- reactjs - 使用已在 render 中定义的变量,在 return 中使用它
- laravel - 在 null 上调用成员函数 toArray()
- neo4j - 仅使用 Cypher 执行并行创建/合并
- php - php算法递归树