Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapis danych z formularza za pomocą pętli [PHP][MySQL]
Forum PHP.pl > Forum > Przedszkole
Danielcom
Witam, muszę napisać skrypt do zarządzania menu. Niby prosta sprawa, ale mam mały problem. Chodzi o zapis danych z formularza napisanego w html.

Formularz wygląda mniej więcej tak:


Dane pobierane są w pętli (foreach) z MySql.

Chcę teraz zapisać pola, które pozwalają na zmianę (opublikowany, order ...) z tego formularza za jednym podejściem, i nie bardzo mam pomysł jak to zrobić.

Proszę o pomoc.
elmozaur
nie rozumie pytania??
jesli masz pola to maja one jakies nazwy.
prawdopodobnie (a nawet logiczne) jest ze te pola wysylane sa POSTem.
po stronie odbierajacej piszesz $nazwa=$_POST['nazwa_pola'];
takie zmienne podajesz do bazy jako update i tyle
Danielcom
tak, ale problem polega na tym, że zmiennych $_POST['idmenu'] jest kilka (tyle ile linijek w formularzu) i jak rozdzielić każdy wiersz od siebie
domyślam się, że będzie tutaj potrzebna jakaś tablica, ale nie jestem pewien.

A może napisze inaczej, chcę zebrać wszystkie dane z tego formularza i automatycznie wszystko zapisać. Formularz jest generowany dynamicznie, nie wiem ile będzie wierszy, wszystko zależy od złożoności tego menu.
evolucja
jak generujesz formularz to jako name każdego z pól ustawiasz:
  1. <? $pola[$idmenu][1, 2 lub 3] ?>


potem updatujesz to tak:
  1. foreach ($pola as $menuid) {
  2. $query = "UPDATE `tabela` SET `1` = $menuid[1], `2` = $menuid[2] `l4` = $menuid[2] WHERE `menuid`= $menuid LIMIT 1 ;"
  3. mysql_query($query);
  4. }


zapytanie pisane na szybko więc nie będzie pewnie działać tongue.gif mam nadzieję, że dobrze zrozumiałem i będzie to działać...
elmozaur
w takim ukladzie kazda wysylana kolumna musi byc tablica.

po stronie odbiorczej robisz petle
$i=1;
foreach($arrayidmenu as $wiersz=>$wartosc)
{
$opub=$tabopublikowany[$i];
$ord=$taborder[$i];

i tak dalej


no i zapis do bazy: update tabela set opublikowany='$opub', order='$ord' where id='$wartosc'

$i++;
}

cos takiego powinno przeleciec po elementach tablicyidmenu a tym samym po tablicach pozostalych wartosci
Danielcom
ok, to rozwiązanie bardzo mi się podoba, mam tylko jeszcze jedno pytanie

