Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Stronicowanie wyników wyszukiwania
Forum PHP.pl > Forum > Przedszkole
Kshyhoo
Do tej pory wyświetlałem dane bez problemów, teraz jednak wymyśliłem sobie wyszukiwarkę i mam problemy ze stronicowaniem wyników. Pobierałem wyniki tak:
  1. SELECT * FROM tutoriale LIMIT $start, $na_strone

W wyszukiwarce, jeżeli ustalę np. 10 wyników na stronę, to kolejne strony są puste, mimo, że jest więcej wyników wyszukiwania. Są jakieś sposoby, żeby "pamiętać" dane do wyszukiwania w sposób efektywny? Moje zapytanie:
  1. SELECT * FROM tutoriale WHERE $gdzie LIKE '%$fraza%' LIMIT $start, $na_strone

Strony zapamiętuję w sesji.
thek
Może czas na sesje? winksmiley.jpg Dane z wyszukiwarki też do sesji i po problemie.
Kshyhoo
Całe wyniki? Nie łapię ;p
bl4ck_b0x
Nie całe wyniki winksmiley.jpg Żebyś przechowywał w sesji którą "porcję" danych bierzesz winksmiley.jpg
Kshyhoo
Hmm, strony mam tak:
  1. if (!empty($_GET['s'])) {
  2. $s = ($_GET["s"]>1)?number_format($_GET["s"], 0, "", ""):1;
  3. $_SESSION["s"] = $_GET["s"];
  4. } else {
  5. $s = ($_SESSION["s"]>1)?number_format($_SESSION["s"], 0, "", ""):1;
  6. }

Pilsener
Po co sesje do tego? Rozwiązania są dwa:
1. Jeżeli zależy Ci na historii wyszukiwania, statystykach itp. to i tak to wrzucasz do bazy, co nie? Potem wystarczy dodać do porcjowania id, pod którym będą zapisane szukane kryteria, np. index.php?szukaj=4844&a=2 - strona druga. Rozwiązanie to ma także tą zaletę, że można zapamiętać w linkach wyniki wyszukiwania dla danych kryteriów. W bazie możesz przechowywać np. 10k ostatnich wyszukiwań.
2. Zapamiętać kryteria w ciachu, ja używam ciacha do poprawienia funkcjonalności, np. zapamiętywania numerów stron (gdy user kliknie powrót to jest tam, gdzie był a nie znowu na głównej), tutaj też się idealnie nada, bo jak ktoś ma wyłączone cookies to najwyżej nie zobaczy pozostałych stron wyszukiwania, przed czym łatwo się zabezpieczyć wysyłając mu komunikat.
nospor
Tutaj o tym pisałem
http://nospor.pl/formularz-i-stronicowanie...-stanu-n26.html
Kshyhoo
No właśnie... Problem w tym, że nie bardzo wiem, jak się do tego zabrać. Link mam taki:
index.php?page=szukaj&opcja=tytul&fraza=trąbka
ale w następnych stronach:
index.php?page=szukaj&s=2
Kiedyś Twój artykuł czytałem, ale zrobię to ponownie, może coś "zjarzę" ;p

EDIT:
Jeżeli mój formularz wyglądał tak:
  1. <form method='get' action='index.php?go=szukaj'>
  2. <input type='hidden' name='go' value='szukaj' class=''>
  3. Autor: <input type='radio' name='opcja' value='autor' />
  4. Tytuł: <input type='radio' name='opcja' value='tytul' checked='checked' />
  5. Treść: <input type='radio' name='opcja' value='tresc' />
  6. <input type='text' size='40' name='fraza' class='edit'>
  7. <input type='submit' value='' class='search'>
  8. </form>

