Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] wyszukiwarka, wyswietlanie wynikow kilka razy
senor_d
post
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 17.02.2005
Skąd: skad

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


witam

mam skrypt malej wyszukiwarki oparty na mysql'u. dopoki podaje sie do wyszukiwania jeden wyraz wszystko jest (powiedzmy) tak jak chce. ale juz przy kilku wyrazach wyniki kaszanią sie, sa powtorzone kilkukrotnie. nie wiem jak to dokladnie wytlumaczyc wiec tutaj jest link. a to jest kod:

  1. <?php
  2.  
  3. $fraza = $_GET[p];
  4.  
  5.  
  6. $przycieta = trim($fraza);
  7. $tablica = explode(' ',$przycieta);
  8.  
  9.  
  10.  
  11.  
  12. if (isset($p) && $fraza == '') {
  13. $message = "Musisz podać wyszukiwany wyraz!";
  14. }
  15.  
  16. if (!isset($p)) {
  17. $message = "Brak prametru do wyszukania!";
  18. }
  19.  
  20.  
  21. foreach ($tablica as $ciete){
  22.  
  23. $ilosc_wynikow = mysql_num_rows(sql("select * from ksiega where wpis like \"%$ciete%\" order by id desc"));
  24.  
  25. if (empty($limit)) {
  26. $limit = 0;
  27. }
  28.  
  29.  
  30. $wynik = sql("select * from ksiega where wpis like \"%$ciete%\" order by id desc");
  31.  
  32. do{
  33. $id_array[] = $dane[id];
  34. } while ($dane = mysql_fetch_array($wynik));
  35.  
  36.  
  37. }
  38.  
  39.  
  40. if($ilosc_wynikow == 0 && !isset($message)){
  41. $message = "Nie znaleziono wyniku pasującego do szukanej frazy " . $przyciete;
  42. }
  43.  
  44. $czasowa_tab = array_unique($id_array);
  45. $i=0;
  46. foreach ($czasowa_tab as $n) {
  47. $nowa_tab[$i] = $n; 
  48. $i++;
  49. }
  50.  
  51. if(isset($message)){
  52. print $message;
  53. exit();
  54. } else {
  55. print "&nbsp;&nbsp;Wyniki wyszukiwania dla: <span style=\"font-weight:bold\">&sbquo;&sbquo;" . $fraza . "&rsquo;&rsquo;</span><br /><br />";
  56. }
  57.  
  58.  
  59.  
  60. $nr == 1;
  61. foreach($nowa_tab as $id){
  62.  
  63. $dane_found = mysql_fetch_array(sql("select * from ksiega where id = '$id'"));
  64. $head = $dane_found[wpis];
  65. $head_rev = strrev($dane_found[wpis]);
  66.  
  67.  
  68. foreach($tablica as $ciete){
  69.  
  70. $ciete_rev = strrev($ciete);
  71.  
  72.  
  73. if (substr_count($head,$ciete) >= 2) {
  74.  
  75. $sub_rev = strrev(substr($head,strpos($head,$ciete),strlen($head)));
  76. $poczatek = substr($head,0,strpos($head,$ciete));
  77. $srodek = strrev(substr($sub_rev,strpos($sub_rev,$ciete_rev),strlen($sub_rev)));
  78. $koniec = strrev(substr($sub_rev,0,strpos($sub_rev,$ciete_rev)));
  79.  
  80. if (strlen($poczatek) >= 50) {
  81. $poczatek = substr($poczatek,strlen($poczatek) - 50,strlen($poczatek));
  82. $poczatek = substr($poczatek,strpos($poczatek,' '),strlen($poczatek));
  83. }
  84.  
  85. if (strlen($koniec) >= 50) {
  86. $koniec = substr($koniec,0,50);
  87. $koniec = substr($koniec,0,strrpos($koniec,' '));
  88. }
  89.  
  90.  
  91. $text = $poczatek . $srodek . $koniec;
  92.  
  93.  
  94.  
  95. } else if (substr_count($head,$ciete) == 1) {
  96.  
  97. $przed = substr($head,0,strpos($head,$ciete));
  98. $po = strrev(substr($head_rev,0,strpos($head_rev,$ciete_rev)));
  99.  
  100. if (strlen($przed) >= 100) {
  101. $przed = substr($head,strpos($head,$ciete) - 100,100);
  102. $przed = substr($przed,strpos($przed,' '),strlen($przed));
  103. }
  104.  
  105. if (strlen($po) >= 100) {
  106. $po = substr($head_rev,strpos($head_rev,$ciete_rev) - 100,100);
  107. $po = strrev(substr($po,strpos($po,' '),strlen($po)));
  108. }
  109.  
  110. $text = $przed . $ciete . $po;
  111.  
  112. }
  113.  
  114. $text= preg_replace("'($ciete)'si", "<span style=\"font-weight:bold; color:#0000FF\">\\1</span>",$text);
  115.  
  116.  
  117.  
  118. ?>
  119. <table cellspacing="0" cellpadding="0">
  120. <tr>
  121. <td style="width:15px; text-align:left; vertical-align:top">
  122. <?php print $dane_found[id]; ?>.
  123. </td>
  124. <td style="width:375px; text-align:left; vertical-align:top">
  125. <div style="width:375px">
  126. <a class="search" href="<?php $nr; ?>">...<?php print $text; ?>...</a>
  127. </div>
  128. </td>
  129. </tr>
  130. <tr>
  131. <td style="height:10px"></td>
  132. </tr>
  133. </table>
  134. <?php
  135.  
  136. }
  137. $nr++;
  138. }
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146. ?>


wie moze ktos jak temu zaradzic? bardzo bylbym wdzieczny. dzieki
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
barney
post
Post #2





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.03.2006

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


Witam,

Cytat
ale juz przy kilku wyrazach wyniki kaszanią sie, sa powtorzone kilkukrotnie

dlatego tak sie dzieje bo w pętli dla każdego szukanego wyrazu wysyłasz zapytanie SQL-owe. Czyli jak mamy np. w bazie zdanie:
"Ala ma kota"
to jak szukasz: "ala i ma" to do bazy idą 2 zapytania:
Kod
select * from ksiega where wpis like \"%ala%\" order by id desc

i
Kod
select * from ksiega where wpis like \"%ma%\" order by id desc

Poprawnym zapytaniem było by:
Kod
select * from ksiega where wpis like \"%ala%\"  or wpis like \"%ma%\"  GROUP BY id  order by id desc

Czyli
  1. <?php
  2.  
  3. $where = '';
  4. foreach ($tablica as $ciete){
  5.  
  6. $where .= "wpis LIKE '%$ciete% OR "; 
  7.  
  8. }
  9. $where .= ' 1 ';
  10.  
  11. $ilosc_wynikow = mysql_num_rows(sql("select * from ksiega where $where group by id "));
  12.  
  13. if (empty($limit)) {
  14. $limit = 0;
  15. }
  16.  
  17.  
  18. $wynik = sql("select * from ksiega where $where group by id order by id desc");
  19.  
  20. do{
  21. $id_array[] = $dane[id];
  22. } while ($dane = mysql_fetch_array($wynik));
  23.  
  24. ?>

A tak wogóle to może warto było by zastowsować pola z kluczami "FULLTEXT"
http://dev.mysql.com/doc/refman/4.1/en/fulltext-search.html

Pozdrawiam

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

Posty w temacie


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: 9.10.2025 - 00:04