skąd się bierze tablica $arrayidmenu ? a jeśli trzeba ją wygenerować to jak to zrobić z takiego kodu.




  1. <?php
  2. foreach($pdo -> query('SELECT * FROM sol_menu WHERE idsub = '.$row['idmenu'].' and idsub!=0 ORDER BY `order` ASC' ) as $submenu){ # sub menu
  3. ?>
  4. <form action="zapisz.php" method="post" />
  5. <tr>
  6. <td width="1%">&nbsp;</td>
  7. <td width="15%"><?php echo $submenu['title']; ?></td>
  8. <td width="10%"><?php echo $submenu['go']; ?></td>
  9. <td width="1%"><?php echo $submenu['idmenu']; ?></td>
  10. <td width="1%"><input type="text" name="activ" value="<?php echo $submenu['activ']; ?>" size="2" /></td>
  11. <td width="5%"><input type="text" name="order" value="<?php echo $submenu['order']; ?>" size="2" /></td>
  12. <td width="2%"><input type="text" name="idmenu" value="<?php echo $submenu['idmenu']; ?>" size="2" /></td>
  13. <td> <input type="submit" /></td>
  14.  
  15. </tr>
evolucja
Jeśli użyłbyś mojego sposobu to tak:
  1. <?php
  2. foreach($pdo -> query('SELECT * FROM sol_menu WHERE idsub = '.$row['idmenu'].' and idsub!=0 ORDER BY `order` ASC' ) as $submenu){ # sub menu
  3. ?>
  4. <form action="zapisz.php" method="post" />
  5. <tr>
  6. <td width="1%"> </td>
  7. <td width="15%"><?php echo $submenu['title']; ?></td>
  8. <td width="10%"><?php echo $submenu['go']; ?></td>
  9. <td width="1%"><?php echo $submenu['idmenu']; ?></td>
  10. <td width="1%"><input type="text" name="<? echo $arrayidmenu["$idmenu"]; ?>" value="<?php echo $submenu['activ']; ?>" size="2" /></td>
  11. <td width="5%"><input type="text" name="<? echo $arrayidmenu["$idmenu"]; ?>" value="<?php echo $submenu['order']; ?>" size="2" /></td>
  12. <td width="2%"><input type="text" name="<? echo $arrayidmenu["$idmenu"]; ?>" value="<?php echo $submenu['idmenu']; ?>" size="2" /></td>
  13. <td> <input type="submit" /></td>
  14.  
  15. </tr>
Danielcom
zrobiłem tak jak napisałeś, ale mam problem, mianowicie w z pliku do pliku przesyłane są głupoty typu

"http://localhost/skl/testy/form/wyswietl.php?<br+%2F>%0D%0A<b>Notice<%2Fb>%3A++Undefined+variable%3A+idmenu+in+<b>C%3A\wamp\www\skl\modules\menu\index.php<%2Fb>+on+line+<b>55<%2Fb>"

ps chcę odebrać to takiem kodem:
  1. <?php
  2. $i=1;
  3. foreach($arrayidmenu as $wiersz=>$wartosc)
  4. {
  5. $opub=$a[$i];
  6.  
  7. //no i zapis do bazy: update tabela set opublikowany='$opub', order='$ord' where id='$wartosc'
  8. echo $opub;
  9. $i++;
  10. }
  11. ?>
evolucja
Notice Undefined variable 'idmenu' in \wamp\www\skl\modules\menu\index.php on line 55

Mój błąd. Zamień wszystkie
  1. $arrayidmenu["$idmenu"];
na
  1. $arrayidmenu["$submenu['idmenu']"]
Danielcom
teraz to już nie wiem czy ja coś źle napisałem, czy poprostu mam dzisiaj kiepski dzień sciana.gif

teraz wyświetla

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\wamp\www\skl\modules\menu\index.php on line 23

to jest cały kod
  1. <?php
  2. echo '<ul>';
  3. foreach($pdo -> query('SELECT * FROM sol_menu WHERE idsub = 0 ORDER BY `order` ASC' ) as $row){ # menu
  4.  
  5. ?>
  6. <tr>
  7. <td width="10%"><?php echo $row['title']; ?></td>
  8. </tr>
  9. <?php
  10. // echo'<a href="index2.php?go='.$row['go'].'" /><div class="mainlev">'.$row['title'].'</div></a>'; # generowanie linków - teraz nie potrzebne
  11. #echo '<ul>';
  12. ?><div id="submenu">
  13.  
  14. <?php
  15. foreach($pdo -> query('SELECT * FROM sol_menu WHERE idsub = '.$row['idmenu'].' and idsub!=0 ORDER BY `order` ASC' ) as $submenu){ # sub menu
  16. ?>
  17. <form action="../../testy/form/wyswietl.php" method="get" />
  18. <tr>
  19. <td width="1%">&nbsp;</td>
  20. <td width="15%"><?php echo $submenu['title']; ?></td>
  21. <td width="10%"><?php echo $submenu['go']; ?></td>
  22. <td width="1%"><?php echo $submenu['idmenu']; ?></td>
  23. <td width="1%"><input type="text" name="<?php echo $arrayidmenu["$submenu['idmenu']"]; ?>" value="<?php echo $submenu['activ']; ?>" size="2" /></td>
  24. <td> <input type="submit" /></td>
  25.  
  26. </tr>
  27. <tr></tr>
  28. <tr></tr>
  29. <?php
  30.  
  31. //echo' <a href="index2.php?go='.$submenu['go'].'" /><div class="sublev">'.$submenu['title'].'</div></a> '; # wycięte <li></li><div class="sublevel"></div>
  32. }
  33. ?>
  34. </div><?php
  35. #echo '</ul>';
  36. // echo '</li>';
  37. # echo '';
  38. }
  39. echo '</ul>';
  40. ?></table><?php
  41. }catch (PDOException $e) {
  42. echo 'Jeśli widzisz ten komunikat powiadom administratora.';
  43. loger($e->getMessage(),'menu'); # generowanie i zapis informacji o błędzie, dacie, godzinie, hoscie oraz przeglądarce (plik ./log/log.log)
  44. }
  45. ?></div><?php
  46. }
  47. ?>
  48.  
  49. <?php menu();?>


