php - 在变量中使用破折号 (-) 时出现 PDO 错误

标签 php mysql 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 and UTF-8 Special characters in PHP / MySQL? ) 但它不起作用。

有什么想法吗?

提前致谢!

编辑

@lonesomeday 答案有效,但我找到了另一个解决方案。通过将“ bool 模式”更改为“自然语言模式”,错误消失了。

最佳答案

问题是 IN BOOLEAN MODE 全文搜索。搜索字符串中的字符 - (连同 several others )具有特殊含义(从搜索中排除一个词)。我认为,您的错误来自于 - 字符前面有一个单词,中间没有空格。

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

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

仅当您确实希望这些字符在此上下文中具有特定含义时才包含这些字符。

关于php - 在变量中使用破折号 (-) 时出现 PDO 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52041432/

相关文章:

mysql - Pandas 导入未插入所有行

mysql - 需要优化这个查询

php - 编辑 mysql 数据库中的数据

php - 为什么我用PDO插入非英文字符会变成怪物?

php - PDO 更新函数为每一列设置相同的值 - 循环错误

php - realpath 目录名混淆

php - 使用正则表达式从文本中删除 URL(当前域除外)

php - sql - 是否可以将外键添加到引用同一个表上的 id 列的表中

php - 查找并删除后面的重复记录

php - 在表中搜索以查找 set_id 是否存在 IP 地址