Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]paginacja nie działa
Forum PHP.pl > Forum > Przedszkole
Michał90
Witam,
Mam taki kod
  1. <?php
  2. if(isset($_POST['znajdz']))
  3. {
  4. $tytul = $_POST['tytul'];
  5. $autor = $_POST["autor"];
  6. $tytul = ucfirst(strtolower($tytul));
  7. $autor = ucfirst(strtolower($autor));
  8. if (empty($_GET['page']) || !is_numeric($_GET['page']) || $_GET['page'] < 0) {
  9. $page = 1;
  10. } else {
  11. $page = $_GET['page'];
  12. }
  13. $ile=5;
  14. $od=($page*$ile);
  15. $connection = mysql_connect('localhost','xxxx','xxxx','xxxx');
  16. mysql_select_db ('xxxxx');
  17.  
  18.  
  19. if(empty($tytul) && empty($autor)) {
  20. die("Formularz wypełniony niepoprawnie! Nie można wyświetlić wyników wyszukiwania!");
  21. }
  22. $zapytanie = exit("SELECT * FROM `wynik` WHERE `tytul` LIKE '%$tytul%' AND `autor` LIKE '%$autor%' LIMIT ".$od.",".$ile."") or die(mysql_error());
  23.  
  24. if(mysql_num_rows($zapytanie)==0){
  25. echo "Nie znaleziono wpisów.";
  26. }
  27.  
  28. while( $row = mysql_fetch_array($zapytanie) )
  29. {
  30.  
  31. echo '<div class="post">';
  32. echo '<div class="l"> <a href='.$row['link'].' title='.$row['linka'].'><img src='.$row['img'].' alt="" /></a> </div>';
  33. echo '<div class="r">';
  34. echo '<h2><a href='.$row['link'].' title='.$row['linka'].'>'.$row['tytul'].'</a></h2>';
  35. echo '</div>';
  36. echo '</div>';
  37.  
  38. }
  39.  
  40. echo '<a href="search.php?page='.$page.'">następna</a>';
  41.  
  42.  
  43. mysql_close($connection);
  44. }
  45. ?>


Ale jak klikne następną strone to już nie ma wyników dlaczego sad.gif ?

Pozdrawiam
Tokk
  1. $zapytanie = mysql_query("SELECT * FROM `wynik` WHERE `tytul` LIKE '%$tytul%' AND `autor` LIKE '%$autor%' LIMIT ".$od.",".$ile."") or die(mysql_error());

Michał90
Zmieniłem ale nie pomogło...
Tzn. jest tak samo wyświetla pierwszych 5 wyników, ale gdy klikam na następną strone to już nie ma żadnych rekordów sad.gif, wiem, że powinny być bo wyników jest więcej niż 5
Szeszek1992
Zacznijmy od tego:
  1. $ile=5;
  2. $od=($page*$ile);

Nie wyświetla Ci pierwszych pięciu rekordów, tylko 5 rekordów zaczynając od 6 i kończąc na 10, dlatego też powinno być:
  1. $ile=5;
  2. $od=($page-1)*$ile;

Dziwi mnie też, że nie działa link, gdyż przed tym:
  1. echo '<a href="search.php?page='.$page.'">następna</a>';

nie ma inkrementacji wartości zmiennej $page(w tym przypadku jest ona taka sama jak w adresie)
thek
Po pierwsze to zdecyduj się czy pierwsza strona jest numerowana od 0 czy 1 smile.gif Bo jeśli od 0 to Ci się rypnie skrypt przy sprawdzaniu empty, który stronę 0 wychwyci jako pustą i wpisze tam 1, czyli de facto drugą.
Jeśli zaczynać chcesz od strony pierwszej to musisz od wyników odejmować 1 bo pierwszą partią jaką poślesz do bazy będzie LIMIT 5, 5 czyli pobierz 5 rekordów począwszy od 5, a nie o to Ci chyba chodzi, tylko LIMIT 0, 5 smile.gif
Stąd konieczność zmiany
  1. if (empty($_GET['page']) || !is_numeric($_GET['page']) || $_GET['page'] < 1) {
  2. $page = 1;
  3. } else {
  4. $page = $_GET['page']-1;
  5. }