To teraz, jak rozumiem, powinien wyglądać tak: questionmark.gif
  1. <?php
  2. $formData = array(
  3. 'autor' => !isset($_GET['autor']) ? null : $_GET['autor'],
  4. 'tytul' => !isset($_GET['tytul']) ? null : $_GET['tytul'],
  5. 'tresc' => !isset($_GET['tresc']) ? null : $_GET['tresc'],
  6. 'fraza' => !isset($_GET['fraza']) ? null : $_GET['fraza'],
  7. );
  8. ?>
  9. <form method="get" action="cpax.php?go=szukaj">
  10. <input type="hidden" name="go" value="szukaj" class="">
  11. Autor: <input type="radio" name="opcja" value="<?php echo $formData["autor"];?>" />&nbsp;&nbsp;&nbsp;
  12. Tytuł: <input type="radio" name="opcja" value="<?php echo $formData["tytul"];?>" checked="checked" />&nbsp;&nbsp;&nbsp;
  13. Treść: <input type="radio" name="opcja" value="<?php echo $formData["tresc"];?>" />&nbsp;&nbsp;&nbsp;
  14. <input type="text" size="40" name="fraza" class="edit" value="<?php echo $formData["fraza"];?>">
  15. <input type="submit" value="" class="search">
  16. </form></font>

Jak przechwycić to z radio?
thek
Najprostsza wersja to "weź i zapamiętaj w sesji co masz pod tytul i fraza" smile.gif Te dane potem z sesji przekaż do zapytania ze zmienionym już page pobranym z GET winksmiley.jpg Możliwości jest wiele. Ja choćby zmienne z sesji w ten sposób przerobiłem do formy, która tworzy wyszukiwarkę SEO-friendly linków, a z kolei znajomy zrobił cały serwis jako niejawne wywołanie wyszukiwarki. Po prostu linki w całym serwisie to tak naprawdę front na silnik wyszukiwawczy. Link z kategorii czy czegokolwiek to po prostu rozbicie na parę klucz => wartość, co po stronie silnika ładnie tworzy odpowiednie zapytania do bazy.
Kshyhoo
No dobra, w sesji. Zrobiłem tak, jak w przykładzie nospora, i nie przesyła mi do sesji.
nospor
Cytat
Zrobiłem tak, jak w przykładzie nospora, i nie przesyła mi do sesji.
No popatrz, a mi przesyła smile.gif
Sorki, ale juz nie raz slyszalem: zrobilem tak jak on, ale mi nie dziala.... A po pokazaniu kodu okazalo się, ze jednak nie zrobił dokładnie tak jak on winksmiley.jpg

pokaz kod
Kshyhoo
Wydaje mi się, że $_POST['oursubmit'] jest pusta winksmiley.jpg, bo:
Cytat
POST: Array
(
[go] => szukaj
[opcja] =>
[fraza] => aaa
[oursubmit] =>
)

Cały kod:
  1. <?php
  2. if (!empty($_POST['oursubmit'])) {
  3. $_SESSION['form'] = array(
  4. 'autor' => $_POST['autor'],
  5. 'tytul' => $_POST['tytul'],
  6. 'tresc' => $_POST['tresc'],
  7. 'fraza' => $_POST['fraza'],
  8. );
  9. }
  10. $formData = array(
  11. 'autor' => !isset($_SESSION['form']) ? null : $_SESSION['form']['autor'],
  12. 'tytul' => !isset($_SESSION['form']) ? null : $_SESSION['form']['tytul'],
  13. 'tresc' => !isset($_SESSION['form']) ? null : $_SESSION['form']['tresc'],
  14. 'fraza' => !isset($_SESSION['form']) ? null : $_SESSION['form']['fraza'],
  15. ); echo $_POST['oursubmit'];
  16. ?>
  17. <div class="kontener"><font class="nag1">
  18. <form method="post" action="cpax.php?go=szukaj" name="formData">
  19. <input type="hidden" name="go" value="szukaj" class="">
  20. Autor: <input type="radio" name="opcja" value="<?php echo $formData["autor"];?>" />   
  21. Tytuł: <input type="radio" name="opcja" value="<?php echo $formData["tytul"];?>" checked="checked" />   
  22. Treść: <input type="radio" name="opcja" value="<?php echo $formData["tresc"];?>" />   
  23. <input type="text" size="40" name="fraza" class="edit" value="<?php echo $formData["fraza"];?>">
  24. <input type="submit" value="" class="search" name="oursubmit">
  25. </form></font></div>

Nie wiem też, czy tak mogę "zapodać" z radio?
nospor
no bo dla submita nie nadałeś wartosci: value=""
Skoro tak sie bronisz z tą wartością to zamiast:
if (!empty($_POST['oursubmit']))
daj:
if (isset($_POST['oursubmit']))

