Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] zapytanie sql a paginacja
kredka
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 11.03.2011

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


Witajcie,

Sem tu brand new, więc proszę o wyrozumiałość smile.gif

Zwyczajowo czytam i męczę kody do skutku (php mniej). W tym przypadku rozłożyłam ręcę i proszę o pomoc lub zrozumiałą wskazówkę.

Do rzeczy:

Plik php ma niby proste zadanie wyświetlać rekordy z bazy mysql wg zadanych kryteriów i dzielić na strony.

Wszystko wygląda dobrze tylko na stronie pierwszej. Na kolejnych baza pokazuje się "jak leci" bez ograniczeń "wcześniejszego filtrowania". Może to przez warunki? Jak mogłabym to poprawić?

Będę przeogromnie wdzięczna za pomoc.



I głębokie wejrzenie w kodowe oczy:

[To tylko wycinki większego kodu]

-----------------------------------------------------1 formularz----------------------------------
  1. <form method='post' action='index.php'>
  2. <input type="checkbox" name="bialy" value="bialy" onchange='java script: document.form.submit();' />
  3. <input type="checkbox" name="czarny" value="czarny" onchange='java script: document.form.submit();' />
  4. <select name="w1" onchange='java script: document.form.submit();' width="200" style="width: 200px">
  5. <option value="----------">----------</option>
  6. <option value="a">a</option>
  7. <option value="b">b</option>
  8. <option value="----------">----------</option>
  9. </select>
  10. <input type="submit" value="Wyszukaj" />
  11. </form>
  12.  

-----------------------------------------------------2 łączymy z bazą----------------------------------
łączymy z bazą

  1. $_POST['w1'];
  2. $_POST['bialy'];
  3. $_POST['czarny'];
  4.  
  5.  
  6. $w1=$_POST['w1'];
  7. $bialy=$_POST['bialy'];
  8. $czarny=$_POST['czarny'];
  9.  
  10.  

-----------------------------------------------------warunki do zapytania----------------------------------


  1. if ($w1=='----------')
  2. {
  3. $w1a='';
  4. }
  5.  
  6. if ($w1=='a')
  7. {
  8. $w1a='and `w1` = \'a\'';
  9. }
  10.  
  11.  
  12. if ($w1=='b')
  13. {
  14. $w1a='and `w1` = \'b\'';
  15. }
  16.  
  17.  
  18. if ($bialy=='bialy')
  19. {
  20. $bialya='and `bialy` = \'bialy\'';
  21. }
  22. else
  23. {
  24. $bialya='';
  25. }
  26.  
  27.  
  28. if ($czarny=='czarny')
  29. {
  30. $czarnya='and `czarny` = \'czarny\'';
  31. }
  32. else
  33. {
  34. $czarnya='';
  35. }
  36.  


-----------------------------------------------------zapytanie----------------------------------


  1. $perPage = 25;
  2. if (is_numeric($_REQUEST['page'])) {
  3. $page = (int) $_REQUEST['page'];
  4. if ($page < 1) {
  5. $page = 1;
  6. }
  7. } else {
  8. $page = 1;
  9. }
  10. $start = ($page - 1) * $perPage;
  11.  
  12.  
  13.  
  14.  
  15.  
  16. $zapytanie = "SELECT * FROM `nazwabazy` WHERE $w1a $bialya $czarnya ORDER BY `nazwabazy`.`id` DESC limit $start, $perPage";
  17.  
  18.  
  19. $idzapytania = mysql_query($zapytanie);
  20.  


tu się wyświetlają dane....