lub jak radzi Szeszek dopiero przy zmiennej $od odejmować 1.
No i wspomnianej strony Następna na o DWA większą (o jeden jeśli posłużysz się sposobem Szeszka), bo w końcu wcześniej zmniejszyłeś ją już o jeden smile.gif
  1. echo '<a href="search.php?page='.($page+2).'">następna</a>';
Inna sprawa, że głupotą jest tak robić bo nie masz ogranicznika i możesz nawet sobie od 3 strony mieć wyniki puste, ale możesz przechodzić sobie na kolejne do usranej śmierci bo link Następna nadal będzie się zwiększał. Musisz zrobić ograniczenie, które wyeliminuje dodawanie tego linku gdy osiągniesz ostatnie rekordy tabeli.
Szeszek1992
Dla ścisłości
http://php.about.com/od/mysqlcommands/g/Limit_sql.htm
Zostaną wyświetlone rekordy 6-10;)
Co do ogranicznika zgadzam się z Thekiem.
Michał90
czyli tak to ma wyglądać?

  1. <?php
  2. if(isset($_POST['znajdz']))
  3. {
  4. $tytul = $_POST['tytul'];
  5. $autor = $_POST["autor"];
  6. $tytul = ucfirst(strtolower($tytul));
  7. $autor = ucfirst(strtolower($autor));
  8. if (empty($_GET['page']) || !is_numeric($_GET['page']) || $_GET['page'] < 1) {
  9. $page = 1;
  10. } else {
  11. $page = $_GET['page']-1;
  12. }
  13. $ile=5;
  14. $od=($page-1)*$ile;
  15. $connection = mysql_connect('localhost','xxxx','xxxx','xxxx');
  16. mysql_select_db ('xxxx');
  17.  
  18.  
  19. if(empty($tytul) && empty($autor)) {
  20. die("Formularz wypełniony niepoprawnie! Nie można wyświetlić wyników wyszukiwania!");
  21. }
  22.  
  23.  
  24. $zapytanie = mysql_query("SELECT * FROM `wynik` WHERE `tytul` LIKE '%$tytul%' AND `autor` LIKE '%$autor%' LIMIT ".$od.",".$ile."") or die(mysql_error());
  25.  
  26.  
  27. if(mysql_num_rows($zapytanie)==0){
  28. echo "Nie znaleziono wpisów.";
  29. }
  30.  
  31. while( $row = mysql_fetch_array($zapytanie) )
  32. {
  33.  
  34. echo '<div class="post">';
  35. echo '<div class="l"> <a href='.$row['link'].' title='.$row['lika'].'><img src='.$row['img'].' alt="" /></a> </div>';
  36. echo '<div class="r">';
  37. echo '<h2><a href='.$row['link'].' title='.$row['linka'].'>'.$row['tytul'].'</a></h2>';
  38. echo '<p>'.$row['opis'].'</p>';
  39. echo '</div>';
  40. echo '</div>';
  41.  
  42. }
  43.  
  44.  
  45. echo '<a href="search.php?page='.($page+2).'">następna</a>';
  46.  
  47.  
  48. mysql_close($connection);
  49. }
  50. ?>


Tak dałem, ale przechodząc do następnej strony to dalej wyników nie mam sad.gif

Pozdrawiam
Szeszek1992
Odpowiedź chyba jest prostsza, niż myślałem. Dane przesyłasz formularzem metodą POST, są więc one dostępne dla skryptu tylko na pierwszej stronie wyników(gdyż zmienna post nie zostanie ponownie przesłana, gdy naciśniesz na link). Dlatego też trzeba zacząć od przerobienia wszystkiego na GETa i dorzucić dołączanie tych zmiennych do linku.

