Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [HTML][PHP]sprawdzenie, czy wypełniono pola formularza - problem
hyhyhy
post 27.02.2011, 13:03:51
Post #1





Grupa: Zarejestrowani
Postów: 135
Pomógł: 5
Dołączył: 6.02.2011

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


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...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
Zagiewa
post 27.02.2011, 13:13:23
Post #2





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

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


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!';}


Ten post edytował Zagiewa 27.02.2011, 13:19:23
Go to the top of the page
+Quote Post
hyhyhy
post 27.02.2011, 13:24:21
Post #3





Grupa: Zarejestrowani
Postów: 135
Pomógł: 5
Dołączył: 6.02.2011

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


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"

Ten post edytował hyhyhy 27.02.2011, 13:31:50
Go to the top of the page
+Quote Post
Zagiewa
post 27.02.2011, 13:27:33
Post #4





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

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


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
Go to the top of the page
+Quote Post
Valdi_B
post 27.02.2011, 16:31:47
Post #5





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


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ą.

Ten post edytował Valdi_B 27.02.2011, 16:34:10
Go to the top of the page
+Quote Post
hyhyhy
post 28.02.2011, 19:39:27
Post #6





Grupa: Zarejestrowani
Postów: 135
Pomógł: 5
Dołączył: 6.02.2011

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


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!


Ten post edytował hyhyhy 28.02.2011, 19:39:45
Go to the top of the page
+Quote Post
sadistic_son
post 28.02.2011, 19:48:56
Post #7





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


Do sprawdzania czy coś jest RUE czy FALSE używa się operatora === sprawdzającego typ danych.


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
Valdi_B
post 2.03.2011, 16:38:01
Post #8





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


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]);

Ten post edytował Valdi_B 2.03.2011, 17:05:12
Go to the top of the page
+Quote Post
thek
post 2.03.2011, 20:37:15
Post #9





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




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


--------------------
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
Prezi2907
post 3.03.2011, 02:31:05
Post #10





Grupa: Zarejestrowani
Postów: 107
Pomógł: 4
Dołączył: 11.08.2010
Skąd: Inowrocław

Ostrzeżenie: (10%)
X----


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...
Go to the top of the page
+Quote Post
Valdi_B
post 3.03.2011, 10:22:00
Post #11





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


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.
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: 14.08.2025 - 04:53