i drugi plik którym chciałbym odbierać wszystkie zmienne (narazie jedna, nie chce mi się pisać biggrin.gif)

  1. <?php
  2. $i=1;
  3. foreach($arrayidmenu as $wiersz=>$wartosc)
  4. {
  5. $opub=$a[$i];
  6.  
  7. //no i zapis do bazy: update tabela set opublikowany='$opub', order='$ord' where id='$wartosc'
  8. echo $opub;
  9. $i++;
  10. }
  11. ?>
evolucja
  1. <?php
  2. echo '<ul>';
  3. foreach($pdo -> query('SELECT * FROM sol_menu WHERE idsub = 0 ORDER BY `order` ASC' ) as $row){ # menu
  4.  
  5. ?>
  6. <tr>
  7. <td width="10%"><?php echo $row['title']; ?></td>
  8. </tr>
  9. <?php
  10. // echo'<a href="index2.php?go='.$row['go'].'" /><div class="mainlev">'.$row['title'].'</div></a>'; # generowanie linków - teraz nie potrzebne
  11. #echo '<ul>';
  12. ?><div id="submenu">
  13.  
  14. <?php
  15. foreach($pdo -> query('SELECT * FROM sol_menu WHERE idsub = '.$row['idmenu'].' and idsub!=0 ORDER BY `order` ASC' ) as $submenu){ # sub menu
  16. $menuid = $submenu['idmenu'];
  17. ?>
  18. <form action="../../testy/form/wyswietl.php" method="get" />
  19. <tr>
  20. <td width="1%"> </td>
  21. <td width="15%"><?php echo $submenu['title']; ?></td>
  22. <td width="10%"><?php echo $submenu['go']; ?></td>
  23. <td width="1%"><?php echo $submenu['idmenu']; ?></td>
  24. <td width="1%"><input type="text" name="<?php echo $arrayidmenu["$menuid"]; ?>" value="<?php echo $submenu['activ']; ?>" size="2" /></td>
  25. <td> <input type="submit" /></td>
  26.  
  27. </tr>
  28. <tr></tr>
  29. <tr></tr>
  30. <?php
  31.  
  32. //echo' <a href="index2.php?go='.$submenu['go'].'" /><div class="sublev">'.$submenu['title'].'</div></a> '; # wycięte <li></li><div class="sublevel"></div>
  33. }
  34. ?>
  35. </div><?php
  36. #echo '</ul>';
  37. // echo '</li>';
  38. # echo '';
  39. }
  40. echo '</ul>';
  41. ?></table><?php
  42. }catch (PDOException $e) {
  43. echo 'Jeśli widzisz ten komunikat powiadom administratora.';
  44. loger($e->getMessage(),'menu'); # generowanie i zapis informacji o błędzie, dacie, godzinie, hoscie oraz przeglądarce (plik ./log/log.log)
  45. }
  46. ?></div><?php
  47. }
  48. ?>
  49.  
  50. <?php menu();?>

Nie, nie.. to ja mam dziś pecha ze wszystkim biggrin.gif Teraz powinno być bez parsera...