-----------------------------------------------------paginacja----------------------------------


  1. if ($prev==0)
  2. {
  3. echo "";
  4. }
  5. else
  6. {
  7. echo "<a href=\"index.php?page=".$prev."\">[ ".$prev." ]</a>&nbsp;&nbsp;&nbsp;&nbsp;";
  8. }
  9.  
  10.  
  11.  
  12.  
  13.  
  14. echo "<b>[ ".$page." ]</b>"; //obecna
  15.  
  16.  
  17.  
  18.  
  19.  
  20. if (mysql_num_rows($filtr)-1>$perPage*$page)
  21. {
  22. echo "&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"index.php?page=".$next."\">[ ".$next." ]</a>";
  23. }
  24.  
  25.  
  26. // zamykamy połączenie
  27. mysql_close($connection);
  28.  
  29. ?>
  30.  


Ten post edytował kredka 11.03.2011, 14:57:27
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 17)
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Proszę wstawić BBCODE


--------------------
Go to the top of the page
+Quote Post
Daiquiri
post
Post #3





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Nie bardzo rozumiem, co rozumiesz przez "wcześniejszego filtrowania"? Czy na pewno za każdym razem masz ustawiony $_REQUEST['page']?
Go to the top of the page
+Quote Post
kredka
post
Post #4





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 11.03.2011

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


Przed zapytaniem mam $_REQUEST['page']

  1. $perPage = 25;
  2. if (is_numeric($_REQUEST['page'])) {
  3. $page = (int) $_REQUEST['page'];
  4. if ($page < 1) {
  5. $page = 1;
  6. }
  7. } else {
  8. $page = 1;
  9. }
  10. $start = ($page - 1) * $perPage;


"wcześniejsze filtrowanie" = wybór kryteriów wyszukiwania w formularzu. Po kliknięciu w submit jest ok, po przejściu do kolejnej strony index.php?page=2 już nie.
Go to the top of the page
+Quote Post
Daiquiri
post
Post #5





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




W warunku masz: jeżeli page jest numeryczny to rzutuj na int (i) jeżeli jest mniejszy od 1 to ustaw 1, jeżeli page nie jest numeryczny ustaw 1. Jeżeli tak miało być (a domyślam się, ze tak) to błąd leży w innym miejscu. Jeżeli page będzie równy np. 2 to $page = 2, a $start = 25; natomiast zapytanie:
  1. $zapytanie = "SELECT * FROM `nazwabazy` WHERE $w1a $bialya $czarnya ORDER BY `nazwabazy`.`id` DESC limit 25, 2";
Czy tak miało być smile.gif?

Jeżeli page będzie równy np. 1 to $page = 1, a $start = 0; natomiast zapytanie:
  1. $zapytanie = "SELECT * FROM `nazwabazy` WHERE $w1a $bialya $czarnya ORDER BY `nazwabazy`.`id` DESC limit 0, 1";
Go to the top of the page
+Quote Post
kredka
post
Post #6





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 11.03.2011

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


Obawiam się, że nie w samej paginacji jest problem. Używałam różnych skryptów.

Problem pojawia się wówczas, gdy przechodzimy na kolejną dowolną stronę. Filtrowanie przestaje działać i wyświetla wyniki z całej bazy.

Np. wybieram w formularzu: w1=budynki
Na pierwszej stronie baza zwraca mi 50 wyników i pokazuje wyłącznie budynki.

Wykonuje się ładnie zapytanie posiłkowane zmiennymi z formularza:

  1.  
  2. if ($w1=='budynek')
  3. {
  4. $w1a='and `w1` = \'budynek\'';
  5. }
  6.  
  7. $zapytanie = "SELECT * FROM `nazwabazy` WHERE `pokazuj` = 'tak' $w1a $bialya $czarnya ORDER BY `nazwabazy`.`id` DESC limit $start, $perPage";
  8.  


Przechodząc na stronę dowolnie kolejną widzę już ilość wszystkich wprowadzonych rekordów, np. 1000 i liczbę stron dla wyników z całej bazy.

Wygląda to tak, jakby na stronach kolejnych wykonywało się zapytanie bez warunków zmiennych $w1a $bialya $czarnya:

  1.  
  2. $zapytanie = "SELECT * FROM `nazwabazy` WHERE `pokazuj` = 'tak' ORDER BY `nazwabazy`.`id` DESC limit $start, $perPage";
  3.  


