Php MySQL全文连字符和大括号返回错误(最初是:PDO准备的语句没有完成它的工作?)
我更新了这个问题,因为问题出现了令人困惑的新转折。Php MySQL全文连字符和大括号返回错误(最初是:PDO准备的语句没有完成它的工作?),php,mysql,pdo,laravel,full-text-search,Php,Mysql,Pdo,Laravel,Full Text Search,我更新了这个问题,因为问题出现了令人困惑的新转折。 MySQL没有正确处理连字符或大括号 SELECT * FROM users WHERE MATCH(firstname, lastname, about) AGAINST('-' IN BOOLEAN MODE) 返回 syntax error, unexpected $end 如果我输入(或),也会发生同样的情况。我知道这只是因为输入其他任何东西,比如test都可以正常工作 我使用的是MySQL 5.7.4M ---更新--- 如
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中相对较新的全文支持的bug吗?
----老问题---
我在基于Laravel和PHP构建的应用程序中实现了一个“搜索用户”功能,并利用MySQL中的
全文搜索。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 '-'
我知道只有这样的东西,因为放入测试或Hello World
效果非常好。如果不是你,那就是别人在跟你开玩笑。
但是mysql错误看起来和PHP语法错误一模一样,这是非常明显的错误消息很难用谷歌搜索到。完成了吗?您不能在控制台中尝试相同的查询,直接将$query内容添加到查询中吗?@YourCommonSense,我已经用一个查询将问题更新到控制台,至少在控制台上有错误的引号screenshot@YourCommonSense使用test
或任何其他输入成功执行相同的错误引号。这只是windows字体渲染,然后使用稳定的Build。这不是PHP错误,而是MySQL错误:为什么里面有一个美元符号?不知道,但它肯定来自MySQL,而不是PHP。例如,命令行mysql返回它。