Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] walidacja formularza jak zrealizowac
Forum PHP.pl > Forum > Przedszkole
lnn
Mam nastepujacy problem, zrobilem formularz i za pomoca get pobiera link do kolejnego kroku, a kolejne kroki sa w case'ach :/
wiec nie bardzo walidowac w kolejnym kroku bo wyswietla sie tam juz formularz nastepny

Chcialbym zrobic tak ze jak ktos nacisnie przycisk "przejdz dalej" to najpierw sprawdzi poprawnosc jego uzupelnienia a nastepnie przejdzie ewentualnie do kolejnej strony, czy ktos wie jak to rozwiazac??

Wiem ze rozwiazaniem byloby zrobienie tego w jednym pliku bo moznaby nie przeladowywac strony tylko efekty walidacji pokazywalyby sie na formularzu ale chcialem zademonstrowac mechanizm dzialania sesji bo to strona na zaliczenie :/

DZieki za wszelkie wskazowki lub rozwiazania tego problemu
zordon
jesli dane z post ze strony nr 1 sa ok to na stronie nr 2 zapisujesz do sesji i przekierowujesz na strone nr 3 gdzie jest nastepny formularz.
jesli dane z post ze strony nr 1 nie sa ok to na stronie nr 2 zapisujesz do sesji, generujesz komunikat bledu i przekierowujesz na strone nr 1, gdzie wyswietlasz blad(tez moze byc z sesji) a do pol formularza wstawiasz dane z sesji(zeby ci nie przepadly)
lnn
czyli ze jak?

wysylam formularz 1 -> odbieram go na drugiej stronie -> sprawdzam -> wyswietlam ewentualne bledy + zapsuje to co odebrano do sesji.. -> generuje link do poprzedniej strony

a jak zablokowac zeby sie nie wyswietlil formularz 2 dopoki dane nie beda ok??
  1. if (sprawdzenie danych z 1 formularza) {
  2. // komunikat bledu
  3. } else {
  4. // wyswietlenie 2 formularza
  5. }

to cos mi sie zdaje ze lepiej byloby juz wywolac wszystko na jednej stronie i wyswietlac ewentualne bledy na danej stronie przy polu.. :/
moze ktos wie jak to JavaScript zrealizowac na poszczegolnych podstronach?
Drohan
kod dodaj do 2 pliku
  1. if (!$_GET['value'] )
  2. {
  3. echo "UZUPEŁNIJ WSZYSTKIE POLA !! <br> <a href=\"strona1.php\">Powrót do ankiety</a> ";
  4.  
  5. }
  6. else{
  7.  
  8. dalsz część kodu
  9.  
  10. }
  11.  


o to CI chodziło?
bastard13
A czy ta walidacja musi być koniecznie w phpie? Dużo lepszym rozwiązaniem byłoby walidować przez JavaScript, a potem ewentualnie go przesyłać:
  1. <form name="kroczek" action="akcja.php" method="$_GET">
  2. <input type="hidden" name="krok" />
  3. Jaki krok:<input type="text" name="dane" />
  4. <input type="button" onclick="sprawdz()" value="PRZEŚLIJ">
  5. </form>
  6. //i funkcja w JS
  7. function sprawdz()
  8. { x=window.document.kroczek;
  9. //w miejscu 'dobre dane' sprawdzasz pole 'dane' np. if(x.dane.value!="")
  10. if(dobre dane) { x.krok.value=x.dane.value; x.submit(); }
  11. else x.dane.value="Dane nieprawidłowe";
  12. }

Po prostu nie obciążasz niepotrzebnie serwera.
lnn
wlasnie chcialem uzyc JS ale nie bardzo go znam, ale znalazlem gotowe rozwiazanie

