Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP][MySQL]paginacja nie działa
Michał90
post
Post #1





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 16.05.2007

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


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
Go to the top of the page
+Quote Post
Tokk
post
Post #2





Grupa: Zarejestrowani
Postów: 11
Pomógł: 6
Dołączył: 11.03.2009

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


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



Ten post edytował Tokk 22.01.2010, 20:19:35
Go to the top of the page
+Quote Post
Michał90
post
Post #3





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 16.05.2007

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


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
Go to the top of the page
+Quote Post
Szeszek1992
post
Post #4





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

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


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)

Ten post edytował Szeszek1992 22.01.2010, 20:44:11


--------------------
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.

Ten post edytował thek 22.01.2010, 21:00:35


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Szeszek1992
post
Post #6





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

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


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.


--------------------
Go to the top of the page
+Quote Post
Michał90
post
Post #7





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 16.05.2007

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


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
Go to the top of the page
+Quote Post
Szeszek1992
post
Post #8





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

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


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.

Ten post edytował Szeszek1992 22.01.2010, 21:34:31


--------------------
Go to the top of the page
+Quote Post
Michał90
post
Post #9





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 16.05.2007

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


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

Ten post edytował Michał90 22.01.2010, 22:28:08
Go to the top of the page
+Quote Post
Szeszek1992
post
Post #10





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

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


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


--------------------
Go to the top of the page
+Quote Post
Michał90
post
Post #11





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 16.05.2007

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


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" ?

Ten post edytował Michał90 22.01.2010, 22:38:43
Go to the top of the page
+Quote Post
Szeszek1992
post
Post #12





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

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


Czyli rozwiązanie nr 2.winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post
Michał90
post
Post #13





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 16.05.2007

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


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>


Ten post edytował Michał90 22.01.2010, 22:47:00
Go to the top of the page
+Quote Post
Szeszek1992
post
Post #14





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

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


  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?

Ten post edytował Szeszek1992 22.01.2010, 22:58:20


--------------------
Go to the top of the page
+Quote Post
Michał90
post
Post #15





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 16.05.2007

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


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

Ten post edytował Michał90 22.01.2010, 23:06:35
Go to the top of the page
+Quote Post
Szeszek1992
post
Post #16





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

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


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

Ten post edytował Szeszek1992 22.01.2010, 23:31:20


--------------------
Go to the top of the page
+Quote Post
Michał90
post
Post #17





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 16.05.2007

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


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

Ten post edytował Michał90 23.01.2010, 17:04:34
Go to the top of the page
+Quote Post
Szeszek1992
post
Post #18





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

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


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.


--------------------
Go to the top of the page
+Quote Post
Michał90
post
Post #19





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 16.05.2007

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


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?


Go to the top of the page
+Quote Post
Szeszek1992
post
Post #20





Grupa: Zarejestrowani
Postów: 117
Pomógł: 29
Dołączył: 20.05.2009

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


Tak, możesz skorzystać z tej części kodu.


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

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

 



RSS Aktualny czas: 22.08.2025 - 02:16