PS. Thek wyraźnie napisał, żebyś użył albo mojej, albo jego metody do liczenia $od. Ty użyłeś obu.
Michał90
Tak to ma wyglądać?

  1. <?php
  2. if(isset($_GET['znajdz']))
  3. {
  4. $tytul = $_GET['tytul'];
  5. $autor = $_GET["autor"];
  6. $tytul = ucfirst(strtolower($tytul));
  7. $autor = ucfirst(strtolower($autor));
  8. if (empty($_GET['page']) || !is_numeric($_GET['page']) || $_GET['page'] < 0) {
  9. $page = 1;
  10. } else {
  11. $page = $_GET['page'];
  12. }
  13. $ile=5;
  14. $od=($page-1)*$ile;
  15. $connection = mysql_connect('localhost','xxxx','xxxx','xxxx');
  16. mysql_select_db ('xxxxx');
  17.  
  18.  
  19. if(empty($tytul) && empty($autor)) {
  20. die("Formularz wypełniony niepoprawnie! Nie można wyświetlić wyników wyszukiwania!");
  21. }
  22. $zapytanie = mysql_query("SELECT * FROM `wynik` WHERE `tytul` LIKE '%$tytul%' AND `autor` LIKE '%$autor%' LIMIT ".$od.",".$ile."") or die(mysql_error());
  23.  
  24. if(mysql_num_rows($zapytanie)==0){
  25. echo "Nie znaleziono wpisów.";
  26. }
  27.  
  28. while( $row = mysql_fetch_array($zapytanie) )
  29. {
  30.  
  31. echo '<div class="post">';
  32. echo '<div class="l"> <a href='.$row['link'].' title='.$row['linka'].'><img src='.$row['img'].' alt="" /></a> </div>';
  33. echo '<div class="r">';
  34. echo '<h2><a href='.$row['link'].' title='.$row['linka'].'>'.$row['tytul'].'</a></h2>';
  35. echo '</div>';
  36. echo '</div>';
  37.  
  38. }
  39. echo '<a href="search.php?tytul='.$tytul.'&page='.$page.'">następna</a>';
  40.  
  41.  
  42. mysql_close($connection);
  43. }
  44. ?>


A jak i gdzie "dorzucić dołączanie tych zmiennych do linku." ?

Pozdrawiam
Szeszek1992
  1. echo '<a href="search.php?page='.$page.'&tytul='.$tytul.'&autor='.$autor.'">następna</a>';

Nie zapomnij zmienić w formularzu method na GET. Nie wiem za co odpowiada zmienna znajdz, ale jesli nie przekazuje zadnej wartości, tylko służy do wydzielenia podstrony z szukajką, trzeba zrobić:
  1. echo '<a href="search.php?znajdz&page='.$page.'&tytul='.$tytul.'&autor='.$autor.'">następna</a>';
Michał90
znajdz tylko rak się pojawia w adresie jak coś wyszukuje

search.php?tytul=prawo&znajdz=

A jak zabezpieczyć, że np. jest 10 stron wyników, a na 11już nie ma ale mogę dawać dalej "nastepne" ?
Szeszek1992
Czyli rozwiązanie nr 2.winksmiley.jpg
Michał90
No działa już mi ta paginacja ;]


Jak zrobić taki ogranicznik?
"Inna sprawa, że głupotą jest tak robić bo nie masz ogranicznika i możesz nawet sobie od 3 strony mieć wyniki puste, ale możesz przechodzić sobie na kolejne do usranej śmierci bo link Następna nadal będzie się zwiększał. Musisz zrobić ograniczenie, które wyeliminuje dodawanie tego linku gdy osiągniesz ostatnie rekordy tabeli."

I jak wywalić te znajdz, żeby błąd nie wyskoczył?

te znajdź dotyczy się do tego formularza
  1. <form action="search.php" method="get" class="search">
  2. <input type="text" name="tytul" id="s" value="wpisz tytuł" />
  3. <button type="submit" name="znajdz">Szukaj</button>
  4. </form>
  5. <form action="search.php" method="get" class="search">
  6. <input type="text" name="autor" id="s" value="wpisz autora" />
  7. <button type="submit" name="znajdz">Szukaj</button>
  8. </form>