A tak po za tym to czekaj... czy ja dobrze widzę? Masz osobny formularz i button dla każdego wiersza?
Danielcom
tak, faktycznie wsadziłem tutaj stary kod smile.gif ale ogólnie to jest to samo i po poprawieniu tego błędu z przyciskiem.
W sumie myślałem, żeby zrobić to już tak, ze do każdego wiersza jest oddzielny przycisk myślałem, ze będzie prościej smile.gif ale jednak wolał bym zrobic tak jak to wałkujemy smile.gif
teraz mam tak
  1. <?php
  2. echo '<ul>';
  3. foreach($pdo -> query('SELECT * FROM sol_menu WHERE idsub = 0 ORDER BY `order` ASC' ) as $row){ # menu
  4.  
  5. ?>
  6. <tr>
  7. <td width="10%"><?php echo $row['title']; ?></td>
  8. </tr>
  9. <?php
  10. // echo'<a href="index2.php?go='.$row['go'].'" /><div class="mainlev">'.$row['title'].'</div></a>'; # wycięte <li></li><div id="mainlevel"> </div>
  11. #echo '<ul>';
  12. ?><div id="submenu">
  13.  
  14. <?php
  15. foreach($pdo -> query('SELECT * FROM sol_menu WHERE idsub = '.$row['idmenu'].' and idsub!=0 ORDER BY `order` ASC' ) as $submenu){ # sub menu
  16. ?>
  17. <form action="../../testy/form/wyswietl.php" method="get" />
  18. <tr>
  19. <td width="1%">&nbsp;</td>
  20. <td width="15%"><?php echo $submenu['title']; ?></td>
  21. <td width="10%"><?php echo $submenu['go']; ?></td>
  22. <td width="1%"><?php echo $submenu['idmenu']; ?></td>
  23. <td width="1%"><input type="text" name="<?php echo $arrayidmenu["$submenu['idmenu']"]; ?>" value="<?php echo $submenu['activ']; ?>" size="2" /></td>
  24. <td> </td>
  25.  
  26. </tr>
  27. <tr></tr>
  28. <tr></tr>
  29. <?php
  30.  
  31. //echo' <a href="index2.php?go='.$submenu['go'].'" /><div class="sublev">'.$submenu['title'].'</div></a> '; # wycięte <li></li><div class="sublevel"></div>
  32. }
  33. ?>
  34. </div><?php
  35. #echo '</ul>';
  36. // echo '</li>';
  37. # echo '';
  38. }
  39. echo '</ul>';
  40. ?></table><?php
  41. }catch (PDOException $e) {
  42. echo 'Jeśli widzisz ten komunikat powiadom administratora.';
  43. loger($e->getMessage(),'menu'); # generowanie i zapis informacji o błędzie, dacie, godzinie, hoscie oraz przeglądarce (plik ./log/log.log)
  44. }
  45. ?></div><?php
  46. }
  47. ?>
  48.  
  49. <?php menu();?>
  50.  
  51.  
  52. <input type="submit" />
rytek
Dlaczego wysyłasz formularz metodą GET? Przy tak dużym formularzu, url będzie bardzo długi.
Lepiej (i bezpieczniej) zrobić to POSTem.

I zamiast

  1. <td width="1%"><input type="text" name="<?php echo $arrayidmenu["$submenu['idmenu']"]; ?>" value="<?php echo $submenu['activ']; ?>" size="2" /></td>


Wrzuć:
  1. <td width="1%"><input type="text" name="<?php echo $arrayidmenu[$submenu['idmenu']]; ?>" value="<?php echo $submenu['activ']; ?>" size="2" /></td>


Niepotrzebne cudzysłowy.
Danielcom
Ogólnie cały system chodzi na postach, teraz zmieniłem żeby zobaczyć co jest przesyłane.
Usuniecie cudzysłowów pomogło, ale dalej jest problem z odczytaniem tych danych (kod pobrany z tego tematu).

Notice: Undefined variable: arrayidmenu in C:\wamp\www\skl\testy\form\wyswietl.php on line 3

Warning: Invalid argument supplied for foreach() in C:\wamp\www\skl\testy\form\wyswietl.php on line 3


Wiem, że jestem dzisiaj męczący, ale jakoś mi dzisiaj nie idzie smile.gif
evolucja
Foreach się chyba tutaj nie sprawdzi...
  1. $a = 0;
  2. while(!empty($_POST[$arrayidmenu[$a]])) {
  3. echo $_POST[$arrayidmenu[$a]];
  4. $a++;
  5. }

To powinno ci wypisać wartości wszystkich pól... Warunek- nie mogą być puste, czyli tam gdzie puste daj 0.
Ciężko mi się myśli ale powinno działać...

Więc jeśli zadziała, to już chyba będziesz wiedział co robić..
Danielcom
jak zadziała smile.gif
dalej jest błąd
Notice: Undefined variable: arrayidmenu in C:\wamp\www\skl\testy\form\wyswietl.php on line 3
dodałem cudzysłowy , błedu nie ma, ale za to nic się teraz nie wyświetla.
  1. <?php
  2. $a = 0;
  3. while(!empty($_POST['$arrayidmenu[$a]'])) {
  4. echo $_POST['$arrayidmenu[$a]'];
  5. $a++;
  6. }
  7. ?>