bankzdjec.php?$w1a nie pomaga:)
Go to the top of the page
+Quote Post
amii
post
Post #7





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


Tutaj w obydwu przypadkach wyświetli $page=1 lub jeśli zmiennej page nie będzie w łańcuchu ani nie będzie numeryczna cały ten warunek się nie wykona (nie widzę gdzie się kończy bo masz pourywany kod).
po za tym gzie inicjujesz zmienne $prev i $next ?

  1.  
  2. $perPage = 25;
  3. if (is_numeric($_REQUEST['page'])) {
  4. $page = (int) $_REQUEST['page'];
  5. if ($page < 1) {
  6. $page = 1;
  7. }
  8. } else {
  9. $page = 1;
  10. }
  11. $start = ($page - 1) * $perPage;


Ten post edytował amii 12.03.2011, 12:34:48


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
kredka
post
Post #8





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 11.03.2011

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


  1. $perPage = 25;
  2. if (is_numeric($_REQUEST['page'])) {
  3. $page = (int) $_REQUEST['page'];
  4. if ($page < 1) {
  5. $page = 1;
  6. }
  7. } else {
  8. $page = 1;
  9. }
  10. $start = ($page - 1) * $perPage;
  11.  
  12.  
  13. //tu zapytanie i wyniki
  14.  
  15.  
  16.  
  17. $prev = $page - 1;
  18. $next = $page + 1;
  19. $prevLink = $_SERVER['PHP_SELF'] . '?page=' . $prev;
  20. $nextLink = $_SERVER['PHP_SELF'] . '?page=' . $next;
  21.  
  22.  
  23.  
  24.  
  25. echo "<br><br>";
  26.  
  27.  
  28.  
  29. if ($prev==0)
  30. {
  31. echo "";
  32. }
  33. else
  34. {
  35. echo "<a href=\"index.php?page=".$prev."\">[ ".$prev." ]</a>&nbsp;&nbsp;&nbsp;&nbsp;";
  36. }
  37.  
  38.  
  39.  
  40.  
  41.  
  42. echo "<b>[ ".$page." ]</b>"; //obecna
  43.  
  44.  
  45.  
  46.  
  47.  
  48. if (mysql_num_rows($filtr)-1>$perPage*$page)
  49. {
  50. echo "&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"index.php?page=".$next."\">[ ".$next." ]</a>";
  51. }
  52.  
  53.  
  54. // zamykamy połączenie
  55. mysql_close($connection);
  56.  
  57. ?>
  58.  
  59.  
  60.  
  61.  
  62.  
Go to the top of the page
+Quote Post
amii
post
Post #9





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


OK to jest chyba w porządku
  1. if (is_numeric($_REQUEST['page'])) {
  2.  
  3. $page = (int) $_REQUEST['page'];
  4.  
  5. if ($page < 1) $page = 1; //jesli jest wartoscia numeryczna i ma wartosc mniejsza niz 1 to m byc 1
  6.  
  7. } else $page = 1; //jesli page nie jest wartoscia numeryczna to ma byc 1


Ale gdzie wysyłasz aktualny numer strony przez formularz ?
  1. <input type="hidden" name="page" value="<?php echo isset($_REQUEST['page']) ? $_REQUEST['page'] : ''; ?>" />





--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
kredka
post
Post #10





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 11.03.2011

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


jw, skrypt numer strony wysyła metodą GET, a nie POST. Przechodzi w adresie.

Może inaczej: Jak byście ugryźli "małe allegro" lub cokolwiek podobnego?

Po lewej formularz z kryterium wyboru (imputy, checkboxy, selecty), po prawej wyniki z podziałem na strony.



