Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak sprawdzić, co wysłało informacje z formularza
Forum PHP.pl > Forum > Przedszkole
GraphiCAD
Witam!

Kombinowałem, kombinowałem i poległem...
Szukałem na forum, ale nie znalazłem. Skrypt ma mieć możliwość dodania pozycji do formularza zamówienia wewnątrz firmy, a dopiero po wypełnieniu (możliwe kilka pozycji) zapisanie o do bazy danych.
Wygenerowałem formularz, którego pola mają nazwy generowane przez skrypt. Ilość takich pól jest zmienna:
Kod
for ($licznik = 1; $licznik <= $ilosc_pol; $licznik++) {
     echo "<input type=\"text\" name=\"pos$licznik\" value=\"\"></input>"; // itd.
}


I wychodzi:

Kod
<form action="dodaj.php" method="POST">
<input type="text" value="" name="pos1"></input><input type="submit" name="del_pos1" name="Usuń"></input>
<input type="text" value="" name="pos2"></input><input type="submit" name="del_pos2" name="Usuń"></input>
<input type="text" value="" name="pos3"></input><input type="submit" name="del_pos3" name="Usuń"></input>
...
<input type="text" value="" name="posX"></input><input type="submit" name="del_posX" name="Usuń"></input><BR><inoput type="submit" name="send" value="Zapisz"></input><BR></form><BR>

Problem polega na tym, że  nie wiem, jak zrobić, żeby automatycznie wydobyć informację o tym, które pole typu "SUBMIT" wysłało dane z formularza.
Potrzebana była by jakaś pętla typu:
Kod
for ($licznik = 1; $licznik <= $ilosc_pol; $licznik++) {
if (isset($_POST['del_pos$licznik'])) { cośtam się dzieje... }
}

Ale to nie działa, a nie wiem dlaczego. Argument podany, jako nazwa elementu w tablicy $_POST jest według mnie ciągiem znaków i powinien podlegać takim manewrom, jak generowanie jego nazwy, a jakoś nie działa. A może to coś innego?
Max Damage
Przecież nie chcesz wyciągnąć przycisku tylko to co jest w polu input. Czyli powinno być chyba tak:
  1. <?php
  2. if (isset($_POST['pos$licznik']))
  3. ?>

Poza tym skoro wyciągasz tylko jedno pole to nie możesz zrobić tak aby wszystkie pola typu input miały tą samą nazwę?
JoShiMa
A do czego są atrybuty name?
  1. <?php
  2. if(isset($_POST['del_pos1'])){
  3.  //usuń 1
  4. ...
  5. }elseif(isset($_POST['del_posX'])){
  6.  //usuń X
  7. }elseif(isset($_POST['send'])){
  8. //send
  9. ?>


Poza tym nie tak:
  1. <input type="text" value="" name="pos3"></input>

Tylko tak:
  1. <input type="text" value="" name="pos3"/>


Ja takie rzeczy załatwiam inaczej. Zamiast tych submitów robię checkboxy i zaznaczam pozycje do usunięcia. Pod checkboxami daję jeden submit name="usuń" i obsługuję wszystkie zaznaczone na raz. Prosto i bez miliona warunków. Co więcej, jeśli liczna tych elementów jest zmienna i formularz jest tworzony w pętli radzę korzystrać ze zmiennych tablicowych. Ostatecznie u mnie wyglądałoby to tak:

  1. <input type="text" value="" name="pos[1]"/><input type="checkbox" name="del_pos[1]" name="Usuń"/>
  2. <input type="text" value="" name="pos[2]"/><input type="checkbox" name="del_pos[2]" name="Usuń"/>
  3. <input type="text" value="" name="pos[3]"/><input type="checkbox" name="del_pos[3]" name="Usuń"/>
  4. ...
  5. <input type="submit" name="send" value="Zapisz"/><input type="submit" name="usun" name="Usuń"/>


Potem sprawdzenie:
  1. <?php
  2. if(isset($_POST['usun'])){
  3. //usuwam pozycje zaznaczine w checkboxach
  4. }elseif(isset($_POST['send'])){
  5. //robię coś innego
  6. }
  7. ?>


Zaznaczone checkboxy mam w tablicy $_POST['del_pos'], sprawdzam jakie są w niej klucze (będą tylko te które użytkownik odhaczył) i je obsługuję.
GraphiCAD
Prawie wszystko pięknie, ale:
1. Potrzebuję informacji z pól tekstowych ORAZ informacji, które "submity" wysłały dane, żeby wywalić odpowiednią pozycję z listy.
2. Atrybuty "name" przecież są tutaj elementami sterującymi. Ale nie będę robił żadnego "if... else...", albo "case $zmienna of...", bo do tego trzeba znać liczbę elementów, a ta jest zmienna.
3. Zmienna tablicowa w tym przypadku spowoduje, że wyświetli się takie coś, jak jest napisane, ale czy napiszę "del_pos[1]", czy "del_pos3", to i tak muszę to jakoś potem wydobyć z formularza.
4. Użytkownik jest przyzwyczajony do przycisków "usuń" przy każdej pozycji i tak został zatwierdzony interfejs.
5. JAK sprawdzić, czy którekolwiek z np. 200 pól, których nazwy są generowane, a nie stałe jest zaznaczone? Też przez: isset($_POST['nazwa_pola']), a tutaj się to wywala, bo nie umiem zrobić, żeby skrypt sprawdzał wszystkie pola z tablicy $_POST sam, bez podawania mu ręcznie nazw pól.
baszkir
Wprawdzie php to tylko takie moje male hobby i nigdy profesjonalnie sie tym nie zajmowalem, ale moze cos takiego Ci pomoze.

Otoz, o ile dobrze zrozumialem, masz formularz typu pole tekstowe - submit, ale ilosc takich par jest zupelnie dynamiczna. Ty chcesz aby po nacisnieciu ktoregos z submitow z takiej pary, skrypt przetwarzajacy dane rozpoznal ktory submit zostal nacisniety (inaczej mowiac od ktorej pary to bylo).
Trzymajac sie Twojego kodu html, to plik dalej.php moglby miec cos takiego:
  1. <?php
  2. foreach(array_keys($_POST) as $val)
  3. {
  4. if(substr($val,0,3)=='del')
  5.  { $nr=$val;
  6.  break;
  7.  }
  8. }
  9. ?>


no i $nr zawiera nazwe wcisnietego submita.

Na 100% istnieja jakies prostsze i bardziej optymalne rozwiazania, ale to dziala bo wlasnie testowalem. Moze w czym pomoze.
JoShiMa
Cytat(GraphiCAD @ 4.08.2008, 20:56:27 ) *
3. Zmienna tablicowa w tym przypadku spowoduje, że wyświetli się takie coś, jak jest napisane, ale czy napiszę "del_pos[1]", czy "del_pos3", to i tak muszę to jakoś potem wydobyć z formularza.

W przypadku zmiennej tablicowej masz gotową funkcję, która sprawdza króte klucze istnieją w tablicy. Nie trzeba ifów ani case.

Cytat
5. JAK sprawdzić, czy którekolwiek z np. 200 pól, których nazwy są generowane, a nie stałe jest zaznaczone? Też przez: isset($_POST['nazwa_pola']), a tutaj się to wywala, bo nie umiem zrobić, żeby skrypt sprawdzał wszystkie pola z tablicy $_POST sam, bez podawania mu ręcznie nazw pól.

count($_POST['del_pos']) hihihi smile.gif A to, ze nie umiesz nie znaczy, że się nie da smile.gif Wystarczy trochę pomyślunku function.array-keys

Cytat(baszkir @ 4.08.2008, 21:51:38 ) *
Na 100% istnieja jakies prostsze i bardziej optymalne rozwiazania, ale to dziala bo wlasnie testowalem. Moze w czym pomoze.

Na 100 procent, bo substring jak większość operacji na stringach jest dość powolny. A teraz krótko i na temat i jak to powinno być zrobione jeśli klient upiera się, że nie chce checkbox tylko submit.
Pętla tworząca pozycje (zauważ, że u Ciebie masz dwa razy atrybut name i przypisanie dwóch różnych wartości do każdego submita może stąd Twoje problemy z $_POST)
  1. <?php
  2. for ($licznik = 1; $licznik <= $ilosc_pol; $licznik++) {
  3.  echo "<input type=\"text\" name=\"pos[$licznik]\" value=\"\"/>";
  4.  echo "<input type=\"submit\" name=\"del_pos[$licznik]\" value=\"Usuń\"/>";
  5.  
  6. }
  7. ?>


Sprawdzenie który submit wciśnięty odbywa się w jednej linijce.
  1. <?php
  2. $nr = array_keys($_POST['del_pos']);
  3. ?>
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.