当MySQL命令行返回预期结果时,PDO不返回结果

我正在使用数据库,运行dynamic生成的查询。 一切都很好,当我注意到在一个表中的几行编码问题,所以我从备份重新填充它,并重build表。

在这个动作之后,PDO返回空结果并且不抛出任何exception,但是,具有相同参数的相同查询从命令行成功执行(返回一些行)。 我复制粘贴来自var_dump()输出的查询和参数从命令行运行。

查询:

 SELECT `contracts_info`.`contract_number` AS `Номер контракта`, `contracts_info`.`balance` AS `Остаток`, `contracts_info`.`conclusion_date` AS `Дата заключения`, `contracts_info`.`activation_date` AS `Активация аккаунта`, `contracts_info`.`deactivation_date` AS `Деактивация аккаунта`, `parents`.`mother_fullname` AS `ФИО матери`, `parents`.`mother_email` AS `E-mail матери`, `parents`.`mother_phone` AS `Телефон матери`, `parents`.`father_fullname` AS `ФИО отца`, `parents`.`father_email` AS `E-mail отца`, `parents`.`father_phone` AS `Телефон отца`, `parents`.`postal_office` AS `Отделение Новой почты`, `students`.`name` AS `Имя`, `students`.`second_name` AS `Отчество`, `students`.`surname` AS `Фамилия`, `students`.`form_number` AS `Класс`, `students`.`form_letter` AS `Буква класса`, `students_info`.`medical_features` AS `Медицинские особенности`, `students_info`.`psychological_features` AS `Психологические особенности` FROM contracts_info JOIN `parents` USING(`contract_number`) JOIN `students` USING(`contract_number`) JOIN `students_info` USING(`contract_number`) WHERE MATCH (`contracts_info`.`contract_number`) AGAINST (? IN BOOLEAN MODE) OR MATCH (`parents`.`contract_number`, `parents`.`mother_fullname`, `parents`.`mother_email`, `parents`.`father_fullname`, `parents`.`father_email`) AGAINST (? IN BOOLEAN MODE) OR MATCH (`students`.`name`, `students`.`second_name`, `students`.`surname`, `students`.`contract_number`) AGAINST (? IN BOOLEAN MODE) OR MATCH (`students_info`.`medical_features`, `students_info`.`psychological_features`, `students_info`.`contract_number`) AGAINST (? IN BOOLEAN MODE); 

我试过或检查过的东西:

  • 选中的凭据,由脚本使用;
  • 使用不同参数运行相同的查询 – 相同的结果;
  • 通过这两种方法运行其他查询 – 相同的结果;
  • 尝试运行没有backquotes – 相同的结果;
  • 从PHP脚本重build表 – 没有帮助;
  • 在HTML中删除表格转储 – 他们是最新的;
  • 比较html表格转储和cli转储 – 它们是相似的;
  • 检查如果PHP查询对结果有影响,由cli命令获取 – 是的,有一个效果(所以,都使用相同的服务器/数据库)

我已经没有想法,我犯了一个错误,什么修复,所以我想借你=)即使是最疯狂的。

问题是什么?

我在哪里弄错了?

可能是这个服务器故障? 我分享nginx服务器,并与其他网站和程序员托pipe,其中一些可能有权访问我的数据库。

MySQL版本():5.6.29-76.2,PHP 5.5.9

先谢谢你。

编辑:PDO处理

PDO处理被封装在类中

创buildPDO:

  try { $this->handle = new PDO("mysql:dbname=" . $this->database . ";host=" . $this->server, $this->user, $this->password); // ensure that PDO::prepare returns false when passed invalid SQL $this->handle->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $this->handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $e) { trigger_error($e->getMessage(), E_USER_ERROR); exit; } 

Query()方法用于运行查询。 它有这样的参数: $sql – 用'?'查询string, $parameters – 参数数组。

  $statement = $this->handle->prepare($sql); if ($statement === false) { trigger_error($this->handle->errorInfo()[2], E_USER_ERROR); exit; } $results = $statement->execute($parameters); if ($results !== false) { return $statement->fetchAll($this->PDOFetchMode); } else { return false; } 

更改$this->PDOFetchMode

 public function SetPDOFetchMode($pdo_constant) { if (is_int($pdo_constant) && $pdo_constant >= 0) $this->PDOFetchMode = $pdo_constant; } 

其他代码是关于参数validation,单例实现等

编辑:

受这篇文章的启发: PDO准备语句并在布尔模式下进行匹配

我尝试绑定参数,但这并没有帮助

我已经试过Paul T.的build议,直接根据他的评论在查询中使用参数,但这也没有帮助。 然而,我得到的查询仍然成功运行在CLI中。

这个问题解决了非常不寻常的这个帖子最好的答案: PDO + MySQL和破损的UTF-8编码

在强制使用utf8编码在整个基地使用在构造,它工作正常,结果确实出现。 但是我不太明白,这是怎么完成的。 CLI请求在默认情况下正确返回utf8编码的结果。

看来我的AGAINST参数已经搞乱了编码。

代码来解决它:

 $pdo = new PDO( 'mysql:host=hostname;dbname=defaultDbName', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") ); 

感谢Paul T.的灵感