Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Formularz i tablica POST
Forum PHP.pl > Forum > Przedszkole
ermar
Witam.

Mam pewien problem z formularzem.
Zawarte są w nim np 3 wiersze z inputami do edycji.
(ilość wierszy z inputami tekstowymi generowana jest na podstawie danych pobieranych z bazy gdzie w pętli while dodawane są kolejne wiersze tabeli).

Po użyciu submitu przechodzę do następnej strony gdzie testowo chciałem wyświetlić zawartość tablicy $_POST
przy pomocy print_r($_POST).

Problem w tym, że wyświetlona tablica zawiera tylko jeden zestaw danych (ostatni) a nie wszystkie trzy.

Nie bardzo wiem jak zbudować pętlę, która pozwoli mi modyfikować przesłane dane w bazie (ba nawet nie umiem wyświetlić całej zawartości tablicy żeby coś pokombinować).

Nazwy przenoszonych zmienny są takie same, zmieniają się tylko wartości Value które ze sobą niosą.

Kawałek kodu z formularza
  1. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: left;">MOD-MGLX10</td>
  2. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: center;"><input name="ile_szt" value="1" style="width: 50px;" type="text"></td>
  3.  
  4. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: right;">
  5. <input name="cena_netto_sztuki" value="375.00" style="width: 80px;" type="text"></td>
  6. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: right;"><p style="width: 110px;">375,00</p></td>
  7. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: right;"><p style="width: 150px;">457,50</p></td>
  8. </tr>
  9. <tr>
  10. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: left;">MOD-MGL10B</td>
  11. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: center;"><input name="ile_szt" value="1" style="width: 50px;" type="text"></td>
  12. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: right;">
  13. <input name="cena_netto_sztuki" value="1418.00" style="width: 80px;" type="text"></td>
  14. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: right;"><p style="width: 110px;">1418,00</p></td>
  15.  
  16. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: right;"><p style="width: 150px;">1729,96</p></td>
  17. </tr>
  18. <tr>
  19. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: left;">MOD-GLX20</td>
  20. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: center;"><input name="ile_szt" value="1" style="width: 50px;" type="text"></td>
  21. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: right;">
  22. <input name="cena_netto_sztuki" value="360.00" style="width: 80px;" type="text"></td>
  23. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: right;"><p style="width: 110px;">360,00</p></td>
  24. <td style="border-bottom: 1px solid rgb(0, 0, 0); padding: 5px; color: rgb(255, 255, 255); font-size: 11px; background-color: rgb(0, 68, 255); text-align: right;"><p style="width: 150px;">439,20</p>



Proszę uprzejmie o pomoc.

Pozdrawiam
ermar
osl
jeśli masz ileśtam inputów z takimi samymi nazwami, to czego tu się dziwić? smile.gif
dodaj do inputów z takimi samymi nazwami [], czyli np.
  1. <input name="ile_szt[]" />

i wtedy zobacz jak print_r($_POST) wygląda.
ermar
Bardzo dziękuję za pomoc.

Teraz otrzymałem poprawną tablicę.

[pozycja_w_bazie] => Array
(
[0] => 1
[1] => 2
[2] => 3
)

[ile_szt] => Array
(
[0] => 1
[1] => 1
[2] => 1
)

[cena_netto_sztuki] => Array
(
[0] => 375.00
[1] => 1418.00
[2] => 360.00
)

Teraz czeka mnie połączenie tego w zapytanie sql które zmodyfikuje rekordy. Czas uczyć się dalej smile.gif
erix
Skoro to miało do bazy lecieć, to kolumnami nie bardzo elastycznie wyszło...

Możesz przecież generować w ten deseń:
Kod
licznik = 0;
pętla
   pole formularza[licznik][id]

I wtedy wystarczy pętlą przejechać tablicę w POST. ;]
ermar
Hm nie bardzo jednak wiem jak to złożyć w całość sad.gif

Stworzyłem takie coś ale nie zdaje to egzaminu

  1. <?php
  2. $tablica = $_POST;
  3. foreach($tablica as $v1) {
  4.    foreach ($v1 as $v2) {
  5.        print "$v2\n";
  6.        }
  7.        }
  8. ?>


dostaje w wyniku dane z tablicy post tak jak potrzebuje ale nie wiem jak to zlozyc odpowiednio w ciag tekstowy który mogłbym wstawic w zapytanie sql.

Probowałem stworzyć cos na przykładzie pseudokodu podanego wyżej ale mało co mi wyszlo z tego.
erix
Cytat
Probowałem stworzyć cos na przykładzie pseudokodu podanego wyżej ale mało co mi wyszlo z tego.

To pokaż. [;
ermar
Witam. Wczoraj już nie zdążyłem odpowiedzieć.

Moja żałosna pętla
  1. <?php
  2. for($i=0;$i<$ile-1;$i++)
  3.  
  4.   {
  5.   echo "<p>$pozycja_w_bazie[$i]</p>";
  6.   echo "<p>$ile_szt[$i]</p>";
  7.   echo "<p>$cena_netto_sztuki[$i]</p>";
  8.   }
  9. ?>


Zmienną $ile biorę z formularza, a informuje mnie ona ile mam do przeliczenia wierszy z tabeli. -1 ze względu na fakt, że tablica rozpoczyna się od zera.

Powyższa konstrukcja to oczywiście bzdura.

Teraz jestem na etapie "w połowie drogi" smile.gif

  1. <?php
  2. foreach ( $tablica as $klucz => $wartosc )
  3.  {
  4.      echo '<p><b>' . $klucz . '</b></p>';
  5.    
  6.      for ( $i = 0; $i < count($wartosc); $i++ )
  7.      {
  8.          echo '<i>' . $wartosc[$i] . '</i>';
  9.      }
  10.  }
  11. ?>


i jako efekt dostaje

pozycja_w_bazie
123

ile_szt
111

cena_netto_sztuki
375.001418.00360.00

tyle, że naprawdę kończą się mi pomysły na konstrukcję pętli tak aby wybierane były w jednym przebiegu
poszczególne pola
czyli

pozycja w bazie 1 ile_szt 1 cena_netto_sztuki 375.00

Popełniam błąd odwołując się do zawartości tablicy i dostaje w efekcie same bzdury.
Jak powinna wyglądać konstrukcja tej pętli ?

Pozdrawiam


Twardo walczę nadal smile.gif niestety z mizernym skutkiem :/

  1. <?php
  2. foreach($tablica as $v1) {
  3. echo '<pre>';
  4. print_r($v1);
  5. echo'</pre>';
  6.  
  7.    foreach ($v1 as $klucz=>$wartosc) {
  8.     for ( $i = 0; $i < count($wartosc); $i++ )
  9.     {
  10.      echo "<p><i>$klucz $wartosc[$i] $pozycja_w_bazie[$i]| $klucz $wartosc[$i] $ile_szt[$i]| $klucz $wartosc[$i] $cena_netto_sztuki[$i]</i></p>";
  11.     }
  12.        }
  13.        }
  14. ?>


jako wynik dostaje
Array
(
[0] => 1
[1] => 2
[2] => 3
)

0 1 A| 0 1 A| 0 1 A

1 2 A| 1 2 A| 1 2 A

2 3 A| 2 3 A| 2 3 A

Array
(
[0] => 1
[1] => 1
[2] => 1
)

0 1 A| 0 1 A| 0 1 A

1 1 A| 1 1 A| 1 1 A

2 1 A| 2 1 A| 2 1 A

Array
(
[0] => 375.00
[1] => 1418.00
[2] => 360.00
)

0 3 A| 0 3 A| 0 3 A

1 1 A| 1 1 A| 1 1 A

2 3 A| 2 3 A| 2 3 A

raz ze pętla raczej nie w tym miejscu bo wykonuje mi się to ździebko za wiele razy smile.gif a dwa, że ostatnia pozycja to litera A - jak rozumiem wyjąłem pierwszy znak ze stringu Array?

Hilfe smile.gif

Pozdrawiam
erix
No, widzę że jednak coś robisz, to pokażę Ci, o co mi chodzi:
  1. <?php
  2. for($i=0;$i<$ile-1;$i++)
  3.  
  4.  {
  5.  echo '<input type="asd" name="rekord['.$i.'][pole1]" />';
  6.  echo '<input type="asd" name="rekord['.$i.'][pole2]" />';
  7.  echo '<input type="asd" name="rekord['.$i.'][pole3]" />';
  8.  }
  9. ?>

ubierz to w formularz i daj var_dump" title="Zobacz w manualu PHP" target="_manual na $_POST.

PS. Dodaj tag do tematu.
ermar
Poprawiłem tag postu.

Zrobiłem test na Twoim przykładzie ale powiem szczerze, że nie widzę zbytniej różnicy pomiędzy Twoją a moją tablicą puszczoną przez POST.

generalnie w moim skrypcie pola generowane są przez pętlę while po odpytaniu bazy a nie jak w Twoim przykładzie. Aczkolwiek nadal nie widzę zbytnich różnic w tablicach.


Twoja tablica
array(2) {
["rekord"]=>
array(3) {
[0]=>
array(3) {
["pole1"]=>
string(5) "test1"
["pole2"]=>
string(5) "test2"
["pole3"]=>
string(5) "test3"
}
[1]=>
array(3) {
["pole1"]=>
string(5) "test4"
["pole2"]=>
string(5) "test4"
["pole3"]=>
string(5) "test5"
}
[2]=>
array(3) {
["pole1"]=>
string(5) "test6"
["pole2"]=>
string(5) "test7"
["pole3"]=>
string(5) "test8"
}
}

Moja tablica
array(6) {
["pozycja_w_bazie"]=>
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
["ile_szt"]=>
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "1"
[2]=>
string(1) "1"
}
["cena_netto_sztuki"]=>
array(3) {
[0]=>
string(6) "375.00"
[1]=>
string(7) "1418.00"
[2]=>
string(6) "360.00"
}



Wiem już jak prawidłowo wyświetlić tablicę ale nie umiem poukładać jej elementów w prawidłową dla mnie kolejność.

dla mnie mogłoby to wyglądac tak że w pętli leciałby zapis

pętla for
{
echo na pozycja_w_bazie[$i(klucz np 0)][wartosc] ile_sztuk[$i(klucz np 0)][wartosc] cena_netto[$i(klucz np 0)][wartosc];
}



Nie mogę tego zrozumieć sad.gif
Nie wiem jak wyciągać dane z tablicy w sposób który chcę osiągnąć. Zarówno w Twoim i jak i w moim przykładzie.

Jak rozumiem konstrukcja
  1. <?php
  2. $zmienna = $_POST['rekord[1][pole1]'];
  3. echo $zmienna;
  4. ?>

jest błędnym odwołaniem do pola tablicy bo u mnie nic nie wyświetla.

Jeszcze na początku podchodziłem do tego na luzie ale teraz już opadłem z sił. Nie mogę tego ogarnąć.

Ale dziękuję za poświęcony czas bo i tak troszkę więcej wiem niż na początku.

Pozdrawiam
erix
Cytat
Nie mogę tego zrozumieć
Nie wiem jak wyciągać dane z tablicy w sposób który chcę osiągnąć. Zarówno w Twoim i jak i w moim przykładzie.


A wpisz sobie
  1. <?php
  2. var_dump($_POST['rekord'][1]);
  3. ?>

i zobacz, co wypluwa. Teraz wiesz, jak się odwołać? [;
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.