Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Filtrowanie wyników wyszukiwania na żywo
Forum PHP.pl > Forum > Przedszkole
roghatt
Witam
Mam jeden problem i pytanie.
Najpierw pytanie.
Mam pole do wpisania słowa do wyszukania.
Pod spodem w tabelce mam wypisane dane z bazy np.Nazwa, cena, rodzaj.
Czy jest możliwość zrobienia aby po wpisywaniu pierwszych liter w polu wyszukiwania tabela się odpowiednio filtrowała z pasującymi wynikami? Aby tylko zostawały wiersze z pasującymi wynikami

I teraz problem
Mam taką tabelkę jak wyżej ale z dodatkową kolumną z inputem text "wpisz ilosc".
Mam zrobione zwykłe sortowanie tabeli tablesorter jquery http://tablesorter.com/docs/
Problem jest taki, ze jak wpiszę w pola wpisz ilość jakieś cyferki i zmienię sortowanie, wszystko się ułoży inaczej to pola z wpisanymi cyframi też się odpowiednio sortują, ale jak na dole nacisnę dodaj do bazy to niestety daną cyferkę wpisuje do produktu który znajdował się w wierszu przed sortowaniem.

Przykład
ilość wpisuję tylko do anteny:
komputer, 2000zł, sprzęt, 0
telewizor, 1500zł, rtv, 0
antena, 400zł, sprzęt, 3

Posortuje po nazwie:
antena, 400zł, sprzęt, 3
komputer, 2000zł, sprzęt, 0
telewizor, 1500zł, rtv, 0
tutaj naciskam na dodaj do bazy

Do bazy wpisuje się ilość 3szt do telewizora a nie do anteny. Czyli jakby była zapamiętywany wiersz w którym na początku się wpisuje.
b4rt3kk
Użyj w tym celu ajaxa, tj. że po wpisaniu kilku liter filtruje wyniki.