http://republika.onet.pl/2563,34,1,,fabryka.html

  1. testFormularza={
  2. rodzajePol:{
  3. niepuste:[/.+/,'Proszę wypełnić pole'],
  4. email:[/^[\w\.-]{2,}@[\w\.-]+\.[a-z]{2,5}$/,'Proszę podać prawidłowy adres e-mail'],
  5. liczbacalkowita:[/^\d+$/,'Prawidłową wartością tego pola jest liczba całkowita'],
  6. liczbarzeczywista:[/^(\d+|\d+,\d+)$/,'Proszę podać liczbę rzeczywistą (można użyć przecinka)'],
  7. data:[/^\d+\-\d+\-\d{4}$/,'Proszę wpisać datę w formacie DD-MM-RRRR (numer dnia-numer miesiąca-rok) np. 23-02-2003'],
  8. kodpocztowy:[/^\d{2}\-\d{3}$/,'Proszę podać kod pocztowy np. 06-600'],
  9. m20m100:[/^.{20,100}$/,'Proszę wpisać nie więcej niż 100 znaków, ale też nie mniej niż 20.'],
  10. duzelitery:[/^[A-Z]+$/,'Proszę używać wyłšcznie dużych liter w tym polu'],
  11. url:[/^http\:\/\/.+\.[a-z]{2,5}$/i,'Proszę podać prawidłowy adres strony www np. <a href="http://strona.pl'" target="_blank">http://strona.pl'</a>]
  12. },
  13. testuj:function(f){
  14. var i,rodz;
  15. for(i=0;i<f.elements.length;i++){
  16. E=f.elements[i];
  17. if(rodz=this.rodzajePol[E.getAttribute('rodzajpola')])
  18. if(!rodz[0].test(E.value)){
  19. E.focus();
  20. E.select();
  21. alert('"'+E.value+'" nie jest prawidłową wartością tego pola formularza!\n'
  22. +(E.getAttribute('komunikat')||rodz[1]));
  23. return false;
  24. }
  25. }
  26. return true;
  27. }
  28. }

z tym ze atrybut
  1. rodzajpola=""
  2. <!--- najlepiej zamienic na cos zgodnego z W3C np. --->
  3. id=""
Pilsener
Po co JS? To bez sensu - poczytaj o formularza wieloetapowych, dane gromadzisz dodając do formularza pola typu:
  1. <input type="hidden" name="etap1" value="12345" />


Możesz przeprowadzić walidację na dowolnym etapie, bo za każdym wysłaniem formularza masz kompletną tablicę POST. Jest to też ważne dlatego, że user może zechcieć sie cofnać a w wypadku błędu nie chce wypełniać formularza od nowa, najczęściej porzuca wtedy taką stronę psiocząc na amatorów, którzy ją robili.
lnn
Cytat(Pilsener @ 20.01.2010, 10:14:31 ) *
Po co JS? To bez sensu - poczytaj o formularza wieloetapowych, dane gromadzisz dodając do formularza pola typu:[/url]

Możesz przeprowadzić walidację na dowolnym etapie, bo za każdym wysłaniem formularza masz kompletną tablicę POST. Jest to też ważne dlatego, że user może zechcieć sie cofnać a w wypadku błędu nie chce wypełniać formularza od nowa, najczęściej porzuca wtedy taką stronę psiocząc na amatorów, którzy ją robili.

akurat o formularzach wieloetapowych nic nie znalazlem, gromadzilem dane poprzez serialize($_POST) i to wczytuje do sesji, tylko szkopuł w tym, że nie wiem jak ktoś zrobi krok wstecz wczytać te dane do formularza spowrotem :/ zeby nie musial 2 raz klepać.

w JS dlatego, żeby nie obciazac serwera, poza tym moge sprawdzic rozne rzeczy takie jak w PHP. Praca jest edukacyjnie robiona i musze ja skonczyc zeby oddac takze jak narazie ma tylko dzialac w miare ok.

Plan byl taki, że jesli ktos cos doda to pozniej w panelu moze sobie edytowac to jeszcze lub ew. usunac wpis.
Pilsener
Krok wstecz robi się tak:
1. Ustawiasz nagłówki tak, by przeglądarka zapamiętywała formularz lub
2. Robisz to ciastkiem (w końcu to ma być jedynie lepsza funkcjonalność)

Serializacja ma sens i owszem, by zapisać ciacho a sesji nie musisz używać wcale. Przy edycji po prostu wczytujesz aktualny stan bazy i porównujesz to z POST, które nadpisuje stan bazy (są funkcje tablicowe do tego).
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.