Szeszek1992
  1. $iloscwynikow = mysql_fetch_array(mysql_query("SELECT COUNT(*) as iloscwynikow FROM `wynik` WHERE `tytul` LIKE '%$tytul%' AND `autor` LIKE '%$autor%'"));//pobieramy ilość wyników
  2.  
  3. $liczba=$ile*$_GET['page']; //tyle wynikow mielismy na poprzednich stronach w założeniu, że strony wyników numerujesz od 1, a nie od 0
  4.  
  5. if($iloscwynikow['iloscwynikow']>$liczba)
  6. echo '<a href="search.php?znajdz&page='.$page.'&tytul='.$tytul.'&autor='.$autor.'">następna</a>';
  7.  
  8.  


Co do pytania 2. O jaki błąd Ci chodzi?
Michał90
Bo jak wywaliłem
  1. if(isset($znajdz))
  2. {
  3.  
  4. }


To był błąd można powiedzieć tongue.gif

"Formularz wypełniony niepoprawnie! Nie można wyświetlić wyników wyszukiwania!"

Bo chciałbym się pozbyć z adresu tego "znajdz" ale w ostateczności niech zostanie pozbędę sie go za pomocą mod rewrite biggrin.gif
Szeszek1992
Zamiast
  1. if(isset($_GET['znajdz']))
  2. {
  3. ..
  4. ..
  5. ..
  6. }

daj
  1. if(isset($_GET['tytul'] || isset($_GET['autor']))
  2. {
  3. ..
  4. ..
  5. ..
  6. }

i znajdz w adresie nie potrzebne;)
PS. Przydałoby się zabezpieczyć tą wyszukiwarkę przed SQL Injection. Poczytaj sobie o tym na forum.

