Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]Sprawdzanie czy pola formularza (w pętli foreach) zostały wypełnione - jak?
Forum PHP.pl > Forum > Przedszkole
x X x
Otóż mam taki oto formularz:
  1. <?php foreach($Result_stud as $P_stud) : ?>
  2. <form class="validate" method="post" action="Passes/PassesAdded/">
  3. <tr>
  4. <th name="student" width="120px">
  5. <?php echo $P_stud['s_id']; ?> - <?php echo $P_stud['s_name']; ?>
  6. <input type="hidden" name="s_id[]" value="<?php echo $P_stud['s_id']; ?>"/>
  7. </th>
  8.  
  9. <input type="hidden" name="stud_cl_id[]" value="<?php echo $P_stud['stud_cl_id']; ?>"/>
  10.  
  11. <!--pobieranie oceny z bazy ! -->
  12. <td name="ocena" width="40px">
  13. <input type="text" name="pass[]" style="height: 20px" value="<?php echo (isSet($_POST['pass'])) ? $_POST['pass'] : '' ?>"/>
  14. </td>
  15.  
  16. <td name="data" width="130px">
  17. <input type="date" placeholder="RRRR-MM-DD" name="pass_date[]" style="height: 22px" value="<?php echo (isSet($_POST['pass_date'])) ? $_POST['pass_date'] : '' ?>"/>
  18. </td>
  19.  
  20. <td name="komentarz">
  21. <input type="text" name="comments[]" style="height: 20px" value="<?php echo (isSet($_POST['comments'])) ? $_POST['comments'] : '' ?>"/>
  22. </td>
  23. </tr>
  24. <?php endforeach; ?>
  25. <tr class="line">
  26. <td colspan="5"><input type="submit" class="button" value="Dodaj"/>
  27. </tr>
  28. </form>

Wyświetla on X studentów dla wybranego wcześniej przedmiotu. Jeżeli wpiszę ocenę wybranemu studentowi chciał bym aby system wymagał też wpisania daty i komentarza. Nie mogę niestety skorzystać z opcji:

  1. required="required"