A co do pętli to faktycznie while będzie szybsze. smile.gif

Chyba jednak sobota nie jest od pracy smile.gif
Przyznam, że mam z tym systemem sporo problemów, ale całe temu mnie dobija.
evolucja
Po pierwsze, zobacz w źródle formularza jak ci się te nazwy pól generują, bo może tam jest błąd...

A w wyświetl.php dodaj sobie na początku:
  1. echo "<pre>";
  2. print_r ($_POST);
  3. echo "<pre>";


A tymczasem pozdrawiam gdyż muszę już iść. Do jutra biggrin.gif
Danielcom
faktyczniecoś się źle generuje, zaraz nad tym posiedzę[xml][/xml]
  1. <td width="1%"><input type="text" name="<br />
  2. <b>Notice</b>: Undefined variable: arrayidmenu in <b>C:\wamp\www\skl\modules\menu\index.php</b> on line <b>49</b><br />
  3. " value="szybowiec_info2" size="2" /></td>
  4. <td width="1%"><input type="text" name="<br />
  5. <b>Notice</b>: Undefined variable: arrayidmenu in <b>C:\wamp\www\skl\modules\menu\index.php</b> on line <b>50</b><br />
  6. " value="" size="2" /></td>
  7. <td width="1%"><input type="text" name="<br />
  8. <b>Notice</b>: Undefined variable: arrayidmenu in <b>C:\wamp\www\skl\modules\menu\index.php</b> on line <b>51</b><br />
  9. " value="1" size="2" /></td>
  10. <td> </td>
evolucja
  1. <?php
  2. foreach($pdo -> query('SELECT * FROM sol_menu WHERE idsub = '.$row['idmenu'].' and idsub!=0 ORDER BY `order` ASC' ) as $submenu){ # sub menu
  3. $idmenu = $submenu['idmenu'];
  4. ?>
  5. <form action="../../testy/form/wyswietl.php" method="get" />
  6. <tr>
  7. <td width="1%"> </td>
  8. <td width="15%"><?php echo $submenu['title']; ?></td>
  9. <td width="10%"><?php echo $submenu['go']; ?></td>
  10. <td width="1%"><?php echo $submenu['idmenu']; ?></td>
  11. <td width="1%"><input type="text" name="<?php echo '$arrayidmenu[]['.$idmenu.']'; ?>" value="<?php echo $submenu['activ']; ?>" size="2" /></td>
  12. <td> </td>
  13.  
  14. </tr>

może tym razem... mam nadzieję, że nie przekombinowałem biggrin.gif
powinno zwracać name w postaci: '$arrayidmenu[][22]' '$arrayidmenu[][24]'
Danielcom
działa smile.gif
trochę zmodyfikowałem ten skrypt.

  1. <td width="1%"><input type="text" name="<?php echo '$activ['.$submenu['idmenu'].']'; ?>" value="<?php echo $submenu['activ']; ?>" size="2" /></td>

dzieki temu generuje się taka tablica
  1. (
  2. [$activ] => Array
  3. (
  4. [22] => 1
  5. [24] => 0
  6. [7] => 1
  7. [21] => 0
  8. [3] => 0
  9. [13] => 1
  10. [23] => 1
  11. [15] => 1
  12. [4] => 1
  13. [18] => 1
  14. )
  15.  
  16. [$pozycja] => Array
  17. (
  18. [22] => 4
  19. [24] => 0
  20. [7] =>
  21. [21] => 1
  22. [3] => 0
  23. [13] => 1
  24. [23] => 666
  25. [15] => 1
  26. [4] => 1
  27. [18] => 3
  28. )
  29.  
  30. [$uprawnienia] => Array
  31. (
  32. [22] =>
  33. [24] => 0
  34. [7] => 1
  35. [21] => 1
  36. [3] => 0
  37. [13] => 1
  38. [23] => 555
  39. [15] => 1
  40. [4] => 1
  41. [18] => 0
  42. )
  43.  
  44. )
evolucja
Czyli już sobie poradzisz? smile.gif
Danielcom
Pokombinuję jeszcze z zapisywaniem do bazy, bo ta tablica generuje się trochę inaczej niż sam bym tego chciał smile.gif
Będę prawdopodobnie musiał przepisać funkcję któa zapisuje mi dane do MySQL
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.