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

PDO SQL-состояние "00000", но все же ошибка?

Может кто-нибудь объяснить, почему

$sql->execute($params);

возвращает FALSE, тогда как

print $pdo->errorCode();
print_r($pdo->errorInfo());

оба возвращают SQLSTATE 00000, что означает в соответствии с успешностью документации? Это INSERT, и ничто фактически не вставляется в базу данных... поэтому, почему я получаю сообщение об успешном завершении от SQLSTATE?


В случае, если это помогает, это код...

$sql = $pdo->prepare("
        INSERT INTO user (
            username, fname, pass, salt, email,
            loc_id_home, country_id_home, region_id_home,
            cont_id_home, timestamp_reg, timestamp_upd, timestamp_lastonline, 
            online_status, gender, birthdate
            )
        VALUES (
            :username,:fname,:pass,:random_salt,:email,
            :loc_id_home,:country_id_home,:region_id_home,
            :cont_id_home,'".time()."','".time()."','".time()."',
            1,:gender,:birthdate)
        ");

$params=array(
    ':username'=>$username,
    ':fname'=>$fname,
    ':pass'=>$pass,
    ':random_salt'=>$random_salt,
    ':email'=>$email,
    ':loc_id_home'=>$loc_id_home,
    ':country_id_home'=>$country,
    ':region_id_home'=>$region,
    ':cont_id_home'=>$continent,
    ':gender'=>$gender,
    ':birthdate'=>$birthdate
);  

$sql->execute($params);

print $pdo->errorCode();
print_r($pdo->errorInfo());
4b9b3361

Ответ 1

Это потому, что $pdo->errorInfo() относится к последнему оператору, который был успешно выполнен. Поскольку $sql->execute() возвращает false, он не может ссылаться на этот оператор (ни к чему-либо, ни к запросу раньше).

Что касается того, почему $sql->execute() возвращает false, я не знаю... либо есть проблема с вашим массивом $params или с вашим подключением к базе данных.

PDO:: errorCode - выбор SQLSTATE, связанный с последней операцией в дескрипторе базы данных

Примечание. Руководство по PHP (http://php.net/manual/en/pdo.errorinfo.php) не определяет точно, что означает "последняя операция в дескрипторе базы данных", но если возникла проблема с параметрами привязки, эта ошибка произошла внутри PDO и без какого-либо взаимодействия с базой данных. Можно с уверенностью сказать, что если $pdo- > execute() возвращает true, это значение является $pdo- > errorInfo(). Если $pdo- > execute() возвращает false, поведение $pdo- > errorInfo() не явствует из документации. Если я правильно помню из своего опыта, выполнение возвращает true, даже если mysql возвратил ошибку, возвращает false, если операция не была выполнена. Поскольку документация не является конкретной, это может быть конкретный драйвер db.

Этот ответ отражает практический опыт, когда он был написан в сентябре 2012 года. Как указал пользователь, в документации явно не подтверждается эта интерпретация. Он также может отражать только конкретную реализацию драйвера базы данных, но всегда должно быть правдой, что если $pdo- > execute() возвращает true, это значение $pdo- > errorInfo() действительно.

Вы также можете установить PDO:: ERRMODE_EXCEPTION в своей последовательности подключения. Обработка исключений делает ненужным проверять и запрашивать ошибку.

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

Ответ 2

Я столкнулся с аналогичной проблемой,

Это происходит из-за ошибки в запросе, попробуйте запустить ваш запрос в php-myadmin или любом другом запросе и подтвердить, что ваш запрос работает.
Даже если наш синтаксис запроса верен, другие простые ошибки, такие как отказ от null или not mentioan, столбец, который задает значение null в структуре таблицы, вызовет эту ошибку. был ошибкой, сделанным мной)

Как user1122069 объяснил причину $pdo- > errorInfo(), говорит, что ничего плохого может быть из-за

$pdo- > errorInfo() относится к последнему заявлению, которое было успешно выполнено казнены.
Так как $sql- > execute() возвращает false, то он не может ссылаться на этот оператор (ни к чему, ни к запросу раньше)

Надеюсь, это поможет:)

Ответ 3

Я получал эту ошибку за один раз. Я только получил его на одном сервере для всех сбоев. Другой сервер будет сообщать об ошибке правильно для тех же ошибок. Это привело меня к мысли, что это ошибка конфигурации клиента MySQL. Я никогда не решал конкретную ошибку, но проверяю ваши конфигурации.

Ответ 4

Из руководства php:

PDO:: ERR_NONE (строка) Соответствует SQLSTATE '00000', что означает, что оператор SQL был успешно выпущен без ошибок или предупреждений. Эта константа предназначена для вашего удобства при проверке ошибок PDO:: errorCode() или PDOStatement:: errorCode(), чтобы определить, произошла ли ошибка. Вы, как правило, знаете, если это так, изучив код возврата из метода, который все равно поднял условие ошибки.

Итак, похоже, что он вставлял запись. Проверьте последний идентификатор записи в таблице... возможно, вы просто пропустили его?

Ответ 5

Попробуйте проверить $sql на print_r() и скопируйте свой запрос, затем попробуйте результирующий запрос в phpMyadmin. Надежда получит причину. Там будет шанс на нерелевантную ценность.