Widzisz, nie zrobiłeś dokładnie tak samo jak ja tongue.gif
Kshyhoo
A no tak. To dlatego, że mam graficzny przycisk i napis wyłazi winksmiley.jpg No teraz:

Cytat
POST: Array
(
[go] => szukaj
[opcja] =>
[fraza] => aa
[oursubmit] =>
)
SESSION: Array
(
[form] => Array
(
[autor] =>
[tytul] =>
[tresc] =>
[fraza] => aa
)
)
nospor
no ale do sesji zapisujesz z forma rzeczy, ktorych w formie nie ma, takie jak: autor, tresc, tytul.
Ty nie wymagasz za duzo od kodu co napisalem? Myslisz ze sam z siebie dorzuci ci pozostałe pola? winksmiley.jpg

ps: aa, widze ty to probujesz w dziki sposob w radio przekazac
poczytaj najpierw jak zachowuje się pole RADIO bo widzę nie rozumiesz tego.
Kshyhoo
Hmm, wciąż mam [oursubmit] => puste, nie wiem, dlaczego.
nospor
no bo dla oursubmit nie przekazałeś wartosci. dlatego kazałem ci zamienic warunek na isset()
Kshyhoo
Zmieniłem, Wodzu:
  1. if (isset($_POST['oursubmit'])) {
  2. $_SESSION['form'] = array(
  3. 'fraza' => $_POST['fraza'],
  4. 'opcja' => $_POST['opcja'],
  5. );
  6. }
