Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]/[mysql]wyszukiwarka
Forum PHP.pl > Forum > PHP
Lejto
Mam taką tabele
  1. CREATE TABLE IF NOT EXISTS `linki_dane` (
  2. `tytul` text collate utf8_polish_ci NOT NULL,
  3. `dodal` text collate utf8_polish_ci NOT NULL,
  4. `opis` text collate utf8_polish_ci NOT NULL,
  5. `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  6. `okladka` text collate utf8_polish_ci NOT NULL,
  7. `rozszerzenie` text collate utf8_polish_ci NOT NULL,
  8. `id` int(11) NOT NULL AUTO_INCREMENT,
  9. `tagi` text collate utf8_polish_ci NOT NULL,
  10. `czas` int(11) NOT NULL,
  11. PRIMARY KEY (`id`)
  12. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=17 ;


chce w niej wyszukiwać rekordy po opisie i tytule

mam taki kod
  1. $words = array();
  2. if(isset($_GET['query']) && trim($_GET['query']))
  3. {
  4. function explode_items($text, $separator = "\n", $preserve = true)
  5. {
  6. $items = array();
  7. foreach(explode($separator,$text) as $value)
  8. {
  9. $tmp = trim($value);
  10. if($preserve)
  11. {
  12. $items[] = $tmp;
  13. }
  14. else
  15. {
  16. if(!empty($tmp))
  17. {
  18. $items[$tmp] = true;
  19. }
  20. }
  21. }
  22. if($preserve)
  23. {
  24. return $items;
  25. }
  26. else
  27. {
  28. return array_keys($items);
  29. }
  30. }
  31.  
  32. $words = explode_items($_GET['query'], ' ', false);
  33.  
  34. if(count($words))
  35. {
  36. // sformu3owanie zapytania przeszukuj?cego indeks
  37. // z uwzglednieniem wpisanych s3w i wykonanie zapytania
  38. $join = '';
  39. $where = '';
  40. $query = 'SELECT DISTINCT D.opis, D.tytul FROM linki_dane D ';
  41. foreach ($words as $index => $word)
  42. {
  43. $join .= sprintf(
  44. 'JOIN linki_dane I%d ON D.tytul = I%d.tytul',
  45. $index, $index, $index, $index, $index);
  46.  
  47. $where .= sprintf('T%d.tytul = "%s" AND ', $index, strtolower($word));
  48. }
  49. $query .= $join . 'WHERE ' . $where;
  50. // usuniecie czterech ostatnich znakw - s3owa ' AND'
  51. $query = substr($query, 0, strlen($query) - 4);
  52. $result = $db->query($query);
  53.  
  54. // wy?wietlenie wynikw
  55. echo '<hr/>';
  56. $num_rows = $result->num_rows;
  57. echo '<p>Wynik wyszukiwania s3w <b>' . htmlspecialchars(join(' ', $words)) .
  58. '</b> zawiera ' . $num_rows . ' dokument' .
  59. (($num_rows == 1) ? '' : (($num_rows < 4) ? 'y' : 'w')) . ':</p>';
  60.  
  61. // wy?wietlenie sugrowanego zapytania, je?eli stwierdzono b3edy literowe
  62.  
  63.  
  64. echo '<ul>';
  65. while ($row = $result->fetch_array())
  66. {
  67. echo '<li><b><a href="' .
  68. htmlspecialchars($row['opis']) . '">' .
  69. htmlspecialchars($row['tytul']) . '</a></b>- ' .
  70.  
  71. }
  72. echo '</ul>';
  73. }
  74. }

ale nie działa poprawie, nie wyświetla nic, jakiś błąd nie wiem gdzie
darko
A nie wystarczyłoby Ci takie zapytanie:
  1. $sql = "select distinct * from linki_dane where tytul like '".$tytul."%' or opis like '".$opis."%'";

?
Lejto
no to po co ta reszta kodu? ;p
jak ją naprawić?
zobaczę z twoim zapytaniem, potem to normalnie w pętli wyświetlać tak?
darko
Nie wiem, co przysyłasz z formularza? Domyślam się, że w powyższym kodzie "przeparsowujesz" sobie url. Sprawdź "na sucho" np. w PMA czy to zapytanie działa tak, jak tego oczekujesz.
Lejto
no z formularza przestałam słowa

używam 2 zapytań
2 jest po to gdy użytkownik wybierze rozszerzenie pliku
  1. $sql = $db->query("select distinct * from linki_dane where tytul like '".$zapytanie."%' or opis like '".$zapytanie."%' or tagi like '".$zapytanie."%'
  2. and rozszerzenie = '".$wartosc."'");

2 zapytanie, niestety nie działa, nie wyświetla wyników. Zapytanie 1 bez and rozszerzenie = '".$wartosc."'" działa

jak to poprawić?
Babcia@Stefa
A daj var_dump ( $ wartosc ) i pokaż nam co tam przekazujesz.

Daj echo $ZAPYTANIE.

Otwórz Sobię phpmyadmin i wklej gotowe zapytanie, popraw je odpowiednio tam i w taki sposób będziesz wiedzieć gdzie jest błąd w zapytaniu.

@edit
I koduj... W UTF-8! smile.gif

-- WebNuLL
Lejto
Kod
string(3) "rar"
- var_dump();
jest to wartosc po której ma wyświetlać rekordy tzn te które mają taki i taki opis takie i takie tagi i takie rozszerzenie

w pma robiłem to wyświetliło ale nie zwróciło uwagi na rozszerzenie
wiiir
Cytat(darko @ 20.02.2010, 23:30:57 ) *
A nie wystarczyłoby Ci takie zapytanie:
  1. $sql = "select distinct * from linki_dane where tytul like '".$tytul."%' or opis like '".$opis."%'";

?


ja do tego dodalem bym jeszcze lower lub upper na kolumne i zmienna bo bez tego moze nie dzialac

czyli
  1. $sql = "select distinct * from linki_dane where lower(tytul) like lower('".$tytul."%') or lower(opis) like lower('".$opis."%')";


i takie zapytanie musi dzialac.. jesli nie zworci ci wynikow to nie ma czekogs takiego w bazie
Lejto
ok, dzięki zobaczę
muszę jeszcze głębiej poczytać o mysql winksmiley.jpg
thek
Algebra Boole'a bywa czasem dziwna dla początkujących. Wstaw nawiasy odpowiednio i wtedy zobacz bo jak dla mnie pomieszanie OR i AND sprawiają, że całe porównanie się kaszani. Czemu? Bo OR zwraca true gdy trafi kiedykolwiek true zaś AND tylko gdy oba są true. Teraz popatrz jak będzie reagować Twoje kryterium szukania. Zapewne dojdzie do sytuacji takiej, że rzadko dojdzie do części AND. Lepiej wrzuć nawiasy w odpowiednich miejscach i zobacz jak teraz zadziała:
  1. $sql = $db->query( 'SELECT DISTINCT * FROM linki WHERE rozszerzenie =\''.$wartosc.'\' AND ( tytul LIKE \'%'.$zapytanie.'%\' OR opis LIKE \'%'.$zapytanie.'%\' OR tagi LIKE \'%'.$zapytanie.'%\' )' );

EDIT. Zwróć też uwagę na pierwsze sprawdzenie rozszerzenia. Powinno się już w pierwszym warunku najbardziej ograniczyć wyniki. A rozszerzenie moim zdaniem to zrobi. Dodatkowo wszystkie w części OR są objęte nawiasem by traktowane to było jako całość. W takim wypadku więc każę mu szukać wszystkie o danym rozszerzeniu, a dopiero spośród nich sprawdzać czy już przerzedzone wyniki są zgodne z którymkolwiek LIKE.
Lejto
nie chce działać twój schemat zapytania
  1. $sql = $db->query("SELECT DISTINCT * FROM linki_dane WHERE hosting =\'".$h."\'
  2. AND ( tytul LIKE \'%".$zapytanie."%\' OR opis LIKE \'%".$zapytanie."%\' OR tagi LIKE \'%".$zapytanie."%\'");


próbowałem też takiego
  1. $sql = $db->query("select distinct * from linki_dane where tytul like '".$zapytanie."%' or opis like '".$zapytanie."%' or tagi like '".$zapytanie."%' AND hosting =
  2. (SELECT hosting FROM linki_dane WHERE hosting '".$h."') ");

ale też na nic...
thek
Ech... Nie po to wstawiałem te nawiasy byś je usuwał sobie gdy zechcesz. Popatrz sobie na Twoją wersję zapytania i powiedz, gdzie zamykasz ten otwarty nawias okrągły w pierwszej wersji.
Lejto
działa winksmiley.jpg z szybkości brak dokładności
dzięki
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.