Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] wyszukiwarka
Forum PHP.pl > Forum > PHP
senor_d
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
barney
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
Spirit86
mnie zawsze, jak chcę stowrzyć FULLTEXT baza zwraca:

Kod
#1214 - The used table type doesn't support FULLTEXT indexes
senor_d
dzieki barney. czytalem juz o tym tylko ze myslalem ze moze bede mogl skonczyc wyszukiwarke nie kozystajac z FULLTEXT poniewaz mozna z niego kozystac tylko w przypadku pol TEXT, CHAR i VARCHAR a one maja ograniczenie do 255 znakow. i tu do ciebie spirit:

Cytat
Full-text indexes can be used only with MyISAM tables, and can be created only for CHAR, VARCHAR, or TEXT columns.

widocznie chcesz zastosowac FULLTEXT do nieobslugiwanego typu pola.

barney jesli istnieje sposob ominiecia tego i znasz go to bylbym wdzieczny za info bo nawet z twoimi poprawkami nie dziala to tak jakbym chcial.
Spirit86
Ech, mój bład, nie właczyłem MyISAM . Myślałem, że jest to domyślne smile.gif.

Nie rozumiem czegoś:

  1. TEXT, CHAR i VARCHAR a one maja ograniczenie do 255 znakow.


przecież text nie ma ograniczenia do 255 znaków. Czego tyczy się to 255 znaków, łańcucha, jakiego możemy szukać?
barney
Witam,
Cytat
barney jesli istnieje sposob ominiecia tego i znasz go to bylbym wdzieczny za info bo nawet z twoimi poprawkami nie dziala to tak jakbym chcial.
A co jest nie tak questionmark.gif W sumie to może być kwestia łączenia szukanych wyrazów czy robić to AND-em (wtedy wszystkie muszą wystąpić) czy OR-em (tak jak ja zrobiłem, czyli wystarczy że wystąpi jeden)

Pozdrawiam
senor_d
no musze wlasnie jakos polaczyc AND i OR. i z tym FULLTEXT tez musze sie pobawic. w kazdym razie dzieki wielkie thumbsupsmileyanim.gif
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.