Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]sprawdzenie, czy wypełniono pola formularza - problem
Forum PHP.pl > Forum > Przedszkole
hyhyhy
Mam taki problem: mam stronę z dość obszernym formularzem (generator quizu) no i chciałbym uniemożliwić pozostawienie pustych pół. Mam dwa kody: jeden działający i jeden nie. Ten drugi dotyczy większej liczby elemtntów, ale wydaje mi się taki sam, czy ktoś mógłby mi podpowiedzieć, co jest nie tak? Dodam, że problem jest taki, że IF się nie wykonuje (tzn zachowuje się tak, jakby $wypelniono zawsze mialo true, nawet kiedy pola są kompletnie puste)

kod, który działa:
  1. $wszystko_wpisane = true; //-------
  2. for ($x=0;$x<10;$x++)
  3. {
  4. trim($tekst[$x]);
  5. $tekst[$x] = mysql_real_escape_string(htmlspecialchars($tekst[$x]));
  6. if (empty($tekst[$x]) == true) {$wszystko_wpisane = false;}
  7. }
  8.  
  9. if ($wszystko_wpisane == false) {echo 'Blad! uzupelnij wszystkie pola!';}
  10. else { //jesli uzupelniono, dalsze instrukcje


No i teraz na tej podstawie zrobiłem kod, z którym mam problem:

  1. function sprawdzanie($liczba_obiektow, $obiekt)
  2. {
  3. for ($q=0;$q<$liczba_obiektow;$q++)
  4. {
  5. if (empty($obiekt[$q]) == true) {$wypelniono = false;}
  6. }
  7. return $wypelniono;
  8. }
  9.  
  10. $wypelniono = true;
  11. sprawdzanie($liczba_pyt, $pytanie[$q]);
  12. sprawdzanie($liczba_odp, $odpowiedz[$q]);
  13. sprawdzanie($liczba_wynik, $wynik[$q]);
  14.  
  15. if ($wypelniono == true)
  16. { dalsze instrukcje - wykonują się zawsze, nigdy nie wchodzi else}
  17. else { echo 'Blad, uzupelnij wszystkie pola!';}


Czy ktoś mógłby mnie naprowadzić? Bo nie widzę różnicy między nimi dwoma, a tylko drugi nie działa...
Zagiewa
Mogę się mylić ale pętla for zwraca false albo true i zapisuje ją do zmennej $wypelniono po czym zwracasz ją za pomocą return. Zaraz pod pętlą niepotrzebnie zmieniasz wartość zmiennej $wypelniono na true. Bo wtedy zawsze wartość nadana przez pętlę będzie zmieniona na true. Więc usuń to: $wypelniono = true; i powinno działać smile.gif ew. zmień kod na taki:
  1. function sprawdzanie($liczba_obiektow, $obiekt)
  2. {
  3. for ($q=0;$q<$liczba_obiektow;$q++)
  4. {
  5. if (empty($obiekt[$q])) {
  6. $wypelniono = false;
  7. }else {
  8. $wypelniono = true;
  9. }
  10. }
  11. return $wypelniono;
  12. }
  13.  
  14. sprawdzanie($liczba_pyt, $pytanie[$q]);
  15. sprawdzanie($liczba_odp, $odpowiedz[$q]);
  16. sprawdzanie($liczba_wynik, $wynik[$q]);
  17.  
  18. if ($wypelniono == true)
  19. { dalsze instrukcje - wykonują się zawsze, nigdy nie wchodzi else}
  20. else { echo 'Blad, uzupelnij wszystkie pola!';}
hyhyhy
I nic, niestety smile.gif jak usuwam $wypelniono = true to mowi ze nie wypelniono, jak zostawiam to mimo wszystko mowi mi ze pola sa wypelnione.

@Zagiewa:
Próbowałem, i wtedy zawsze jest "błąd, nie wypełniłeś wszystkich pól"
Zagiewa
Spróbuj wykorzystać ten kod który przerobiłem, on od razu wypełnia zmienną wartością true albo false w zależności od tego co zwróci warunek
Valdi_B
Wynik zwracany przez funkcję sprawdzanie musisz odczytać w programie głównym.
Do tej pory ten wynik "leci w próżnię".
Może tak:
$wypelniono &&= sprawdzanie(...);
czyli "kumulatywne zerowanie" zmiennej $wypelniono?

Druga możliwość: w funkcji dodaj:
globals $wypelniono;
bo tak jak jest to zmienna $wypelniono jest w funkcji zmienną lokalną.
hyhyhy
Dalej nie działa, nie mam pojęcia, co to może być, wygląda to tak:

  1. PYTANIA
  2. Array ( [0] => q [1] => q [2] => q [3] => q [4] => q )
  3. ODPOWIEDZI
  4. Array ( [0] => q [1] => q [2] => q [3] => q [4] => q [5] => q [6] => q [7] => q [8] => q [9] => q [10] => q [11] => q [12] => q [13] => q [14] => q )
  5. WYNIK
  6. Array ( [0] => f [1] => fb [2] => fbf )
  7.  
  8.  
  9. nie wypelniono wszystkich pol!
sadistic_son
Do sprawdzania czy coś jest RUE czy FALSE używa się operatora === sprawdzającego typ danych.
Valdi_B
Jeszcze jedno spostrzeżenie co do Twojego kodu:
Zaraz po deklaracji funkcji sprawdzanie() masz jej wywołanie:
  1. sprawdzanie($liczba_pyt, $pytanie[$q]);
Zwróć uwagę, że zmienna $q jest to zmienna lokalna w powyższej funkcji, a tu - już nie jest określona.

Poza tym: Skoro w funkcji przeszukujesz tablicę obiektów, to parametrem do tej funkcji powinieneś podać całą tablicę, a nie jej któryś obiekt.
Spróbuj taki kawałek kodu:
  1. function sprawdzanie($liczba_obiektow, $obiekt) {
  2. globals $wypelniono;
  3. for ($q=0; $q<$liczba_obiektow; $q++) {
  4. if (empty($obiekt[$q])) {
  5. $wypelniono = false;
  6. }
  7. }
  8. }
  9.  
  10. $wypelniono = true;
  11. sprawdzanie($liczba_pyt, $pytanie);
  12. sprawdzanie($liczba_odp, $odpowiedz);
  13. sprawdzanie($liczba_wynik, $wynik);
  14.  
  15. if ($wypelniono) {
  16. <obsługa przypadku "OK">
  17. } else {
  18. echo 'Blad, uzupelnij wszystkie pola!';
  19. }

Edit:
Zakodowałem "podobny" formularz, z kilkoma polami:
<input type="text" name="tt[]" />
i co widzę w $_POST:
1. Dostaję tablicę $tt.
2. Pola które w formularzu zostawiłem puste w tej tablicy, ale z pustą treścią.

Wniosek:
W pętli nie korzystaj z empty() (bo element tablicy istnieje).
Sprawdzaj długość stringu w tym elemencie - strlen($obiekt[$q]);
thek
Ja nie widzę nigdzie przypisania tego co zwraca funkcja sprawdzająca. Zresztą lepiej by ciut było nieco inaczej funkcję sprawdzającą zrobić.
  1. function sprawdzanie( $tablica ) {
  2. if( is_array( $tablica ) && !empty( $tablica ) ) { //sprawdzamy czy to tablica i czy ma choć jeden element
  3. foreach( $tablica AS $element ) {
  4. $element = trim($element); // na wszelki wypadek usuwamy z elementu znaki puste
  5. if( empty( $element ) ) { return false; } //jeśli trafimy na element pusty to od razu możemy zakończyć funkcję z wynikiem negatywnym
  6. }
  7. return true;
  8. } else {
  9. return false;
  10. }
  11. }

Teraz musimy jedynie konkretne tablice sprawdzać.
  1. if( !sprawdzanie( $pytania ) ) { echo 'Nie uzupełnione pytania'; }
  2. if( !sprawdzanie( $odpowiedzi ) ) { echo 'Nie uzupełnione odpowiedzi'; }
  3. if( !sprawdzanie( $wyniki ) ) { echo 'Nie uzupełnione wyniki'; }
Oczywiście funkcja sprawdzająca będzie wyglądać inaczej jeśli masz inaczej zaprojektowaną strukturę danych, ale to już Twój problem bysobie odpowiednią napisać wink.gif
Prezi2907
Cytat(sadistic_son @ 28.02.2011, 19:48:56 ) *
Do sprawdzania czy coś jest RUE czy FALSE używa się operatora === sprawdzającego typ danych.

dla sprostowania

$a === $b
sprawdza czy identyczne
Prawda jeśli $a jest równe $b i są tego samego typu. (tylko PHP4)

Mogę się nie znać no ale...
Valdi_B
Wczorajszy post pisałem z myślą o kontroli odpowiedzi tekstowych (do pola trzeba coś wpisać).

Dopiero teraz skojarzyłem, że w formularzu masz chyba także pytania jednokrotnego wyboru (wybrać jeden z przycisków "radio").
W takich przypadkach kontrolować trzeba z grubsza tak jak miałeś na początku - czy jest dany element w tablicy.

Co do pól opcji - chyba nie ma jak kontrolować "czy wypełniono", bo oba warianty (zaznaczono / nie zaznaczono) to jest jakaś odpowiedź.

Załączam chodzący przykład z dwoma wariantami kontroli - pól tekstowych i grup pól opcji. Porównaj konwencję nadawania "name" polom, czy masz tak samo u siebie.
  1. <html>
  2. <head>
  3. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  4. <title>Pytania</title>
  5. </head>
  6.  
  7. <body>
  8. <?php
  9. // Sprawdź grupy przycisków "radio"
  10. function spr_rad($n, $tbl) {
  11. // Nie wybrano nic w grupie "i" -> elem. "i" nie ma w tabl.
  12. for ($i = 1; $i <= $n; $i++) {
  13. if (!isset($tbl[$i]))
  14. return false; // brak odp. na pyt. "i"
  15. }
  16. return true; // OK
  17. } // spr_rad
  18.  
  19. // sprawdź pola tekstowe (mogą mieć pustą treść)
  20. function spr_txt($tbl) {
  21. foreach ($tbl as $tt) {
  22. if (strlen($tt) == 0)
  23. return false; // brak odp.
  24. }
  25. return true; // OK
  26. } // spr_txt
  27.  
  28. // Jak wywołano stronę
  29. $rqm = $_SERVER['REQUEST_METHOD'];
  30.  
  31. if ($rqm == 'POST') {
  32. // czytaj dane z formularza
  33. $wyb = $_POST['wyb'];
  34. $pt = $_POST['pt'];
  35.  
  36. // echo '<pre>'; print_r($_POST); echo '</pre>';
  37.  
  38. $wyn = true; // wynik sprawdzenie
  39. // sprawdź grupy pól "radio" (w form. są 2)
  40. if (!spr_rad(2, $wyb)) {
  41. $wyn = false;
  42. $tt[] = 'Wypełnij wszystkie pola jednokrotnego wyboru';
  43. }
  44. // sprawdź pola tekstowe
  45. if (!spr_txt($pt)) {
  46. $wyn = false;
  47. $tt[] = 'Wypełnij wszystkie pola tekstowe<br />';
  48. }
  49. if ($wyn) {
  50. echo 'Kontrola - OK<br />';
  51. } else {
  52. echo 'Błędy:<br />' . implode('<br />', $tt);
  53. }
  54. }
  55. ?>
  56. <h2>Kwestionariusz</h2>
  57. <form action="<?php echo $_SERVER['PHP_SELF']; ?>"
  58. method="post" name="frm1">
  59. <p>Wybierz jedną odpowiedź</p>
  60. <table border="1" cellspacing="2" cellpadding="2">
  61. <tr>
  62. <td>Pytanie 1<br />
  63. <input type="radio" name="wyb[1]" value="1" /> Odp. pierwsza<br />
  64. <input type="radio" name="wyb[1]" value="2" /> Odp. druga<br />
  65. <input type="radio" name="wyb[1]" value="3" /> Odp. trzecia
  66. </td>
  67. <td>Pytanie 2<br />
  68. <input type="radio" name="wyb[2]" value="1" /> Odp. pierwsza<br />
  69. <input type="radio" name="wyb[2]" value="2" /> Odp. druga<br />
  70. <input type="radio" name="wyb[2]" value="3" /> Odp. trzecia
  71. </td>
  72. </tr>
  73. </table>
  74. <p>Pytania tekstowe</p>
  75. <table border="1" cellspacing="2" cellpadding="2">
  76. <tr><td>Pyt. pierwsze</td><td><input type="text" name="pt[]" /></td></tr>
  77. <tr><td>Pyt. drugie</td><td><input type="text" name="pt[]" /></td></tr>
  78. <tr><td>Pyt. trzecie</td><td><input type="text" name="pt[]" /></td></tr>
  79. <tr><td>Pyt. czwarte</td><td><input type="text" name="pt[]" /></td></tr>
  80. </table>
  81. <p><input type="submit" value="Zapisz" /></p>
  82. </form>
  83. </body>
  84. </html>
Warianty kontroli są 2 (a nie 3), bo nie rozumiem o co chodzi z kontrolą samych pytań. Pytania wstawia do formularza Twój skrypt, a użytkownik nic w nich nie zmieni, ma na nie tylko odpowiedzieć.
Dlatego uważam, że kontrolować można tylko odpowiedzi.

Jeszcze jedno: W swoim skrypcie dodaj print_r($_POST).
Jak widzisz jakie dane dostajesz, to łatwiej napisać program ich kontroli.
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.