MySQL 全文连字符和大括号返回错误(最初:PDO 准备好的语句没有做它的工作?)

Posted

技术标签:

【中文标题】MySQL 全文连字符和大括号返回错误(最初:PDO 准备好的语句没有做它的工作?)【英文标题】:MySQL FullText Hyphens and Braces return error (ORIGINALLY: PDO prepared statement not doing its job?) 【发布时间】:2014-05-12 19:49:31 【问题描述】:

我已经更新了这个问题,因为出现了一个令人困惑的新问题。

mysql 未正确处理连字符或大括号。

SELECT * FROM users WHERE MATCH(firstname, lastname, about) AGAINST('-' IN BOOLEAN MODE) 

返回

syntax error, unexpected $end 

如果我输入(),也会发生同样的事情。我知道只有那些,因为输入任何其他内容,例如 test 就可以了

我在 MySQL 5.7.4M

---更新--- 如果我从 InnoDB 切换到 MyISAM,这个错误就会消失。这是 InnoDB 中相对较新的 FULLTEXT 支持的错误吗?

-----老问题---- 我在基于 Laravel 和 php 的应用程序中实现了“搜索用户”功能,并且在 MySQL 中使用了fulltext search。 Laravel 没有这个功能,我使用基本的DB::select() 来完成工作。问题是,当它使用准备好的语句时,它的行为就像不是(有点)。

我的代码:

return DB::select("SELECT * FROM users WHERE MATCH(firstname,lastname,about) AGAINST(? IN BOOLEAN MODE)", array($query));

仅供想知道的人参考,这是DB::select()函数

public function select($query, $bindings = array())
    
        return $this->run($query, $bindings, function($me, $query, $bindings)
        
            if ($me->pretending()) return array();

            // For select statements, we'll simply execute the query and return an array
            // of the database result set. Each element in the array will be a single
            // row from the database table, and will either be an array or objects.
            $statement = $me->getReadPdo()->prepare($query);

            $statement->execute($me->prepareBindings($bindings));

            return $statement->fetchAll($me->getFetchMode());
        );
    

但是,如果我输入类似:--(模拟 mysql 注入中的注释),我会收到以下错误:

SQLSTATE[42000]: Syntax error or access violation: 1064 syntax error, unexpected '-'

我知道只有这样的东西,因为输入 TestHello World 效果很好。

【问题讨论】:

这个错误信息很难用谷歌搜索。是否完整?你不能在控制台中尝试相同的查询,直接将 $query 内容添加到查询中吗? @YourCommonSense,我已经通过控制台查询更新了问题 至少截图上有错误的引号 @YourCommonSense 使用test 或任何其他输入成功执行相同的错误引号。只是windows字体渲染 然后使用stable构建 【参考方案1】:

如果不是你,那就是别人在跟你开玩笑。 但是mysql错误看起来和PHP语法错误一模一样很明显

【讨论】:

这不是 PHP 错误,而是 MySQL 错误:dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html 为什么里面有美元符号?不知道,但它肯定来自 MySQL,而不是 PHP。例如,命令行 mysql 返回它。

以上是关于MySQL 全文连字符和大括号返回错误(最初:PDO 准备好的语句没有做它的工作?)的主要内容,如果未能解决你的问题,请参考以下文章

mysql全文匹配搜索字串中含圆括号()怎么办?

Replace() 不适用于多行字符串和大括号

由于缩进而调试显式字符

Makefile 中的括号 $() 和大括号 $ 语法有啥区别?

VS Code 突然停止右括号、方括号和大括号

用引号和大括号反应原生属性值