Подтвердить что ты не робот

Мое выражение PDO не работает

Это мой PHP sql-оператор, и он возвращает false, а var dumping

$password_md5 = md5($_GET['password']);
$sql = $dbh->prepare('INSERT INTO users(full_name, e_mail, username, password, password_plain) VALUES (:fullname, :email, :username, :password, :password_plain)');
$result = $sql->execute(array(
                    ':fullname' => $_GET['fullname'], 
                    ':email' => $_GET['email'], 
                    ':username' => $_GET['username'],
                    ':password' => $password_md5,
                    ':password_plain' => $_GET['password']));
4b9b3361

Ответ 1

Иногда ваш код PDO выдает ошибку типа Call to a member function execute() или аналогичную. Или даже без каких-либо ошибок, но запрос все равно не работает. Это означает, что ваш запрос не был выполнен.

Каждый раз при сбое запроса MySQL выдает сообщение об ошибке, объясняющее причину. К сожалению, по умолчанию такие ошибки не передаются в PHP, и все, что у вас есть, это молчание или загадочное сообщение об ошибке, упомянутое выше. Следовательно, очень важно настроить PHP и PDO для сообщения об ошибках MySQL. И как только вы получите сообщение об ошибке, вам будет легко решить проблему.

Чтобы получить подробную информацию о проблеме, вставьте следующую строку в код сразу после подключения

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

или добавьте этот параметр в качестве параметра подключения. После этого все ошибки базы данных будут преобразованы в исключения PDO, которые, если оставить их в покое, будут действовать как обычные ошибки PHP.

Существует очень небольшая вероятность того, что в случае какой-либо конкретной ошибки исключение не будет выдано. Если ваш вызов query()/prepare() или execute() возвращает false, но исключений нет, отметьте PDO::errorInfo() следующим образом:

 trigger_error("PDO errorInfo: ".$dbh->errorInfo());

Получив сообщение об ошибке, вы должны прочитать и понять его. Это звучит слишком очевидно, но учащиеся часто упускают из виду значение сообщения об ошибке. Тем не менее, в большинстве случаев это объясняет проблему довольно просто. Скажем, если он говорит, что конкретной таблицы не существует, вы должны проверить орфографию, опечатки, регистр букв, учетные данные и тому подобное. Или, если он говорит, что в синтаксисе SQL есть ошибка, то вам нужно проверить ваш SQL. И проблемное место находится прямо перед частью запроса, указанной в сообщении об ошибке.

Вы также должны доверять сообщению об ошибке. Если он говорит, что количество токенов не соответствует количеству связанных переменных, то это так. То же самое касается отсутствующих таблиц или столбцов. Учитывая выбор, будь то ваша собственная ошибка или сообщение об ошибке, всегда придерживайтесь первого. Опять же, это звучит снисходительно, но сотни вопросов на этом сайте доказывают, что этот совет чрезвычайно полезен.


Обратите внимание, что для того, чтобы увидеть ошибки PDO, вы должны иметь возможность видеть ошибки PHP в целом. Для этого необходимо настроить PHP в зависимости от среды сайта:

  • на сервере разработки очень удобно иметь ошибки прямо на экране, для которых необходимо включить отображение ошибок:

    error_reporting(E_ALL);
    ini_set('display_errors',1);
    
  • в то время как на живом сайте все ошибки должны регистрироваться, но никогда не показываться клиенту. Для этого настройте PHP следующим образом:

    error_reporting(E_ALL);
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);
    

Обратите внимание, что error_reporting должен быть установлен на E_ALL все время.

Также обратите внимание, что несмотря на распространенное заблуждение, не нужно использовать try-catch для сообщения об ошибках. PHP уже сообщит вам об ошибках PDO, и в лучшем виде. Необработанное исключение очень хорошо для разработки, но если вы хотите показать настроенную страницу ошибки, все равно не используйте для этого попытку catch, а просто установите специальный обработчик ошибок. Короче говоря, вам не нужно рассматривать ошибки PDO как нечто особенное, а рассматривать их как любую другую ошибку в своем коде.

P.S.
Иногда нет ошибок, но нет и результатов. Тогда это означает, что нет данных, соответствующих вашим критериям. Таким образом, вы должны признать этот факт, даже если вы можете поклясться, что данные и критерии в порядке. Они не. Вы должны проверить их снова. У меня есть статья, которая может помочь в этом вопросе, Как отладить взаимодействие базы данных с PDO. Просто следуйте этой инструкции шаг за шагом и либо решите свою проблему, либо ответьте на вопрос Кару.