首页 > 解决方案 > 在变量中使用破折号 (-) 时出现 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”,错误消失了。

标签: phpmysqlpdo

解决方案


问题是IN BOOLEAN MODE全文搜索。-搜索字符串中的字符(以及其他几个字符)具有特殊含义(不包括搜索中的单词)。我认为,您的错误来自一个-字符前面有一个单词,没有中间空格。

在任何情况下,-都不会像其他运算符一样成为搜索的一部分,因此最简单的方法是将其与其他运算符一起剥离。

$name = str_replace(['-', '+', '<', '>', '(', ')', '~', '*', '\'', '"'], ' ', $name);

仅当您真的想要它们在此上下文中的特定含义时才包含这些字符。


推荐阅读