Мое заявление PDO не работает

Это мой PHP-оператор SQL, и он возвращает ложь во время дампа var

$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']));

Всего 1 ответ


Если оператор PDO возвращает FALSE , это означает, что запрос не выполнен. Вы должны установить PDO в правильном режиме сообщения об ошибках, чтобы знать об ошибке.

Поместите эту строку в свой код сразу после подключения

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

Получив сообщение об ошибке, вы должны прочитать и понять его. Это звучит слишком очевидно, но ученики часто упускают из виду крайнюю полезность сообщения об ошибке. Тем не менее, в большинстве случаев это объясняет проблему довольно просто. Скажем, если говорится, что конкретной таблицы не существует, вы должны проверить орфографию, опечатки, регистр букв, учетные данные и тому подобное. Или, если он говорит, что в синтаксисе 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 .

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


Есть идеи?

10000