Я работал с базой данных, запуская динамически сгенерированный запрос. Все было в порядке, когда я заметил проблемы с кодированием в нескольких строках в одной таблице, поэтому я забрал его из резервной копии и перестроил таблицу.
После этого действия 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);
Вещи, которые я проверял:
У меня кончились идеи, где я ошибся и что исправить, поэтому я хочу занять ваше =) Даже самые сумасшедшие.
В чем проблема?
Где я ошибаюсь?
Может быть, это ошибка сервера? Я делю сервер 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.