Używam PDO do wstawienia rekordu (mysql i php)
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
Czy istnieje sposób, aby dowiedzieć się, czy wstawiono go pomyślnie, na przykład jeśli rekord nie został wstawiony, ponieważ był duplikatem?
Edycja: oczywiście mogę przeglądać bazę danych, ale mam na myśli automatyczne sprzężenie zwrotne.
if ($stmt->execute()) { //true }
PDOStatement->execute()
i sąPDOStatement->errorCode()
ze sobą całkowicie zgodne? Czy są jakieś okoliczności, w którychPDOStatement->errorCode()
coś ma, alePDOStatement->execute()
zwraca prawdę? Albo kiedyPDOStatement->execute()
zwraca fałsz, alePDOStatement->errorCode()
nic nie ma?Biorąc pod uwagę, że najbardziej zalecanym trybem błędu dla PDO jest
ERRMODE_EXCEPTION
, żadna bezpośredniaexecute()
weryfikacja wyników nigdy nie zadziała . Ponieważ wykonanie kodu nie osiągnie nawet stanu oferowanego w innych odpowiedziach.Tak więc istnieją trzy możliwe scenariusze obsługi wyniku wykonania zapytania w PDO:
try..catch
operatora.Dla zwykłego użytkownika PHP brzmi to trochę obco - jak to nie weryfikować bezpośredniego wyniku operacji? - ale tak właśnie działają wyjątki - sprawdzasz błąd gdzie indziej. Raz na zawsze. Niezwykle wygodny.
A więc w skrócie: w zwykłym kodzie nie potrzebujesz żadnej obsługi błędów. Po prostu zachowaj swój kod tak, jak jest:
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR); $stmt->bindParam(':field2', $field2, PDO::PARAM_STR); $stmt->execute(); echo "Success!"; // whatever
Jeśli się powiedzie, powie ci to, po błędzie pokaże ci zwykłą stronę błędu, którą twoja aplikacja wyświetla na taką okazję.
Tylko w przypadku, gdy masz scenariusz obsługi inny niż tylko zgłoszenie błędu, umieść instrukcję insert w
try..catch
operatorze, sprawdź, czy to był oczekiwany błąd i obsłuż go; lub - jeśli błąd był inny - wyślij ponownie wyjątek, aby umożliwić obsługę błędu w całej witrynie w zwykły sposób. Poniżej znajduje się przykładowy kod z mojego artykułu o obsłudze błędów w PDO :try { $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data); } catch (PDOException $e) { if ($e->getCode() == 1062) { // Take some action if there is a key constraint violation, i.e. duplicate name } else { throw $e; } } echo "Success!";
W powyższym kodzie sprawdzamy, czy konkretny błąd wykonuje jakąś akcję i ponownie zgłaszamy wyjątek dla dowolnego innego błędu (na przykład nie ma takiej tabeli), który zostanie zgłoszony programistowi.
Znowu - tylko po to, aby powiedzieć użytkownikowi coś w rodzaju „Twoja wstawka się powiodła”, żaden warunek nie jest nigdy potrzebny.
źródło
query()
funkcją? Czyquery()
zamiast tego mogę użyć try-catchprepared()->execute()
?Spróbuj spojrzeć na zwracaną wartość
execute
, która odnosiTRUE
się do sukcesu iFALSE
do porażki.źródło
Jeśli zapytanie aktualizujące zostanie wykonane z wartościami pasującymi do bieżącego rekordu bazy danych
$stmt->rowCount()
, zwróci wynik,0
jeśli nie dotyczy to żadnych wierszy. Jeśli maszif( rowCount() == 1 )
do przetestowania powodzenie, pomyślisz, że aktualizacja nie powiodła się, ale nie zawiodła, ale wartości były już w bazie danych, więc nic się nie zmieni.$stmt->execute(); if( $stmt ) return "success";
To nie zadziałało, gdy próbowałem zaktualizować rekord z unikalnym polem klucza, które zostało naruszone. Zapytanie zwróciło sukces, ale inne zapytanie zwróciło starą wartość pola.
źródło
if($stmt->execute() && ($stmt->rowCount()>0))
Możesz przetestować liczbę wierszy
$sqlStatement->execute( ...); if ($sqlStatement->rowCount() > 0) { return true; }
źródło
SELECT
zapytań (a nawet tam dokumentacja mówi o wielu zapytaniach). To nic nie mówi na tematDELETE
,INSERT
lubUPDATE
, co wydaje się być w porządku do pracy (pytanie było oINSERT
zapytaniu). Jednak jestem nowy w PDO i jeśli się mylę i ktoś ma inne referencje, napisz je tutaj. Jestem zainteresowany, aby sprawdzić, czy te 3 polecenia powyżej mają rzeczywiste wady.Użyj identyfikatora jako klucza podstawowego z automatyczną inkrementacją
przyrostowy identyfikator jest zawsze większy od zera nawet na pierwszym rekordzie, co oznacza, że zawsze zwraca prawdziwą wartość dla id coz większa niż zero oznacza prawdę w PHP
if ($insertid) echo "record inserted successfully"; else echo "record insertion failed";
źródło
PDOStatement-> execute () może zgłosić wyjątek
więc możesz zrobić
try { PDOStatement->execute(); //record inserted } catch(Exception $e) { //Some error occured. (i.e. violation of constraints) }
źródło