Intereting Posts
Процент числа из другого номера Установка PHPv8js на Ubuntu «Профилировщик с визуализацией» для PHP с «полной визуализацией backtrace»? Столбец не найден: 1054 Неизвестный столбец, используя соединение ODBC подготовил заявления в PHP Использование регулярного выражения для фильтрации года фиксированной длины 0 или 4 цифры Symfony2 REST API – частичное обновление Какую библиотеку PHP-клиента использовать с Cassandra? Создание случайных папок с использованием php Как я могу захватить результат var_dump в строку? Есть ли недостатки в использовании двойных слэшей в URL-адресах? Как запретить PDO интерпретировать знак вопроса в качестве заполнителя? Как настроить трансформатор данных в Symfony для повторного использования существующих объектов? Как изменить порядок выполнения запросов MySQL? Лучше ли иметь две отдельные пользовательские таблицы или одну?

PDO не возвращает результатов, тогда как командная строка MySQL возвращает ожидаемый результат

Я работал с базой данных, запуская динамически сгенерированный запрос. Все было в порядке, когда я заметил проблемы с кодированием в нескольких строках в одной таблице, поэтому я забрал его из резервной копии и перестроил таблицу.

После этого действия 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); 

Вещи, которые я проверял:

  • проверенные учетные данные, используемые скриптом;
  • запускать тот же запрос с разными параметрами – тот же результат;
  • запускать другие запросы с помощью обоих методов – тот же результат;
  • пробовал работать без backquotes – тот же результат;
  • перестроенные таблицы из php-скрипта – не помогли;
  • обезжиренные таблицы дампов в html – они актуальны;
  • сравнение html табличных дампов и отвалов cli – они похожи;
  • проверено, влияют ли запросы php на результаты, полученные с помощью команд cli – да, есть эффект (так что оба используют один и тот же сервер / базу данных)

У меня кончились идеи, где я ошибся и что исправить, поэтому я хочу занять ваше =) Даже самые сумасшедшие.

В чем проблема?

Где я ошибаюсь?

Может быть, это ошибка сервера? Я делю сервер nginx и хостинг с другими сайтами и программистами, и некоторые из них могут иметь доступ к моей базе данных.

Версия MySQL (): 5.6.29-76.2, PHP 5.5.9

Заранее спасибо.

EDIT: обработка 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 – 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; } 

Другой код – это проверка параметров, реализация однопользовательской системы и т. Д.

РЕДАКТИРОВАТЬ:

Вдохновленный этой записью: инструкция подготовки PDO и совпадение в логическом режиме

Я попытался привязать параметры, но это не помогло

Я пробовал совет Paul T. по поводу использования параметров в запросе напрямую в соответствии с его комментарием, но это тоже не помогло. Тем не менее, запрос, который я получил, успешно работает в CLI.

Solutions Collecting From Web of "PDO не возвращает результатов, тогда как командная строка MySQL возвращает ожидаемый результат"