ponieważ formularz jest w pętli foreach i wtedy nie puści zapisania, jeżeli WSZYSTKIE pola nie będą wypełnione. Chciał bym, aby sprawdzane były tylko pola tych studentów, u których coś zostało już wpisane (np. wpisałem ocenę, nie wpisałem daty, wpisałem komentarz - system informuje, że data nie została wpisana i należy ją wpisać). Da się to zrobić? Może jakiś skrypt?
NickOver
Nigdy nie pisałem tak formularza. Zawsze jechałem standardowo + przesyłanie do mysql, ale możesz sprawdzić to:
  1. <?php
  2. $pass = trim($_POST['pass[]']);
  3. if(empty($pass)
  4. {
  5. echo 'Komunikat o braku';
  6. }
  7. else
  8. {
  9. echo (isSet($_POST['pass'])) ? $_POST['pass'] : '' ?>"/>
  10. }
  11. ?>

Oczywiście potem musisz podmienić nazwy.
Napisz czy działa wink.gif
x X x
@UP: tylko gdzie to wrzucić? Do wartości (value) w inpucie? To tak nie będzie, zwłaszcza to wyświetlanie błędu.
Turson
  1. <?php
  2. $errors = null;
  3. foreach($_POST as $k=>$v){
  4. $v = trim($v);
  5. if(empty($v)) $errors .= "Pole {$k} nie może być puste.<br>";
  6. }
  7. if(!is_null($errors)) echo $errors;
  8. else{
  9. // wszystkie pola wypelnione
  10. }


A jeszcze lepiej oprzeć to na try catch
x X x
Tylko gdzie ja mam to wrzucić ? Bo przecież nie do value w znaczniku <input>..
Turson
  1. <form action="" method="post">
  2. <input type="text" name="imie">
  3. <input type="text" name="nazwisko">
  4. <input type="text" name="wiek">
  5. <input type="submit" name="wyslij" value="wyslij">
  6. </form>
  7. <?php
  8. if(isset($_POST['wyslij'])){
  9. $errors = null;
  10. foreach($_POST as $k=>$v){
  11. if($k!=="wyslij"){
  12. $v = trim($v);
  13. if(empty($v)) $errors .= "Pole {$k} nie może być puste.<br>";
  14. }
  15. }
  16. if(!is_null($errors)) echo $errors;
  17. else{
  18. echo "OK!";
  19. }
  20. }
x X x
Nadal nie wiem jak to zastosować. Po pierwsze dlatego, że nie dodaje pojedynczych danych a tablicę danych. Po drugie - wrzuciłem co trzeba, sprawdziłem - nie działa.

Tak wygląda moja funkcja, która odpowiada za dodawanie rekordów do bazy:

  1. public function PassesAdded()
  2. {
  3. $i=0;
  4. foreach ($_POST['s_id'] as $s_id)
  5. {
  6. $s_id;
  7. $_POST['stud_cl_id'][$i];
  8. $_POST['pass'][$i];
  9. $_POST['pass_date'][$i];
  10. $_POST['comments'][$i];
  11.  
  12. if ($_POST['pass'][$i] != '' && $_POST['pass_date'][$i] = '' || $_POST['comments'][$i] = '')
  13. {
  14. /*
  15. echo 'Błąd, nie wypełniłeś wszystkich pól formularza!';
  16.  
  17.  
  18. }elseif ($_POST['pass'][$i] != '' && $_POST['pass_date'][$i] != '' && $_POST['comments'][$i] != '')
  19. {
  20. */
  21. $q_pass = "INSERT INTO passes (class_id,student_id,pass,pass_date,comments) VALUES ('".$_POST['stud_cl_id'][$i]."','".$s_id."','".$_POST['pass'][$i]."','".$_POST['pass_date'][$i]."','".$_POST['comments'][$i]."')";
  22. $Insert_passes = parent::getDB()->run($q_pass);
  23.  
  24. //echo 'Ocena: <b>'.$_POST['pass'][$i].'</b> z zajęć '.$_POST['stud_cl_id'][$i].' dla studenta '.$s_id.' została pomyślnie dodana!</br>';
  25. }
  26.  
  27.  
  28. $i++;
  29. }
  30. include('passes_added.html');
  31. }


Myślałem, aby zrobić tak jak jest w komentarzu, że jeżeli ocena jest wpisana, a data lub komentarz nie wyświetli się komunikat (najlepiej okno) z info, że nie wypełniono wszystkich pól. Samo echo nic nie daje, tak czy inaczej po naciśnięciu submita formularz się chyba wysyła - strona przechodzi do widocznego includa.

Proszę pamiętać, że operuję na tablicy. Jeżeli mam formularz X studentów i wpiszę oceny tylko dla 3 i 10 studenta w formularzu, to dzięki powyższej funkcji zostaną dodane rekordy tylko dla 3 i 10 studenta z formularza.

To jak jest ktoś w stanie pomóc z tym skryptem? Ewentualnie jakoś inaczej da się to zrobić?

Edycja:

Bardzo proszę o jakieś rady. Czy da się coś z tym zrobić? Sprawdzanie tych pojedynczych pól w formularzu umieszczonym w pętli foreach (wyświetlanie wielu takich samych wierszów formularza)?

Chciał bym też prosić o pomoc w sprawie z tym związanej:

  1. public function PassesAdded()
  2. {
  3. //if(!empty($_POST)){
  4. //ob_start();
  5. $i=0;
  6. foreach ($_POST['s_id'] as $s_id)
  7. {
  8. $s_id;
  9. $_POST['stud_cl_id'][$i];
  10. $_POST['pass'][$i];
  11. $_POST['pass_date'][$i];
  12. $_POST['comments'][$i];
  13.  
  14. if ($_POST['pass'][$i] != '' && $_POST['pass_date'][$i] != '' && $_POST['comments'][$i] != '')
  15. {
  16. $q_add_passes = "INSERT INTO passes (
  17. class_id,
  18. student_id,
  19. pass,
  20. pass_date,
  21. comments
  22. ) VALUES (
  23. '".$_POST['stud_cl_id'][$i]."',
  24. '".$s_id."',
  25. '".$_POST['pass'][$i]."',
  26. '".$_POST['pass_date'][$i]."',
  27. '".$_POST['comments'][$i]."')";
  28.  
  29. $Insert_passes = parent::getDB()->run($q_add_passes);
  30. echo 'Ocena: <b>'.$_POST['pass'][$i].'</b> z zajęć '.$_POST['stud_cl_id'][$i].' dla studenta '.$s_id.' została pomyślnie dodana!</br>';
  31. } elseif ($s_id != '' && $_POST['stud_cl_id'][$i] != '' && $_POST['pass'][$i] = '' && $_POST['pass_date'][$i] = '' && $_POST['comments'][$i] = '')
  32. {
  33. echo 'Nie dodałeś żadnych ocen!';
  34. }
  35. $i++;
  36. }
  37. include('passes_added.html');
  38. //parent::AddText(ob_get_clean());
  39. //} else {
  40. //parent::SetMessage('W bazie danych musi być conajmniej jedna jednostka, do której będzie można przypisać kierunek', 'red');
  41. //echo 'Nie dodałeś żadnych ocen!';
  42. //include('passes_added.html');
  43. //}
  44. }


Oto funkcja dodająca oceny do bazy danych. Chciał bym zrobić tak, że jeżeli prowadzący nie wpisze żadnej oceny a kliknie przycisk DODAJ pojawi się informacja (może być w tym includowanym pliku, albo po odświeżeniu na górze formularza), że nie wpisał żadnych danych. Nie mogę sobie z tym poradzić, ani echo ani SetMessage nie wyświetla danych po sprawdzeniu warunku. Na pewno trzeba tam zastosować odpowiednio IFa.

Mój formularz, jak widać w załączonym kodzie, przesyła następujące dane:

  1. $s_id; //identyfikator studenta
  2. $_POST['stud_cl_id'][$i]; //identyfikator zajęć
  3. $_POST['pass'][$i]; //ocena
  4. $_POST['pass_date'][$i]; //data
  5. $_POST['comments'][$i]; //komentarz


z tym, że dwa pierwsze elementy są wysyłane w formularzu zawsze, niekoniecznie czy pozostałe elementy są wpisane czy nie. Na to przynajmniej wskazuje konsola w przeglądarce Chrome. Dlatego też uważam, iż trzeba to wziąć pod uwagę konstruując warunek IF, co próbowałem zrobić, tak jak widać na załączonym kodzie. Proszę o rady, pomoc. Sprawa bardzo pilna!
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.