Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Filtrowanie wyników wyszukiwania na żywo, sortowanie tabeli z inputem
roghatt
post 29.08.2012, 08:40:25
Post #1





Grupa: Zarejestrowani
Postów: 250
Pomógł: 11
Dołączył: 20.03.2006

Ostrzeżenie: (0%)
-----


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.

Ten post edytował roghatt 29.08.2012, 08:40:37
Go to the top of the page
+Quote Post
b4rt3kk
post 29.08.2012, 10:11:42
Post #2





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.

Ten post edytował b4rt3kk 29.08.2012, 10:15:14


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
roghatt
post 29.08.2012, 13:01:31
Post #3





Grupa: Zarejestrowani
Postów: 250
Pomógł: 11
Dołączył: 20.03.2006

Ostrzeżenie: (0%)
-----


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.

Ten post edytował roghatt 29.08.2012, 13:05:50
Go to the top of the page
+Quote Post
b4rt3kk
post 29.08.2012, 13:15:26
Post #4





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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];


Ten post edytował b4rt3kk 29.08.2012, 13:18:00


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
roghatt
post 29.08.2012, 13:37:00
Post #5





Grupa: Zarejestrowani
Postów: 250
Pomógł: 11
Dołączył: 20.03.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
b4rt3kk
post 29.08.2012, 13:39:50
Post #6





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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>

Ten post edytował b4rt3kk 29.08.2012, 13:42:04


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
roghatt
post 29.08.2012, 14:12:39
Post #7





Grupa: Zarejestrowani
Postów: 250
Pomógł: 11
Dołączył: 20.03.2006

Ostrzeżenie: (0%)
-----


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. ...
Go to the top of the page
+Quote Post
b4rt3kk
post 29.08.2012, 14:50:42
Post #8





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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].


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
roghatt
post 30.08.2012, 10:28:05
Post #9





Grupa: Zarejestrowani
Postów: 250
Pomógł: 11
Dołączył: 20.03.2006

Ostrzeżenie: (0%)
-----


ale w jakim celu i w jaki sposób miałoby to działać? Nie do końca rozumiem
Go to the top of the page
+Quote Post
b4rt3kk
post 30.08.2012, 16:18:59
Post #10





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.

Ten post edytował b4rt3kk 30.08.2012, 16:22:19


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
roghatt
post 31.08.2012, 10:29:18
Post #11





Grupa: Zarejestrowani
Postów: 250
Pomógł: 11
Dołączył: 20.03.2006

Ostrzeżenie: (0%)
-----


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?

Ten post edytował roghatt 31.08.2012, 10:39:58
Go to the top of the page
+Quote Post
b4rt3kk
post 31.08.2012, 10:48:05
Post #12





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.  


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
roghatt
post 31.08.2012, 11:10:55
Post #13





Grupa: Zarejestrowani
Postów: 250
Pomógł: 11
Dołączył: 20.03.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
viking
post 31.08.2012, 11:14:12
Post #14





Grupa: Zarejestrowani
Postów: 6 376
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 4.05.2025 - 08:31