Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP5] Obsługa kilku wyjątków na raz
Forum PHP.pl > Forum > PHP
lorak110786
Mam jakiś formularz. Jeśli któreś pole jest puste, źle uzupełnione itp wyrzucam wyjątek. Problem jest taki, że jeśli kilka pól jest źle uzupełnionych to wyrzucony zostanie tylko pierwszy wyjątek, o reszcie się nie dowiem. Czy jest jakaś metoda na to żeby zebrać wszystkie wyjątki i wywalić je na końcu w catch{}? Jedynym sensownym pomysłem na jaki wpadłem jest utworzenie sobie tablicy z wyjątkami i użycie throw tylko jeśli na koniec sprawdzania formularza okaże się że tablica jest niepusta. Coś podobnego opisane jest tu:

http://www.bigresource.com/Tracker/Track-php-FmXfN41Z/

Ma ktoś na to jakąś inną metodę?
Grand93
A nie prościej było by to zrobić z IF ?
$tablica = array();
$err = 0;
if(!$_POST['imie']){
$tablica[] = 'Imię nie zostało wprowadzone';
$err++;
}
if(!$_POST['nazwisko']){
$tablica[] = 'Nazwisko nie zostało wprowadzone';
$err++;
}
if($err){
/* przetwarzanie błędów */
}

wiem że to trochę prostackie rozwiązanie, ale niezawodne smile.gif
Luneth
Albo oznaczyć jakąś czerwoną gwiazdką whatever i podpisać to jako pola wymagane, a najwyżej alarmować komunikatem uniwersalnym: "wymagane pola nie zostały wypełnione" smile.gif lub metoda Grand93 przedstawiona powyżej. Ogólnie wyjątki służą chyba wyższym celom, np kiedy zapytanie się sypnie albo gdy wskazany rekord nie istnieje, takie rzeczy smile.gif
Crozin
Proste: wyrzucany przez walidator wyjątek nie powinien przerywać sprawdzania poprawności pól. Wyłap go sobie wcześniej wewnątrz jakiejś pętli, która sprawdza po kolei wszystkie pola formularza i zrób sobie z nim co tam chcesz. Potem możesz sprawdzić czy jakikolwiek wyjątek został wyrzucony. Jeśli nie oznacza to poprawne wypełnienie formularza.
Grand93
@Luntech - ale żeby tak zrobić i tak musi wiedzieć co nie zostało wypełnione, więc i tak musi użyć IF,
Zgodzę się z Tobą natomiast, że wyjątki służą do wyższych celów, a mianowicie do wyłapywania błędów krytycznych, które uniemożliwiły by korzystanie z web aplikacji, strony.

@Crozin - i jak według Ciebie ma to zrobić ? Dać w pętli Throw new Exception ? I jak tak w ogóle da się to w ten sposób na pętli zrobić ?

Robiąc to for musi mieć albo tablicę $_POST pola ponazywane np. formularz_1( a na ogół nazywa się name, surname etc. ), aby działało na for smile.gif

Jeżeli się mylę - poprawcie mnie smile.gif
kreciko
Zrób walidację w javascripcie. Tego uczyli mnie na studiach.
Luneth
@Grand93 - nie Luntech tylko Luneth biggrin.gif Poza tym nie powiedziałem, żeby nie używał ifów, moja rada od Twojej różniła się tym, że nie musi robić instrukcji warunkowej dla każdego pola. A to co crozin opisał to wykonalne jest, pod warunkiem że pętlę wsadzimy w try i przechwycimy wyjątek.

@kreciko - jakie studia, kierunek, uczelnia? (zwykła ciekawość smile.gif)
Grand93
@ Luneth sorki za błąd smile.gif. Sądzę że nie potrzeba używać ( aż ) Exception do obsługi formularza smile.gif

@ Kreciko - Walidacja danych w JS ( na poziomie przeglądarki ) może służyć TYLKO I WYŁĄCZNIE jako dodatek.
Dlaczego ? A no dlatego, że choćby nawet ktoś może mieć wyłączonego JS, po drugie JS da się oszukać choćby konsolką w Chrome smile.gif
Po trzecie, jeżeli ktoś ominie sobie JS ( lub ma wyłączony ) i w polu na email wpisze xyz, to po prostu oszuka Twój systemik kontroli danych.

No i na koniec - czy tak, czy tak w PHP musisz zrobić sobie usuwanie niebezpiecznych znaków smile.gif ( chociaż to nie na temat )
Crozin
  1. while (...) {
  2. try {
  3. $formField->validate();
  4. } catch (ValidationException $e) {
  5. // Walidacja konkretnego pola nie powiodła się
  6. }
  7. }
Luneth
Grand93 - toż powiedziałem to samo smile.gif chodziło mi jedynie, że na upartego da się to zrobić na wyjątkach winksmiley.jpg
kreciko
Grand93@
Racja. Nie dopisałem do końca. Jednak wstępna walidacja zawsze przyśpiesza obsługę.
Luneth@
Politechnika Warszawska, dzienne, Informatyka
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.