Go to the top of the page
+Quote Post
Daiquiri
post
Post #11





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Stop. Zatrzymajmy się przy tym, że zapytanie jest źle budowane. Skoro wszystko działa, tylko dostajesz wszystkie pozycje z bazy, coś jest tam namieszane. Zrób echo dla $zapytanie kiedy $_GET['page'] !=1 smile.gif.
Go to the top of the page
+Quote Post
kredka
post
Post #12





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 11.03.2011

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


Echo ze strony pierwszej "index.php":

  1. SELECT * FROM `nazwabazy` WHERE `pokaz` = 'tak' and `w1` = 'budynki' and `bialy` = 'bialy' and `czarny` = 'czarny' limit 0, 25
  2.  


Echo ze strony drugiej "index.php?page=2":

  1. SELECT * FROM `nazwabazy` WHERE `pokaz` = 'tak' ORDER BY `nazwabazy`.`id` DESC limit 25, 25



Mam nadzieję, że o to chodziło. Wszystko rozbija się o te $bialy, $czarny i $w1 z formularza lub $bialya, $czarnya i $w1a z warunków

Ten post edytował kredka 12.03.2011, 16:20:17
Go to the top of the page
+Quote Post
Daiquiri
post
Post #13





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Limit 25, 25? Nie bardzo chyba rozumiem smile.gif. I zwraca Ci to wszystkie pozycje z bazy?
Go to the top of the page
+Quote Post
kredka
post
Post #14





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 11.03.2011

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


Od 2 w kolejnych stronach wyświetlania - tak:) Przecież wiesz, że nie na jednej, bo tam jest po 25 rekordów

to tak po męsku smile.gif :

Wchodzi sobie jegomość na stronę, wybiera śrubokręty czerwone w formularzu.

Na pierwszej stronie po kliknięciu w selecta jawi mu się obraz pożądanych przez niego pięknych śrubokrętów czerwonych
na kolejnych: śrubokręty, młotki, szminki, stringi, sukienki, pluszowe niedźwiedzie i tabletki na zdrowotnośc wszelaką smile.gif

Nie o to, nie o to smile.gif
Go to the top of the page
+Quote Post
PanGuzol
post
Post #15





Grupa: Zarejestrowani
Postów: 353
Pomógł: 50
Dołączył: 28.07.2005
Skąd: Łaziska Górne

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


Przechodząc na druga stronę nie wysyłasz formularza, tablica POST jest pusta i niema żadnych warunków.
Zapisz sobie kryteria wyszukiwania w SESSION lub przekazuj przez GET.


--------------------
Sposób na życie? Uśmiech na twarzy :D
"Widzę więcej, wiem więcej, tak to jest mniej więcej"
"NIE kradnij, rząd nielubi konkurencji"
Go to the top of the page
+Quote Post
kredka
post
Post #16





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 11.03.2011

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


get nie działa ze względu na zastosowane w pliku warunki (na moje skromne "przedszkolne" oko)

o session i cookie myślałam jeszcze przed zalogowaniem na tym forum, ale zwyczajnie nie umiem tego powiązać wlaściwie. Niby sprawa prosta, ale w pliku mi je je i zdycha.

Pomoże ktoś? Do diabła to podstawowa funcja wyświetlania zawartości tablicy w przystępnej dla użytkownika formie.
Go to the top of the page
+Quote Post
PanGuzol
post
Post #17





Grupa: Zarejestrowani
Postów: 353
Pomógł: 50
Dołączył: 28.07.2005
Skąd: Łaziska Górne

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


Po przesłaniu formularza zapisuj warunki w tablicy SESSION a następnie tam gdzie teraz sprawdzasz tablicę POST sprawdzasz SESSION.


--------------------
Sposób na życie? Uśmiech na twarzy :D
"Widzę więcej, wiem więcej, tak to jest mniej więcej"
"NIE kradnij, rząd nielubi konkurencji"
Go to the top of the page
+Quote Post
kredka
post
Post #18





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 11.03.2011

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


Dzięki PanieGuzol
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 Aktualny czas: 21.08.2025 - 17:01