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 '-'
我知道只有这样的东西,因为输入 Test
或 Hello 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 准备好的语句没有做它的工作?)的主要内容,如果未能解决你的问题,请参考以下文章