Dzieje się tak, ponieważ $pdo->errorInfo()
odnosi się do ostatniej instrukcji, która została pomyślnie wykonana. Od $sql->execute()
zwraca wartość false, to nie może odnosić się do tego wyrażenia (ani do niczego, ani do wcześniejszego zapytania).
Dlaczego $sql->execute()
zwraca false, nie wiem... albo jest problem z twoimi $params
tablicy lub z połączeniem z bazą danych.
Uwaga:podręcznik PHP (http://php.net/manual/en/pdo .errorinfo.php
) nie definiuje dokładnie, co oznacza „ostatnia operacja na uchwycie bazy danych”, ale gdyby wystąpił problem z parametrami wiązania, błąd ten wystąpiłby wewnątrz PDO i bez interakcji z bazą danych. Można śmiało powiedzieć, że jeśli $pdo->execute()
zwraca true
, że $pdo->errorInfo()
jest ważna. Jeśli $pdo->execute()
zwraca false
, zachowanie $pdo->errorInfo()
nie wynika to wyraźnie z dokumentacji. Jeśli dobrze pamiętam z mojego doświadczenia, wykonanie zwraca true
, nawet jeśli MySQL zwrócił błąd, zwraca false
jeśli nie wykonano żadnej operacji. Ponieważ dokumentacja nie jest specyficzna, może być specyficzna dla sterownika db.
Ta odpowiedź odzwierciedla praktyczne doświadczenie, kiedy została napisana we wrześniu 2012 roku. Jak zauważył użytkownik, dokumentacja nie potwierdza wyraźnie tej interpretacji. Może również odzwierciedlać tylko konkretną implementację sterownika bazy danych, ale zawsze powinno być prawdą, że jeśli $pdo->execute()
zwraca true
, że $pdo->errorInfo()
jest ważny.
Możesz także ustawić PDO::ERRMODE_EXCEPTION w sekwencji połączenia. Obsługa wyjątków sprawia, że nie ma potrzeby sprawdzania i odpytywania błędu.
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );