Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Skrypt sprawdzający formularz - porady i ocena, Problem przy wyświetlaniu wartości pól formularza
tua1
post 29.10.2009, 00:09:14
Post #1





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.10.2009

Ostrzeżenie: (0%)
-----


Witam

Dopiero co raczkuje w PHP, na początek chciałem stworzyć skrypt walidujący prosty formularz.
Dane przekazywane są z formularza w postaci dwóch tablic: required i optional.

Mój problem polega na tym że po zatwierdzeniu formularza, wypełnione pola stają się na nowo puste,
a staram się wymusić żeby tak nie było.

Wszystko znajduje się w jednym pliku:

skrypt:

  1. <?php
  2.  
  3. $a_req = (array) $_POST['required'];
  4. //$a_opt = (array) $_POST['optional'];
  5. array_validate($a_req);
  6.  
  7. /*
  8. Przeprowadza walidację danych z tablicy.
  9. Wykonując kolejne funkcje pomocnicze, gdy poprzednia zakończy swoje
  10. działanie z powodzeniem.
  11.  
  12. @param $array - tablica z wartościami do walidacji
  13. @return true - jeśli całe sprawdzanie zakończyło się powodzeniem.
  14. */
  15. function array_validate($array) {
  16.  
  17. if (array_empty_val($array)) {
  18. echo 'Nie wszystkie pola są wypełnione!<br />';
  19. return false;
  20. }
  21. array_walk($array, 'disable_danger_chars');
  22. array_walk($array, 'show_array_value');
  23. return true;
  24. }
  25.  
  26. /*Usuwa z przekazanej zmiennej znaki mogące zniszczyć
  27. strukturę strony itd. Dodatkowo dodając znak ucieczki w przypadku
  28. nie dokonania tego automatycznie.
  29.  
  30. @param $value - wartość do sprawdzenia
  31. */
  32.  
  33. function disable_danger_chars(&$value) {
  34. $value = htmlspecialchars($value);
  35. $value = addslashes($value);
  36. }
  37.  
  38. /*Sprawdza obecność pustych pól w tabeli.
  39. W zależności od stanu pola ustala wartość w tabeli zmiennych sesyjnych
  40. przy pomocy indeksu tego pola.
  41.  
  42. @return TRUE jeśli występują puste pola w tabeli
  43. */
  44.  
  45. function array_empty_val(&$array) {
  46. $has_empty = FALSE;
  47. foreach ($array as $key => &$value) {
  48. $value = trim($value);
  49. if (empty($value)) {
  50. $_SESSION[$key] = FALSE;
  51. $has_empty = TRUE;
  52. $a_empty_vals[] = $key;
  53. } else $_SESSION[$key] = TRUE;
  54. }
  55. return $has_empty;
  56. }
  57.  
  58. /*
  59.   Funkcja operująca na tablicy, przygotowana do przekazania funkcji array_walk().
  60. */
  61. function show_array_value($value, $key) {
  62. echo $key.'=>\''.$value.'\'<br />';
  63. }
  64.  
  65. function html_warn_msg($value) {
  66. static $msg = "<tr><td colspan=2 align=center><b>Powyższe pole jest wymagane</b></td></tr>";
  67. if (isset($_SESSION[$value])) echo $msg;
  68. }
  69.  
  70. function show_val_by_key($key, $flag=TRUE) {
  71. if ($flag) {
  72. if (isset($a_req[$key])) echo $a_req[$key];
  73. }
  74. // else to samo w przypadku tabeli optional.
  75. }
  76.  
  77. ?>
  78.  


formularz html:

  1. <form id="register_frm" action="" method="post">
  2. <table id="frm_tbl">
  3. <caption>Formularz Rejestracyjny</caption>
  4. <tr>
  5. <th>Identyfikator</th>
  6. </tr>
  7. <tr>
  8. <td><label for="login">Login</label></td>
  9. <td><input type="text" name="required[login]" id="login" maxlength="50" value="<?php show_val_by_key('login') ?>"/></td>
  10. </tr>
  11. <?php html_warn_msg('login') ?>
  12. <tr>
  13. <td><label for="pass">Hasło</label></td>
  14. <td><input type="password" name="required[pass]" id="pass" maxlength="50" /></td>
  15. </tr>
  16. <tr>
  17. <td><label for="pass2">Powtórz hasło</label></td>
  18. <td><input type="password" name="required[pass2]" id="pass2" maxlength="50"/></td>
  19. </tr>
  20. <tr>
  21. <td><label for="email">E-mail</label></td>
  22. <td><input type="text" name="required[email]" id="email" maxlength="50"/></td>
  23. </tr>
  24. <tr>
  25. <td><label for="email2">Powtórz E-mail:</label></td>
  26. <td><input type="text" name="required[email2]" id="email2" maxlength="50"/></td>
  27. </tr>
  28. <tr>
  29. <th>Dane Personalne</th>
  30. </tr>
  31. <tr>
  32. <td><label for="name">Imię</label></td>
  33. <td><input type="text" name="required[name]" id="name" maxlength="50" value="<?php show_val_by_key('name') ?>"/></td>
  34. </tr>
  35. <?php html_warn_msg('name') ?>
  36.  
  37. <tr>
  38. <td><label for="surname">Nazwisko</label></td>
  39. <td><input type="text" name="required[surname]" id="surname" maxlength="50" value="<?php show_val_by_key('surname') ?>"/></td>
  40. </tr>
  41. <?php html_warn_msg('surname') ?>
  42. <!-- inne pola -->
  43. <tr>
  44. <td colspan="2" align="left"><input type="reset" name="reset_btn" value="Wyczyść"/></td>
  45. </tr>
  46. <tr>
  47. <td colspan="2" align="right"><input type="submit" id="submit_btn" value="Rejestruj"/></td>
  48. </tr>
  49. </table>
  50. </form>



Proszę o porady.


Go to the top of the page
+Quote Post
lamcpp
post 29.10.2009, 00:28:14
Post #2





Grupa: Zarejestrowani
Postów: 372
Pomógł: 2
Dołączył: 10.05.2009

Ostrzeżenie: (0%)
-----


szczerze nie wczytuje się w te funkcje, ale jeśli chcesz by po wypełnieniu formularza pola nie były puste musisz dodać w polach formularza np. tu:
Kod
<td><input type="password" name="required[pass2]" id="pass2" maxlength="50"/></td>

opcję value,
w ten sposób:
  1. value="<?php if(isset($_POST['pass'])) echo $_POST['pass']; ?>"

oczywiśćie przykład z hasłem nie najlepszy, ale to tylko przykład:)

Ten post edytował lamcpp 29.10.2009, 00:29:51
Go to the top of the page
+Quote Post
thek
post 29.10.2009, 00:56:50
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Wszystko zależy od Twojego podejścia do formularza. Brak pliku w action sugeruje, że całość walidacji i przetwarzania jest wykonywana w tym samym pliku. Jeśli tak to znaczy, że po otworzeniu strony po raz pierwszy nie masz nic, ale jeśli dałeś Submit i jest to przeładowanie, to masz dostęp do zmiennej $_POST lub jej odpowiednika jeśli używasz programowania obiektowego i masz to w jakiś sposób w nim zaszyte. Jeśli jest to proste to rozwiązaniem jest pomysł kolegi, czyli wpisujesz do value zmienne POST. Jeśli robisz to obiektowo, to przekazujesz do formularza obiekt z wartościami domyślnymi value tych pól. Tyle, że po wciśnięciu Submit w owym obiekcie wartości domyślne zostają zastąpione wartościami z POST, przy czym w takiej sytuacji mogą one już być w postaci poprawionej przez system walidacji. Przykładowo:
  1. <?php
  2. $form = array ('example1' => 'domyślna', 'example2' => 'domyślna', 'example3' => 'domyślna');
  3. $error =array();
  4. if( array_key_exists('send', $_POST) ) {
  5. $form['example1'] = validation( $_POST['example1'] );
  6. $form['example2'] = validation( $_POST['example2'] );
  7. $form['example3'] = validation( $_POST['example3'] );
  8. //a tutaj zrobisz sobie co tam jeszcze chcesz z tymi danymi
  9. }
  10. ?>
  11. <form action="" method="post" name="simple_form">
  12. <?php show_error( $error['example1'] ) ?>
  13. <input type="text" name="example1" value="<?php echo $form['example1']; ?>" />
  14. <?php show_error( $error['example2'] ) ?>
  15. <input type="text" name="example2" value="<?php echo $form['example2']; ?>" />
  16. <?php show_error( $error['example3'] ) ?>
  17. <input type="text" name="example3" value="<?php echo $form['example3']; ?>" />
  18. <input type="submit" name="send" value="Wyślij" />
  19. </form>
