Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] zapytanie sql a paginacja
Forum PHP.pl > Forum > Przedszkole
kredka
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.  
wookieb
Proszę wstawić BBCODE
Daiquiri
Nie bardzo rozumiem, co rozumiesz przez "wcześniejszego filtrowania"? Czy na pewno za każdym razem masz ustawiony $_REQUEST['page']?
kredka
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.
Daiquiri
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";
kredka
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:)
amii
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;
kredka
  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.  
amii
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'] : ''; ?>" />



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



Daiquiri
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.
kredka
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
Daiquiri
Limit 25, 25? Nie bardzo chyba rozumiem smile.gif. I zwraca Ci to wszystkie pozycje z bazy?
kredka
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
PanGuzol
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.
kredka
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.
PanGuzol
Po przesłaniu formularza zapisuj warunki w tablicy SESSION a następnie tam gdzie teraz sprawdzasz tablicę POST sprawdzasz SESSION.
kredka
Dzięki PanieGuzol
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.