nospor
No i super. Jeszcze jakis problem? Jak tak to od razu pisz a nie zmuszasz nas do dopytywania ciebie.
A jak już nie ma problemu to też napisz: dziękuję smile.gif
Kshyhoo
Ale ja zmieniłem wcześniej i dalej mam pusto ;( Googluję na ten nieszczęsny radio... Teraz mam tak:
  1. <?php
  2. if (isset($_POST['oursubmit'])) {
  3. $_SESSION['form'] = array(
  4. 'fraza' => $_POST['fraza'],
  5. 'opcja' => $_POST['opcja'],
  6. );
  7. }
  8. $formData = array(
  9. 'fraza' => !isset($_SESSION['form']) ? null : $_SESSION['form']['fraza'],
  10. 'opcja' => !isset($_SESSION['form']) ? null : $_SESSION['form']['opcja'],
  11. );
  12. ?>
  13. <div class="kontener"><font class="nag1">
  14. <form method="post" action="cpax.php?go=szukaj" name="formData">
  15. <input type="hidden" name="go" value="szukaj" class="">
  16. Autor: <input type="radio" name="<?php echo $formData["opcja"];?>" value="autor" />&nbsp;&nbsp;&nbsp;
  17. Tytuł: <input type="radio" name="<?php echo $formData["opcja"];?>" value="tytul" checked="checked" />&nbsp;&nbsp;&nbsp;
  18. Treść: <input type="radio" name="<?php echo $formData["opcja"];?>" value="tresc" />&nbsp;&nbsp;&nbsp;
  19. <input type="text" size="40" name="fraza" class="edit" value="<?php echo $formData["fraza"];?>">
  20. <input type="submit" value="" class="search" name="oursubmit">
  21. </form></font></div>

i nadal pusto ;(
nospor
No bo radio to nie input text i zachowuje się zupelnie inaczej...
  1. <?php
  2. if (!empty($_POST['oursubmit'])) {
  3. $_SESSION['form'] = array(
  4. 'opcja' => $_POST['opcja'],
  5. 'fraza' => $_POST['fraza'],
  6. );
  7. }
  8. $formData = array(
  9. 'opcja' => !isset($_SESSION['form']) ? null : $_SESSION['form']['opcja'],
  10. 'fraza' => !isset($_SESSION['form']) ? null : $_SESSION['form']['fraza'],
  11. );
  12. ?>
  13. <div class="kontener"><font class="nag1">
  14. <form method="post" action="cpax.php?go=szukaj" name="formData">
  15. <input type="hidden" name="go" value="szukaj" class="">
  16. Autor: <input type="radio" name="opcja" value="0" <?php if (empty($formData['opcja'])) echo 'checked="checked"';?> />
  17. Tytuł: <input type="radio" name="opcja" value="1" <?php if ($formData['opcja'] == 1) echo 'checked="checked"';?> />
  18. Treść: <input type="radio" name="opcja" value="2" <?php if ($formData['opcja'] == 2) echo 'checked="checked"';?> />
  19. <input type="text" size="40" name="fraza" class="edit" value="<?php echo $formData["fraza"];?>">
  20. <input type="submit" value="" class="search" name="oursubmit">
  21. </form></font></div>
Kshyhoo
Test wykazał:
Cytat
POST: Array
(
[go] => szukaj
[opcja] => 1
[fraza] => aaa
[oursubmit] =>
SESSION: Array
(
[form] => Array
(
[fraza] => aaa
[opcja] =>
)
)

I wyniki puste...
nospor
no bo bez namyslu skopiowales...
Z rozpedu zostawilem stary kod
nie: if (!empty($_POST['oursubmit'])) {
a: if (isset($_POST['oursubmit'])) {

Mysl trochę nad kodem co dostajesz smile.gif
Kshyhoo
Nadal pusto:
Cytat
POST: Array
(
[go] => szukaj
[opcja] => 1
[fraza] => bbb
[oursubmit] =>
)
SESSION: Array
(
[form] => Array
(
[opcja] => 1
[fraza] => bbb
)
)
nospor
no jak pusto? Juz w sesji masz to co masz miec.
Kshyhoo
No mam to, co wkleiłem... Yyyyy, no tak, nie mam w bazie 0, 1, 2, tylko autor, tytul i tresc winksmiley.jpg
nospor
Cytat
Yyyyy, no tak, nie mam w bazie 0, 1, 2, tylko autor, tytul i tresc
No ale chyba juz sam wiesz jak to poprawic?
Kshyhoo
Nie bardzo. Wiem, jak zmienić wartości:
  1. $gdzie = array("0" => "autor", "1" => "tytul", "2" => "tresc");

Ale potem... sciana.gif

Kurde, chyba znalazłem:
  1. $opcje = array("0" => "autor", "1" => "tytul", "2" => "tresc");
  2. $gdzie = current($opcje);

current

Chyba nie! Pobiera pierwszą wartość tablicy.
thek
A sprawdzałeś chociaż co uzyskasz poprzez wywołanie $gdzie[0], $gdzie[1]? Nie rób z siebie głupszego niż jesteś winksmiley.jpg

EDIT: Current pobiera wartość tablicy ustawioną pod aktualnym wskaźnikiem tablicy. Niekoniecznie pierwszym...
Kshyhoo
Cytat(thek @ 20.01.2010, 15:28:10 ) *
Nie rób z siebie głupszego niż jesteś winksmiley.jpg

Jeżeli chciałeś mnie obrazić, to dobrze trafiłeś. To, że jestem raczkujący w php nie oznacza, że nie umiem sprawdzić co dostaje z tablicy...
nospor
  1. $jakisindex = 1;
  2. $opcje = array("0" => "autor", "1" => "tytul", "2" => "tresc");
  3. $gdzie = $opcje[$jakisindex];


Cytat
Jeżeli chciałeś mnie obrazić, to dobrze trafiłeś.
Widac nie zalapales grypsu theka. Przeczytaj jego tekst jeszcze raz na spokoknie.

Swoją drogą naprawdę mógłbyś patrzeć co piszesz a nie strzelasz po omacku. Nie dziw się, ze ludzie zaczynają powoli żartować sobie.
Kshyhoo
No tak, niby wszystko ok, a wyniki wyszukiwania puste...
nospor
Czy ja za kazdym razem muszę pisac:
"pokaż kod"
?
Kshyhoo
Sorry Winetu, kod całej szukajki:
  1. <?php
  2. if (isset($_POST['oursubmit'])) {
  3. $_SESSION['form'] = array(
  4. 'opcja' => $_POST['opcja'],
  5. 'fraza' => $_POST['fraza'],
  6. );
  7. }
  8. $formData = array(
  9. 'opcja' => !isset($_SESSION['form']) ? null : $_SESSION['form']['opcja'],
  10. 'fraza' => !isset($_SESSION['form']) ? null : $_SESSION['form']['fraza'],
  11. );
  12. ?>
  13. <div class="kontener"><font class="nag1">
  14. <form method="post" action="cpax.php?go=szukaj" name="formData">
  15. <input type="hidden" name="go" value="szukaj" class="">
  16. Autor: <input type="radio" name="opcja" value="0" <?php if (empty($formData['opcja'])) echo 'checked="checked"';?> />&nbsp;&nbsp;&nbsp;
  17. Tytuł: <input type="radio" name="opcja" value="1" <?php if ($formData['opcja'] == 1) echo 'checked="checked"';?> />&nbsp;&nbsp;&nbsp;
  18. Treść: <input type="radio" name="opcja" value="2" <?php if ($formData['opcja'] == 2) echo 'checked="checked"';?> />&nbsp;&nbsp;&nbsp;
  19. <input type="text" size="40" name="fraza" class="edit" value="<?php echo $formData["fraza"];?>">
  20. <input type="submit" value="" class="search" name="oursubmit">
  21. </form></font></div>
  22. <?php
  23. $jakisindex = $_SESSION['form']['opcja'];
  24. $opcje = array("0" => "autor", "1" => "tytul", "2" => "tresc");
  25. $gdzie = $opcje[$jakisindex];
  26.  
  27. echo $gdzie; echo ' '; echo $_SESSION['form']['fraza'];
  28. ///////////////////////// DANE DO STRONICOWANIA /////////////////////////
  29. if (isset($_SESSION['form']['fraza'])) {
  30.  
  31. function pasek($rekordow,$na_strone,$na_pasku,$skryptszu,$s) {
  32. $stron = ceil($rekordow/$na_strone);
  33. if ($s<1) $s=1;
  34. if ($s>$stron) $s=$stron;
  35. $koniec = $s+$na_pasku;
  36. if ($s<=$na_pasku) $koniec = $na_pasku*2+1;
  37. if ($koniec>$stron) $koniec = $stron;
  38. $start = $koniec-$na_pasku*2;
  39. if ($start<1) $start=1;
  40. if ($s>1) $p = "<a href='$skryptszu".($s-1)."'><img style='height: 21px; width: 57px;' alt='w lewo' border='0' cursor: pointer; src='./gfx/pla.png'></a>";
  41. else $p = "<img style='height: 21px; width: 57px;' alt='w lewo' border='0' cursor: pointer; src='./gfx/pln.png'>";
  42. if ($s<$stron) $n = "<a href='$skryptszu".($s+1)."'><img style='height: 21px; width: 57px;' alt='' border='0' cursor: pointer; src='./gfx/ppa.png'></a>";
  43. else $n = "<img style='height: 21px; width: 57px;' alt='w prawo' border='0' cursor: pointer; src='./gfx/ppn.png'>";
  44. for ($i=$start; $i<=$koniec; $i++) {
  45. if ($i==$s) $l .= "&nbsp;<span style='color:#cc0000;'><b>$i</b></span>&nbsp;";
  46. else $l .= "&nbsp;<a href='$skryptszu$i'>$i</a>&nbsp;";
  47. }
  48. if ($rekordow<1) $wynik = "<font class='en'>Brak informacji spełniających kryteria wyszukiwania...</font>";
  49. else $wynik = "<font class='en'>znalezionych: $rekordow <br /> strona <b>$s</b> z $stron<br />"; //znalezionych: $rekordow,
  50. if ($stron>1) $wynik .= "<font class='en'>$p&nbsp; - $l - &nbsp;$n</font>";
  51. return $wynik;
  52. }
  53.  
  54. if (!empty($_GET['s'])) {
  55. $s = ($_GET["s"]>1)?number_format($_GET["s"], 0, "", ""):1;
  56. $_SESSION["s"] = $_GET["s"];
  57. } else {
  58. $s = ($_SESSION["s"]>1)?number_format($_SESSION["s"], 0, "", ""):1;
  59. }
  60. /////////////////////////
  61.  
  62. $start = ($s-1)*$na_strone;
  63. $wynik = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM tutoriale WHERE $gdzie LIKE '%$fraza%' LIMIT $start, $na_strone");
  64. $rekordow = mysql_result(mysql_query("SELECT FOUND_ROWS()"),0);
  65. // ponownie szuka, gdy ktos celowo wpisze "s" większe od ilości stron:
  66. $stron = ceil($rekordow/$na_strone);
  67. if ($s>$stron and $rekordow>0) {
  68. $start = ($stron-1)*$na_strone;
  69. $wynik = mysql_query("SELECT * FROM tutoriale WHERE $gdzie LIKE '%$fraza%' LIMIT $start, $na_strone");
  70. }
  71.  
  72. /////////////////////////
  73. echo "<div class='stron'>";
  74. echo "<font class='en'>";
  75. echo pasek($rekordow,$na_strone,$na_pasku,$skryptszu,$s);
  76. echo "</font>\n";
  77. echo "</div>"; // stron
  78. /////////////////////////
  79. if ($wynik and mysql_num_rows($wynik)>1) {
  80. echo "<div class='tabele'>
  81. <table class='t_table'>
  82. <tr>
  83. <td class='t_th' width='75px'>Obraz</td>
  84. <td class='t_th'>Tytuł tutoriala</td>
  85. <td class='t_th' width='100px'>Kategoria</td>
  86. </tr>";
  87.  
  88. while ($wynik and $dane = mysql_fetch_array($wynik)) {
  89. $bgl = ($kl++%2 == 0)?"t_tdjl":"t_tdcl";
  90. $bgc = ($kc++%2 == 0)?"t_tdjc":"t_tdcc";
  91. echo "</tr>
  92. <tr>
  93. <td class='$bgc'><img src='".$dane['obraz']."' alt='obraz' width='70' height='70' /></td>
  94. <td class='$bgl'><b>Tytuł: </b> <a href='cpax.php?go=pokaz&id=".$dane['id']."'class='key'>".$dane['tytul']."</a><br />
  95. <b>Autor: </b> ".$dane['autor']."<br />
  96. <b>Data: </b> ".$dane['data']."<br />
  97. <b>Notatki: </b> ".$dane['notatki']."<br />
  98. <b>Dodał: </b> ".$dane['moderator']."</td>
  99. <td class='$bgc'><a href='cpax.php?go=tutoriale&k=2&c=".$dane['kat_id']."'class='key'>".$dane['kat']."</a></td>
  100. </tr>";
  101. } //zap
  102. echo "</table>
  103. <div class='stron'><font class='en'>";
  104. echo pasek($rekordow,$na_strone,$na_pasku,$skryptszu,$s);
  105. }// wynik>1
  106. echo "</font></div>"; // stron</div>";
  107. } //
  108. ?>


EDIT: Niby wszystko ok, ale wyszukiwanie nie działa poprawnie...
nospor
w zapytaniu korzystasz ze zmiennej $fraza, ale nigdzie wczesniej do tej zmiennej nic nie przypisujesz smile.gif
Kshyhoo
Masz rację (jak zawsze). Jakimś cudem skrypt pobiera sobie frazę z $_SESSION['form']['fraza'];. Skrypt zachowuje się dziwnie, po wpisaniu frazy "Adam" w tytuł, nie znajduje jej, chociaż taka fraza istnieje. Po zmianie opcji na treść, znajduje frazę - po wybraniu opcji tytuł, już znajduje frazę "Adam".
Jak wykonać przycisk "Nowe szukanie", który czyści opcje szukania? Zerować sesję?
nospor
tak, po wcisnieciu "nowe szukanie " masz zrobic:
  1. unset($_SESSION['form']);
Kshyhoo
A można to zrobić na zasadzie:
  1. <button type="reset" onclick="<?php unset($_SESSION['form']);?>"> Nowe szukanie </button>

questionmark.gif
nospor
nie
Kshyhoo
Generalnie, to już w miarę chodzi. Wyszukuje i stronicuje dobrze. nie wiem tylko, jak miałbym zrobić usuwanie z sesji numeru strony, w przypadku nowego szukania. Formularz mam wyświetlony cały czas.
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.