Dałem Ci taki zarys jak by to mniej więcej mogło być proceduralnie rozwiązane. Zauważ, że przygotowuje sobie już tam grunt pod komunikaty błędów itp. A w zależności od tego czy ktoś posłał formularz, zmieniają się wartości pól. Oczywiście to tylko zgrubne, byś widział JAK by to mogło wyglądać, bo osobiście nieco bym tam pozmieniał pod kątem innego rozwiązania walidacji, systemu komunikatów błędów i kilku rzeczy ale poza tym sam szkielet jest już prawidłowy i róznica będzie tylko drobna w implementacji smile.gif

@down: Owszem... To tylko przykład. To jak postąpisz z polami w walidacji zależy od piszącego. Ja rozbiłem na osobne by zilustrować, że należy to zrobić i w mniej więcej jakim miejscu skryptu niż to, że w ten sposób. Wspominając o tym, że inaczej bym rozwiązał walidację miałem na myśli właśnie przekazanie albo całości, albo pozostawienie na poziomie rozbitym, ale potratowanie od razu pól uniwersalną funkcją (zamiast robić to dopiero na poziomie głównej funkcji walidującej), która je zwaliduje mając określone parametry zmieniające jej zachowanie w stylu $pole = validate( $pole, 'valid_email'), $pole = validate($pole, 'valid_text', 150) czy $pole = validate( $pole, 'required') by uzyskać łatwo rozszerzalny formularz. Dlatego też pisałem że szkielet powinien być mniej więcej podobny, choć mogą zaistnieć różne implementacje Przykładowo wyświetlanie błędów. Wielu robi je zbiorczo na górze formularza. Według mnie to mylące bo trzeba potem szukać gdzie dano pole jest. Lepiej oznaczyć pola z błędem w jakiś sposób. Czy to kolorem, czy komunikatem, ale nie u góry całości, ale bezpośrednio nad/pod tymże polem.Widze, że też podobnie podchodzisz do sprawy.

Co do walidacji znów, to sprawdzanie pól obowiązkowych już na starcie strony może Ci błędy powodować. O ile nie sprawdzasz czy zmienna POST istnieje, a z kodu php przytoczonego nie można tego wywnioskować(choć już sprawdzanie pól jest, ale w metodzie wyświetlającej). To samo tyczy się value. W całym kodzie html nie masz w części kodu nadawania im jakichś wartości, więc lamcpp nie powinien być za to przez Ciebie rugany. Nie masz tego w kodzie = nie stosujesz tego = można Ci to podsunąć jako rozwiązanie. Proste smile.gif Z kodu jaki podałeś wynika, że:
1) konwertujesz do tablicy formularz (wspominasz, że takie 2 będą - required i optional) i walidujesz
2) masz kilka funkcji w tym jedną wyświetlającą i nawet stosujesz ją w kilku przypadkach, tyle że potrzebuje ona jakichś danych, których zwyczajnie nie masz przez część życia formularza i dodatkowo tylko w części z nich stosujesz wyświetlanie. To zrozumiałe, że olewasz value dla password, ale email już może ją mieć.
3) zauważ, że nie masz nigdzie czegoś takiego jak dane domyślne. Jeśli jest to rozwiązane tak, że sprawdzanie jest na początku to próbujesz metody wyświetlające wywołać dla tablicy $required, której struktury na moment wejścia na stronę formularz i skrypt nawet nie znają. Dlatego ja mam na samym starcie ją utworzoną i zainicjowaną jako $form i dopiero po walidacji i przetwarzaniu przypisuje do niej przetworzone $_POST. To czy przypiszę każde pole z osobna czy może po prostu $form = $_POST zależy od tego co zrobiłem podczas walidacji z nimi.
4) widzę, że masz isset dla wyświetlania więc teoretycznie punkt 3 można by nawet sobie odpuścić. To bardziej moje podejście do problemu, by unikać ciągłego sprawdzania zawartości. Chciałem jednak rozdzielić tablicę post i wartości formularza wyświetlane, te bowiem nie zawsze są takie same.
5) myślę, że pewnym ułatwieniem byłoby dla Ciebie takie zmienienie funkcji walidującej by to ona decydowała co jest, a co nie jest opcjonalne. W ten sposób upraszczasz sobie zapis bo wyskakujesz z tablic required i optional.

Ten post edytował thek 29.10.2009, 09:35:25


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 10.05.2025 - 07:49