Това е така, защото $pdo->errorInfo()
се отнася до последното изявление, което е било успешно изпълнено. Тъй като $sql->execute()
връща false, тогава не може да се отнася до това изявление (или към нищо, или към заявката преди това).
Относно защо $sql->execute()
връща false, не знам... или има проблем с вашия $params
масив или с връзката с вашата база данни.
Забележка:Ръководството за PHP (http://php.net/manual/en/pdo .errorinfo.php
) не дефинира точно какво означава "последна операция върху манипулатора на базата данни", но ако имаше проблем с параметрите на свързване, тази грешка щеше да възникне в PDO и без никакво взаимодействие с базата данни. Безопасно е да се каже, че ако $pdo->execute()
връща true
, че $pdo->errorInfo()
е валиден. Ако $pdo->execute()
връща false
, поведението на $pdo->errorInfo()
не е изрично ясно от документацията. Ако си спомням правилно от моя опит, execute връща true
, дори ако MySQL върне грешка, връща false
ако не е извършена операция. Тъй като документацията не е специфична, може да е специфична за db драйвер.
Този отговор отразява практическия опит към момента на написването му през септември 2012 г. Както потребителят посочи, документацията не потвърждава изрично тази интерпретация. Освен това може да отразява само конкретната реализация на драйвера на базата данни, но винаги трябва да е вярно, че ако $pdo->execute()
връща true
, че $pdo->errorInfo()
е валидно.
Може също да искате да зададете PDO::ERRMODE_EXCEPTION във вашата последователност на свързване. Обработката на изключения прави ненужно проверката и заявката за грешката.
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );