Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zapytanie z warunkiem w danych z POST
Forum PHP.pl > Forum > Przedszkole
panyeti
Witam. Szukam na forach rozwiązania ale podobne przypadki odnoszą się do MySQL albo nie mogę zajarzyć sad.gif.
Przesyłam metodą POST dane z listy menu z checkboxami: "m_id", "m_sort", "m_disp".
Potrzebuję wyjąć z POST numery ID tych checkbox (m_disp), które są w stanie "ON".
Przy zastosowaniu pętli wyświetlana jest kolejność w tablicy, nie bardzo umiem sobie poradzić ze zbudowaniem zapytania.
W efekcie mam otrzymać, np.: 2 12 14, który to wynik chcę zapisać jako tablicę w jednej komórce bazy danych, do późniejszego odczytania w liście menu.
Jak się za to zabrać?
Pilsener
Niewiele mogę wywnioskować z opisu problemu....

Zrób może taki formularz:
  1. <form action="" method="post">
  2. <input type="checkbox" value="1" name="twoje_czekboksy[]" />
  3. <input type="checkbox" value="2" name="twoje_czekboksy[]" />
  4. <input type="checkbox" value="3" name="twoje_czekboksy[]" />
  5. <input type="submit" />
  6. </form>


I daj w PHP:
  1. <?php
  2. print_r($_POST)
  3. ?>
- masz wszystkie value w jednej tablicy, możesz zrobić z tego pętle albo string.
panyeti
Dzięki Pilsner, ale print_r($_POST) chyba nie zadziała jak bym chciał.

Zawartość Post wygląda tak:
  1. <?php
  2. (
  3.    [m_s] => Array
  4.        (
  5.            [0] => 1
  6.            [1] => 2
  7.            [2] => 3
  8.            [3] => 4
  9.            [4] => 5
  10.            [5] => 6
  11.            [6] => 7
  12.            [7] => 8
  13.            [8] => 10
  14.            [9] => 11
  15.            [10] => 12
  16.        )
  17.  
  18.    [m_id] => Array
  19.        (
  20.            [0] => 1
  21.            [1] => 2
  22.            [2] => 3
  23.            [3] => 4
  24.            [4] => 5
  25.            [5] => 6
  26.            [6] => 7
  27.            [7] => 8
  28.            [8] => 11
  29.            [9] => 13
  30.            [10] => 14
  31.        )
  32.  
  33.    [m_vis] => Array
  34.        (
  35.            [3] => on
  36.            [8] => on
  37.            [10] => on
  38.        )
  39. )
  40. ?>

m_s - to informacja o sortowaniu bloków menu;
m_id - to numery ID bloków menu. Jak widać, niektóre bloki usunięto i nie ma kolejności liczbowej;
m_vis - to checkbox, które są w stanie ON (na liście jest ich tyle, ile bloków menu, w tym przypadku 11, bo "zero" też jest zliczane);

Potrzebuję wyjąć ID i przypisać do zaznaczonych "ON" checkbox, czyli wynik: 4-on, 11-on, 14-on; czyli: jakie ID mają aktywne checkbox.
Z wyniku ma powstać tablica przechowana w komórce tabeli.

W pętli do zliczania stosuję wartość z "m_s":
  1. <?php
  2. $ile=count($_POST['m_s']);
  3.  for($k=0;$k<$ile;$k++)
  4.  { print ' id:'.$_POST['m_id'][$k] ;}
  5. ?>

która daje wynik: id:1 id:2 id:3 id:4 id:5 id:6 id:7 id:8 id:11 id:13 id:14

Podobnie dla checkbox:
  1. <?php
  2. $ile=count($_POST['m_s']);
  3.  for($k=0;$k<$ile;$k++)
  4.  { print ' bx:'.$_POST['m_vis'][$k];}
  5. ?>

gdzie wynik: bx: bx: bx: bx:on bx: bx: bx: bx: bx:on bx: bx:on

Potrzebuję coś takiego:
$zapytanie
$wynik: cx: cx: cx: cx:4 cx: cx: cx: cx: cx:11 cx: cx:14

I tu drepczę w miejscu nie mając żadnego pomysłu. Czytam posty i mam tylko mętlik w głowie. Podpowiedzcie proszę.
Pilsener
Cytat
Potrzebuję wyjąć ID i przypisać do zaznaczonych "ON" checkbox, czyli wynik: 4-on, 11-on, 14-on; czyli: jakie ID mają aktywne checkbox.


Przecież przekazujesz ID w value - do value dajesz ID i odbierasz gotową tablicę m_s która wygląda np. tak:
Kod
[2] => 12
[3] => 46
[4] => 57
[5] => 65
- 12, 46 to są ID tych czekboksów, które zostały ON (zaznaczone), więc dalej nie bardzo rozumiem w czym problem? Jak ktoś nie zaznaczy czekboksa to jego ID nie zostanie wysłane i nie będzie go w tej tablicy.

Cytat
Z wyniku ma powstać tablica przechowana w komórce tabeli.


No to masz tablicę ID aktywnych czekboksów: 12,46,57,65 i:
- albo scalasz ją funkcją join/implode:
  1. <?php
  2. $dane = join(",",$_POST['m_s']);
  3. ?>

- albo korzystasz z funkcji serialize" title="Zobacz w manualu PHP" target="_manual, która służy do przechowywania tablic w postaci stringów
panyeti
Pilsner, pokarz proszę jak to zrobić, bo ja już nie ma rozumu i zaraz mnie coś trafi....
Pilsener
No dobra, to po kolei:

1. Robisz formularz:
  1. <form action="" method="post">
  2. <input type="checkbox" value="1" name="twoje_czekboksy[]" />
  3. <input type="checkbox" value="2" name="twoje_czekboksy[]" />
  4. <input type="checkbox" value="3" name="twoje_czekboksy[]" />
  5. <input type="submit" />
  6. </form>
- gdzie wszystkie czekboksy z danej grupy wrzucasz do jednej tablicy, natomiast value="" to będzie ID danej opcji, za którą odpowiada czekboks

2. Odbierasz dane:
  1. <?php
  2. $dane = $_POST['twoje_czekbosky']
  3. ?>
- otrzymujesz tablicę numeryczną, która zawiera tylko ID tych czekbosków, które zostały "zafajkowane" w formularzu

3. Zamieniasz te dane w string:
  1. <?php
  2. $dane = join(",",$dane);
  3. echo $dane;
  4. ?>
- jako separator dajesz np. przecinek - otrzymujesz ciąg ID oddzielonych od siebie przecinkiem

4. Zapisujesz to w bazie:
  1. INSERT INTO tabela (pole) VALUES('"$dane"')
- potem odczytać z powrotem te ID i wrzucić je do tablicy funkcją explode" title="Zobacz w manualu PHP" target="_manual

Nie wiem jak to prościej wytłumaczyć.
panyeti
Pilsner, ten pociąg nie pojedzie...
Zacznę od początku.
Przerabiam cms w którym bloki menu albo są, albo nie dla wszystkiego co się wyświetla. Chcę to zmienić i zrobić dedykowane menu dla wyświetlanych elementów,np. dla wolnych stron.
Przy tworzeniu wolnej strony mam z boku panel z dostępnymi blokami menu. Lista bloków jest zmienna i pobierana jest z tabeli "menu" ale checkboxy działają niezależnie - w momencie powstawania dokumentu są nieaktywne.
Wybieram, które bloki menu chcę żeby się wyświetlały razem z tym tworzonym dokumentem - zaznaczam checkboxy i wysyłam POSTem do tego samego pliku (jeszcze nie zapisuje całego dokumentu).
ID wybranych checkboxów potrzebuję w dwóch celach:
1. Robię z nich nazwę pliku w którym znajdują adresy do wybranych bloków menu i na podstawie tej nazwy są one wyświetlane, np.: 2-4-14-.php wyświetli trzy bloki menu o ID 2, 4 14.
2. ID jest potrzebne do identyfikacji wybranych menu podczas ponownej edycji danego pliku w panelu admina, czyli kiedy wyedytuję wolną stronę, wartość dla checkbox zostanie wyjęta z komórki bazy i przekazana do panelu menu dokumentu. Tu na podstawie przypisanych do chceckboxów ID zaznaczone zostaną odpowiednie pozycje na liście.

