![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
PDO oferuje 3 możliwości wyświetlania błędów:
- tryb cichy - brak komunikatów - ostrzeżenia - Warning: - wyjątki - Exception: Która z nich jest najodpowiedniejsza do budowy aplikacji i wydajna? Aktualnie używam wyjątków. Przejdźmy do sytuacji, gdzie redaktor wysyła formularz z artykułem. Nie może go utracić w razie błędu! W przypadku WYJĄTKÓW: Kod try { ... return 1; } catch(PDOException $e) { /*odeślij formularz z powrotem*/ } Nie wystarczy zamknąć tylko PDO::commit() w instrukcji TRY, aby nie zatrzymywać wykonywania się skryptu, gdy wystąpi błąd. Dotyczy to nawet PDO::prepare - przynajmniej dla SQLite. W tym przypadku powodem mogą być pewnie literówki, nieznane funkcje, itd... Gdy w try{} zamkniemy tylko commit(); - prawdopodobieństwo utraty danych z formularza jest raczej małe. Mimo tego należy rozważyć: brak kompatybilności SQLite / MySQL między wersjami, inne konfiguracje, czy nawet błąd w skrypcie? Czy zastąpienie wyjątków wyjątków trybem cichym lub ostrzeżeniami (dla celów debuggingu) jest dobrym rozwiązaniem, czy jednak stanowi to potencjalną lukę w bezpieczeństwie? Nie chodzi tu o związki między zapytaniami (zapytanie X konieczne do wykonania zapytania Y), bo od tego są transakcje - mam rację? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Kod if( $db->commit() ) { ... return 1; } else { /* błąd - odeślij formularz użytkownikowi */ } PS. Jeśli wyjątki są lepsze dla baz danych, podajcie konkretne argumenty przemawiające za nimi. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Są różne opinie. Wyjaśnię, o co mi właściwie chodzi. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Przykład: Fragment pliku - edycja sondy
Przejdźmy do $db->commit(). Czy baza danych zawsze wyrzuci błąd, gdy transakcja nie powiedzie się? Czy PDO zawsze automatycznie cofnie transakcję w przypadku błędu, czy trzeba użyć try{} catch(){}? Czy execute() i commit() zwracają FALSE, gdy rekord nie zostanie dodany - zarówno w SQLite i MySQL? Z jednej strony do powiązane ze sobą zapytania powinno wykonywać się w transakcjach. Z drugiej można o tym zapomnieć. Czy wg Was należy przerywać wykonywanie skryptu PHP, gdy wystąpi błąd bazy danych i dlaczego? Właściwie prawdopodobieństwo wystąpienia błędu w dobrze napisanej aplikacji jest małe, ale chyba lepiej zabezpieczyć się? Przeglądarka nie zawsze zapamiętuje dane, jakie użytkownik wpisał do formularza, dlatego serwer powinien go odesłać z powrotem. Try{} i catch{} przydaje się zawsze podczas tworzenia obiektu PDO. Wracając jednak do "ostrzeżeń": co w przypadku wyłączenia błędów na serwerze (gdy nawet error_reporting nie działa)? PS. Jeszcze 1 sytuacja. Pobieramy dane (np. news, temat) z bazy. Gdy obejmiemy zapytanie instrukcją try{}catch{}, PDO nie wyrzuci błędu, gdy rekord nie istnieje. I tak musimy skorzystać z instrukcji warunkowej IF: Kod if( ! $news = $res -> fetch(2) ) return;
Ten post edytował WebCM 18.03.2008, 20:05:25 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.10.2025 - 19:30 |