Co do kwestii sortowania i zapisywania do bazy być może jest tak, że jQuery zmienia jedynie wartości (value) inputów, jednak name, id, itd. pozostaje identyczne, musisz zwrócić na to uwagę. Przed dodaniem do bazy wyświetl sobie tablicę wynikową $_POST czy tam w jaki sposób przekazujesz zmienne.
roghatt
ok, znalazłem takie coś.
Mam problem tylko z tym inputem bo coś z niego mi nie wyświetla wartości


  1. while ( $row = mysql_fetch_object( $fetch ) ) {
  2. $sResults .= '<tr id="'. $row->id . '">';
  3. $sResults .= '<td>' . $row->nazwa . '</td>';
  4. $sResults .= '<td>' . $row->cenan . '</td>';
  5. $sResults .= '<td><INPUT TYPE="TEXT" NAME="ilosc[]" size="2" class="pole_tekstowe"></td></tr>';
  6. $ilosc = $_POST['ilosc'][$i];
  7. ...
  8. if ($ilosc>0) {
  9. ...

Pod spodem mam później funkcje, że jeśli ilosc>0 to ma wpisać do bazy itp. Oczywiście po wykonaniu jeszcze raz tego pliku. Dlatego POST.
Ale jakoś mi do zmiennej $ilosc nie zapisuje cyfry która jest wpisywana do input.
b4rt3kk
Daj przed pętlą print_r($_POST) lub print_r($_POST['ilosc']), prześlij formularz i zobacz czy rzeczywiście dane z inputów przekazywane są do tablicy.

Poza tym jaka jest wartość $i? Przed pętlą daj $i=0, po przekazaniu do zmiennej $ilosc, daj inkrementację $i++.

Jeśli nie masz nigdzie ustalonej wartości $i to wywołanie:
  1. $ilosc = $_POST['ilosc'][$i];

daje w efekcie:
  1. $ilosc = $_POST['ilosc'][NULL];
roghatt
Tak przed while mam $i=0;
później po wpisaniu do tablicy $i++;

print_r($_POST)
wypisał mi:
Array ( [test] => test )

a test to nazwa pola input gdzie wpisuję wyszukiwane hasło. To jak pobrać dane z input gdzie wpisuję ilość. Strona zostaje przeładowana jak wpisze ilosc przy interesujących wierszach i jak potwierdzę.

Po wpisaniu w input wyszukiwarki słowa, strona "na żywo" się filtruje.
b4rt3kk
Więc wygląda na to, że value z pola 'ilosc' w ogóle nie zostaje przesłana. Spróbuj zmienić nazwę pola ilosc[] na np. ilosc1. Być może też przesyłasz niewłaściwy formularz, pola ilosc mogą znajdować się poza formularzem, może też masz formularz w formularzu? Wyświetl sobie źródło strony i sprawdź czy inputy ilosc znajdują się pomiędzy znacznikami <form>...</form>
roghatt
super, to była przyczyna. Linijkę za nisko. Mimo, że na stronie i w źródle wyglądało, że wszystko było ok to nie zapisywało do tablicy.
Dzięki za pomoc w rozwiązaniu tego problemu.

Jeśli jeszcze wrócę do tego jednego problemu.

Wyniki z bazy filtrują się na żywo, dane wypisuje powiedzmy alfabetycznie. Tutaj jeśli wpiszę szukane słowo i pojawi się produkt np. z końca listy i wpiszę ilość i dodam do bazy to zawsze mi zapisuje tą ilość do pierwszego produktu.
Array wyświetla (przy wpisaniu ilości przy dwóch produktach:
Array ( [ilosc] => Array ( [0] => 5 [1] => 10 ) )
Ale pod spodem znowu:
Array ( [ilosc] => Array ( [0] => 5 [1] => 10 ) )
Array ( [ilosc] => Array ( [0] => 5 [1] => 10 ) ) Array ( [ilosc] => Array ( [0] => 5 [1] => 10 ) ) Array ( [ilosc] => Array ( [0] => 5 [1] => 10 ) ) Array ( [ilosc] => Array ( [0] => 5 [1] => 10 ) )

Wspomnę, że przeładowywana jest ta sama strona, na której filtrowane są produkty

  1. $i=1;
  2. while ( $row = mysql_fetch_object( $fetch ) ) {
  3. $sResults .= '<tr id="'. $row->id . '">';
  4. $sResults .= '<td>' . $row->nazwa . '</td>';
  5. $sResults .= '<td>' . $row->cenan . '</td>';
  6. $sResults .= '<td><INPUT TYPE="TEXT" NAME="ilosc[]" size="2" class="pole_tekstowe"></td></tr>';
  7. $ilosc = $_POST['ilosc'][$i];
  8. $i++
  9. print_r($_POST);
  10. ...
  11. if ($ilosc>0) {
  12. tutaj dodawanie do bazy
  13. ...
b4rt3kk
Takie generowanie nazw inputów name='ilosc[]' powoduje, że tablica powstaje dynamicznie, co oznacza, że przestawienie kolejności nie powoduje przemieszania tabeli tak jakbyś chciał, bo nazwy ciągle są od 0...n w kolejności numerycznej. Proponuję dorzucić jakiś atrybut, np id. ilosc[$id].
roghatt
ale w jakim celu i w jaki sposób miałoby to działać? Nie do końca rozumiem
b4rt3kk
Wyobraź sobie, że dodajesz dynamicznie do tabeli elementy, w ten sposób:
  1. $tabela[] = 'wartosc';

Nie nadajesz elementom indeksów, tylko każdy element dodawany jest jako pierwszy wolny. Teraz w Twoim przypadku, masz listę:
- komputer
- telewizor
- antena
i każdemu odpowiada jeden input ilosc, w którym wpisujesz ilość, mają następujące indeksy (bo tablica jest generowana dynamicznie): 0, 1, 2. No i jak dostajesz zmienną $_POST['ilosc'][0] to nie wiesz czego jest to ilość, bo index 0 w tabeli nie jest w żaden sposób powiązany sztywno z komputerem, prawda? Co się stanie, gdy posortujesz tabelę w odwrotnej kolejności?
- antena
- telewizor
- komputer
Teraz $_POST['ilosc'][0] przechowuje ilość dla anteny, co powoduje dwuznaczność. Musisz zrobić tak, by powiązanie indexów w tabeli z produktami było jednoznaczne. Więc jako indexy daj np. id produktów.

Dzięki temu łatwo odczytać wartości:
  1. foreach ($_POST['ilosc'] as $key => $value) {
  2. $key; // tutaj masz id produktu
  3. $value; // tutaj masz podaną ilość
  4. }


I bez względu na sortowanie wiesz, że np. dla produktu o id 10 ilość wynosi 3, itd.
roghatt
Rozumiem już o co chodzi, ale mam problem teraz aby to dokładnie w kodzie napisać. Nie za bardzo z tablicami miałem do czynienia.

Zmieniłem to trochę i dałem aby kluczem w tablicy były nazwy produktów:

  1. while ( $row = mysql_fetch_object( $fetch ) ) {
  2.  
  3. $nazwa=$row->nazwa;
  4. $sResults .= '<tr id="'. $row->id . '">';
  5. $sResults .= '<td>' . $row->nazwa . '</td>';
  6. $sResults .= '<td>' . $row->cenan . '</td>';
  7. $sResults .= '<td>' . $id . '</td>';
  8. $sResults .= '<td><INPUT TYPE="TEXT" name="ilosc2" size="2" class="pole_tekstowe"></td></tr>';
  9. $ilosc=$_POST['ilosc2'];
  10.  
  11. $tablica = array ($nazwa=>$ilosc);
  12.  
  13. foreach ($tablica as $nazwa => $ilosc) {
  14. echo $nazwa . ": " . $ilosc . "<br>\n";
  15. }
  16. ...


Wypisuje mi to:
nazwa produktu:
nazwa produktu2:
nazwa produktu3:

Ale właśnie nie dopisuje mi wartości do każdego klucza czyli tą ilość
Tutaj do input ilosc trzeba zastosować też tablicę? Myślałem, że jak w pętli POST pobierze z INPUT nazwę to od razu wpisze do odpowiedniego klucza.
Dobrze tutaj kombinuję z tą tablicą $tablica?
b4rt3kk
Spróbuj tak:

  1. while ( $row = mysql_fetch_object( $fetch ) ) {
  2.  
  3. $nazwa=$row->nazwa;
  4. $sResults .= '<tr id="'. $row->id . '">';
  5. $sResults .= '<td>' . $row->nazwa . '</td>';
  6. $sResults .= '<td>' . $row->cenan . '</td>';
  7. $sResults .= '<td>' . $id . '</td>';
  8. $sResults .= '<td><INPUT TYPE="TEXT" name="ilosc['.$row->nazwa.']" size="2" class="pole_tekstowe"></td></tr>';
  9.  
  10.  
  11. $tablica = array ($nazwa=>$ilosc); // to do wywalenia, generujesz nową tablicę za każdym obrotem pętli
  12.  
  13. ... // dalsza część pętli


Wyświetl teraz wyniki poza pętlą (oczywiście po przesłaniu formularza):

  1.  
  2. foreach ($_POST['ilosc'] as $nazwa => $ilosc) {
  3. echo $nazwa . ": " . $ilosc . "<br>\n";
  4. }
  5.  
roghatt
dzięki wielkie po raz kolejny. Teraz działa. Ładnie mi wypisuje tablice i później dodaje do bazy.

Linijka
  1. foreach ($_POST['ilosc'] as $nazwa => $ilosc)

Dawała błąd:
Warning: Invalid argument supplied for foreach()...

ale dopisanie:
  1. foreach ((array)$_POST['ilosc'] as $nazwa => $ilosc)

już błędu nie wywala i wszystko dobrze działa...
co to dokładnie daje? bo przykład z tym array znalazłem gdzies w innym temacie.
viking
Pętle iterują po tablicach. W pierwszym masz coś (print_r($POST['ilosc'])) co na pewno tablicą nie jest, w drugim robisz rzutowanie http://us2.php.net/manual/en/language.type...pes.typecasting
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.