Pozdrawiam,
Szeszek1992
Michał90
Gdy zamieniłem na to:
  1. if(isset($_GET['tytul'] || isset($_GET['autor']))


To mam błąd:
Parse error: syntax error, unexpected T_BOOLEAN_OR, expecting ',' or ')' in /home/...

Powinno być tak:
  1. if(isset($_GET['tytul']) || isset($_GET['autor']))


Dzięki
Pozdrawiam

Witam,
A jak zrobić, żeby zamiast "następna" wyświetlały się wyniki 1,2,3...itd.?

PS.
Przed tym atakiem SQl Injection wystarczy tak zmienić kod:
  1. $tytul = addslashes($_GET['tytul']);
  2. $autor = addslashes($_GET["autor"]);


+ zmiana adresu z search.php?tytul=P&autor=&page=1
na np.
szukaj.html/tytul/autor/strona-1/
Pozdrawiam
Szeszek1992
Troszkę własnej inwencji...
Nie dam Ci gotowca, napiszę jak zrobić.
1. Ilość stron z wynikami będzie równa ilości wyników / ilości wyników na stronie
(zaokrąglona do góry)
2. Używasz pętli while i jakiejś zmiennej liczącej ilość powtórzeń pętli(przed pętlą ma być równa 1, potem po napisaniu każdego z linków inkrementujesz tą zmienną). Pętla wykonuje się dopóki liczba stron jest większa lub równa od licznika powtórzeń.
3. Jeśli chcesz jakoś wyróżnić numer tej strony, na której jesteś, w pętli dajesz odpowiednią funkcję warunkową, która w wyniku wypisze albo normalny link, np. pogrubioną liczbę.

To tyle. W razie problemów pytaj.
Michał90
Czyli z tego kodu mogę skorzystać?

  1. $iloscwynikow = mysql_fetch_array(mysql_query("SELECT COUNT(*) as iloscwynikow FROM `wynik` WHERE `tytul` LIKE '%$tytul%' AND `autor` LIKE '%$autor%'"));//pobieramy ilość wyników
  2.  
  3. $liczba=$ile*$_GET['page']; //tyle wynikow mielismy na poprzednich stronach w założeniu, że strony wyników numerujesz od 1, a nie od 0
  4.  
  5. if($iloscwynikow['iloscwynikow']>$liczba)
  6. echo '<a href="search.php?znajdz&page='.$page.'&tytul='.$tytul.'&autor='.$autor.'">następna</a>';


oprócz 2 ostatnich linijek bo tam wstawie pętle while tak?


Szeszek1992
Tak, możesz skorzystać z tej części kodu.
Michał90
Robię to na pętli for ponieważ znalazłem przykład w necie biggrin.gif

  1. echo "Strony: ";
  2. $tak=mysql_fetch_row(mysql_db_query("SELECT count(*) FROM `wynik`"));
  3.  
  4. $liczba_stron = $tak / $ile;
  5. $liczba_stron = ceil($liczba_stron);
  6.  
  7. for ($v = 1; $v <= $liczba_stron; $v++) {
  8.  
  9. if ($liczba_stron == 1) {
  10. echo " $v";
  11. } else {
  12. echo '<a href="search.php?znajdz&page='.$page.'&tytul='.$tytul.'&autor='.$autor.'">'.$v.'</a>';
  13. }
  14. }


Ale mam błąd:
Strony:
Warning: Wrong parameter count for mysql_db_query() in /home/..../search.php on line 131

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /home/...../search.php on line 131

131 linia kodu to:
  1. $tak=mysql_fetch_row(mysql_db_query("SELECT count(*) FROM `wynik`"));
Szeszek1992
Użyj mysql_query lub zapoznaj się z manualem dotyczącym mysql_db_query oraz sprawdź, czy zapytanie jest w porządku
Michał90
Kurcze próbowałem ale nie wyświetla mi tych stron sad.gif

Szeszek1992
  1. echo "Strony: ";
  2. $tak=mysql_fetch_row(mysql_db_query("SELECT count(*) FROM `wynik`"));
  3.  
  4. $liczba_stron = $tak['count(*)'] / $ile;
  5. $liczba_stron = ceil($liczba_stron);
  6.  
  7. for ($v = 1; $v <= $liczba_stron; $v++) {
  8.  
  9. if ($liczba_stron == 1) {
  10. echo " $v";
  11. } else {
  12. echo '<a href="search.php?znajdz&page='.$page.'&tytul='.$tytul.'&autor='.$autor.'">'.$v.'</a>';
  13. }
  14. }
  15.  

a teraz?
Michał90
Dałem tak:
  1. echo "Strony: ";
  2. $tak=mysql_fetch_row(mysql_query("SELECT count(*) FROM `wynik`"));
  3.  
  4. $liczba_stron = $tak['count(*)'] / $ile;
  5. $liczba_stron = ceil($liczba_stron);
  6.  
  7. for ($v = 1; $v <= $liczba_stron; $v++) {
  8.  
  9. if ($liczba_stron == 1) {
  10. echo " $v";
  11. } else {
  12. echo '<a href="search.php?znajdz&page='.$page.'&tytul='.$tytul.'&autor='.$autor.'">'.$v.'</a>';
  13. }
  14. }


To tylko wyświetla napis "Strony:"
thek
Taaa... A przy 40 stronach zrobi linijkę z 40 linkami winksmiley.jpg Zrób tak...
1. Pobierz liczbę wszystkich rekordów i ustal ile ma się wyświetlać na stronie.
2. Oblicz ile stron Ci wyjdzie.
3. Gdy jesteś na stronie innej niż pierwsza dodaj link kierujący na stronę pierwszą i poprzednią.
4. W pętli przebiegnij przez rekordy od $strona-$ileś do $strona+$ileś.
4 a) jeśli strona w pętli jest mniejsza od pierwszej lub większa od maksymalnej ilości stron - nie wyświetlaj.
4 cool.gif jeśli strona w pętli jest zgodna z aktualną - oznacz ja jakoś specjalnie (może być dodatkowa klasa)
4 c) jeśli to jakaś inna to zrób link normalny
5. Jeśli jesteś na stronie innej niż ostatnia dodaj linki następna i ostatnia.

Ot i cała paginacja. Da się bez problemu z tego zgrabna funkcję, klasę czy helper zrobić. Jedyne co Ci potrzebne tak naprawdę to liczba stron i aktualna strona. Koniec algorytmu.
Szeszek1992
Podobnie napisałem mu na poprzedniej podstronie(nie wspomniałem o ograniczeniu ilości linków).

Michał, Zastanawia mnie, dlaczego zmieniłeś zapytanie do bazy.
Michał90
Dobra zrobiłem to tak jak miałem smile.gif

Tylko dodałem jeszcze odnośnik do poprzedniej strony i teraz mam:
następna strona i poprzednia strona i mogę wracać ;]

Dzięki

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