Tyle teoria, teraz pokażę jak to wygląda w kodach.
To panel z blokami menu do wyboru. Po zaznaczeniu i wysłaniu przez POST, wartości dla aktywnych chceckbox zwracane są przez $zpost['BX'].


  1. <?php
  2. if($_POST['savmenu'])
  3. {
  4.  $zpost['BX']=array();
  5.  $ile=count($_POST['m_s']);
  6.  for($k=0;$k<$ile;$k++)
  7.  { $zpost['BX']=$_POST['m_vis'];}
  8.  
  9.  unset($_POST['savmenu']);
  10. }
  11.  
  12.    db_read('ID,seq,text,disp','menu','m','ta',' ORDER BY seq');
  13.  
  14. $ile=count($m);
  15. for($i=0;$i<$ile;$i++) {
  16.  
  17. <form method="post" action="asnav.php">
  18.     <tr>
  19.    <td height="20">'.(($cfg['num']==1)?($i+1).'. ':'').$m[$i]['text'].'</td>
  20.        <td align="center"><input type="hidden" name="m_s['.$i.']" onblur="if(this.value==0) { this.value=''.$m[$i]['seq'].'' }" class="itm" value="'.$m[$i]['seq'].'" /><input class="itm" name="m_id['.$i.']" value="'.$m[$i]['ID'].'" /></td>
  21.    <td align="center"><input type="checkbox" name="m_vis['.$i.']"'.(($zpost['BX'][$i])?' checked="checked"':'').' /></td>
  22.      </tr>';
  23.  }
  24.  
  25.      <tr>
  26.    <td style="padding-top:10px; border-top:1px solid #ededeb;" colspan="3" align="center"><input type="submit" name="savmenu" value="zapisz" /></td>
  27.      </tr>';
  28. ?>



Pilsner, to co zaproponowałeś:
  1. <?php
  2. $dane = $_POST['twoje_czekbosky']
  3. ?>

zwraca jedynie stan czekboksów a nie ich ID sad.gif

Coś mi się wydaje, że chyba za bardzo kombinuję, bo przecież POSTA wykorzystuję w stanie, w jakim teraz jest, i po wyjęciu z bazy również w takiej formie. Sprawdzę to.
Pilsener
Cytat
zwraca jedynie stan czekboksów a nie ich ID
- no jak nie? A to co jest w value to niby co jest? Dostajesz przecież tablicę ID - przekazywane są tylko te ID, które zostały zafajkowane. Pokaż kod formularza - bo jeśli nie przekazujesz ID w value="ID" to nie będziesz ich miał - po to jest value="".
panyeti
To jest w $_POST
Kod
<pre>Array
         (
             [m_s] => Array
                 (
                     [0] => 1
                     [1] => 2
                     [2] => 3
                     [3] => 4
                     [4] => 5
                     [5] => 6
                     [6] => 7
                     [7] => 8
                     [8] => 10
                     [9] => 11
                     [10] => 12
                 )
        
             [m_id] => Array
                 (
                     [0] => 1
                     [1] => 2
                     [2] => 3
                     [3] => 4
                     [4] => 5
                     [5] => 6
                     [6] => 7
                     [7] => 8
                     [8] => 11
                     [9] => 13
                     [10] => 14
                 )
        
             [m_vis] => Array
                 (
                     [0] => on
                     [5] => on
                     [10] => on
                 )
        
         )
         </pre>


$dane=$_POST['m_vis'] wyświetla jedynie "array"

po użyciu funkcji for:
  1. <?php
  2. $dane[]=array();
  3.  $ile=count($_POST['m_s']);
  4.  for($k=0;$k<$ile;$k++)
  5.  { $dane=$_POST['m_vis'];
  6.     echo $dane[$k]; }
  7. ?>


wyświetla "ononon", czyli zwraca stan ON trzech czekboksów z listy POST.
Po zmianie zapytania na "m_id" zwraca:"1 2 3 4 5 6 7 8 11 13 14".
Wszystko w pętli odnoszone jest do pozycji na liście POST, trzeba tak zapytać, żeby zwróciło tylko numery ID tych czekboksów, czyli 1 6 14.
Ja już chyba jestem za stary na te łamigłówki.
Jak to rozwiążę będę happy, bo serialize i unserialize załatwiło sprawę przechowywania informacji o stanie chceckbox. Teraz tylko zrobienie nazwy pliku menu z tych nieszczęsnych ID.
W każdym bądź razie, bardzo ci dziękuję Pilsner za pomoc i cierpliwość dla starego tetryka smile.gif
Pilsener
Cytat
wyświetla "ononon", czyli zwraca stan ON trzech czekboksów z listy POST.
- bo musisz dla każdego czekboksa dać w formularzu value="{ID}", inaczej będą przekazywały wartość domyślną, czyli "on".
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.