Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO不返回结果,而MySQL命令行返回预期结果_Php_Mysql_Nginx_Pdo_Command Line Interface - Fatal编程技术网

Php PDO不返回结果,而MySQL命令行返回预期结果

Php PDO不返回结果,而MySQL命令行返回预期结果,php,mysql,nginx,pdo,command-line-interface,Php,Mysql,Nginx,Pdo,Command Line Interface,我正在处理数据库,运行动态生成的查询。一切都很好,当我注意到在一个表中的两行中进行编码时出现了问题,所以我从备份中重新填充了它并重建了表 执行此操作后,PDO将返回空结果,并且不会引发任何异常,但是,使用相同参数的相同查询将从命令行成功执行(返回一些行)。我从var_dump()输出复制粘贴的查询和参数,以从命令行运行 查询: SELECT `contracts_info`.`contract_number` AS `Номер контракта`, `contracts_info`.`bal

我正在处理数据库,运行动态生成的查询。一切都很好,当我注意到在一个表中的两行中进行编码时出现了问题,所以我从备份中重新填充了它并重建了表

执行此操作后,PDO将返回空结果,并且不会引发任何异常,但是,使用相同参数的相同查询将从命令行成功执行(返回一些行)。我从
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);
我试过或检查过的事情:

  • 已检查凭据,由脚本使用
  • 使用不同的参数运行相同的查询-相同的结果
  • 使用两种方法运行其他查询-结果相同
  • 尝试在没有反引号的情况下运行-结果相同
  • 从php脚本重建表-没有帮助
  • html格式的略读表转储-它们是最新的
  • 比较html表转储和cli转储-它们相似
  • 检查php查询是否对通过cli命令获取的结果有影响-是的,有影响(因此,两者使用相同的服务器/数据库)
我已经想不出我在哪里犯了错误以及要修复什么,所以我想借用一下你的=) 即使是最疯狂的

有什么问题

我错在哪里了

这可能是服务器故障吗?我与其他网站和程序员共享nginx服务器和主机,其中一些人可能可以访问我的数据库

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

先谢谢你

编辑:PDO处理

PDO处理封装在类中

创建PDO:

    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
-带“?”的查询字符串,
$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;
}
其他代码是关于参数验证、单例实现等

编辑:

受此帖子启发:

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


我试着根据他的评论直接在查询中使用参数,但这也没有帮助。尽管如此,我得到的查询仍然在CLI中成功运行

这篇文章的最佳答案不同寻常地解决了这个问题:

在强制使用utf8编码到构造函数中使用的整个基之后,它工作得很好,结果确实出现了。但我不太明白,这是怎么做到的。默认情况下,CLI请求返回utf8编码正确的结果

似乎我的
参数与
参数的编码有误

修复代码:

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

谢谢你的灵感

既然PDO在标题、问题和标签中,你能添加PDO处理吗?你有什么MySQL版本?过去有麻烦。您能提供
$parameters
数组的
var_dump()
示例吗?@PaulT.,
$parameters
数组通常是用户作为查询获取的单个参数的重复,看起来像“+word+word+*last_word*”,但用的是本地(俄语)例如,当只有1个参数或全部4个参数时,我很好奇数组会是什么样子(语言不重要),以及它会如何影响处理?当存在4个参数时,它是否失败?除此之外,我已经没有什么想法了。我在前面提到了您提到的
编码
。。。这是因为角色设置还是其他原因?这是一个很好的发现。感谢您发布发现的结果!