Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]/[mysql]wyszukiwarka, nie działa
Lejto
post
Post #1





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


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





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


A nie wystarczyłoby Ci takie zapytanie:
  1. $sql = "select distinct * from linki_dane where tytul like '".$tytul."%' or opis like '".$opis."%'";

?
Go to the top of the page
+Quote Post
Lejto
post
Post #3





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


no to po co ta reszta kodu? ;p
jak ją naprawić?
zobaczę z twoim zapytaniem, potem to normalnie w pętli wyświetlać tak?
Go to the top of the page
+Quote Post
darko
post
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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.
Go to the top of the page
+Quote Post
Lejto
post
Post #5





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


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ć?
Go to the top of the page
+Quote Post
Babcia@Stefa
post
Post #6





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


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! (IMG:style_emoticons/default/smile.gif)

-- WebNuLL

Ten post edytował Babcia@Stefa 22.02.2010, 18:45:39
Go to the top of the page
+Quote Post
Lejto
post
Post #7





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


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





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

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


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





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


ok, dzięki zobaczę
muszę jeszcze głębiej poczytać o mysql (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
thek
post
Post #10





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




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.

Ten post edytował thek 24.02.2010, 10:25:41
Go to the top of the page
+Quote Post
Lejto
post
Post #11





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


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...

Ten post edytował Lejto 24.02.2010, 17:30:07
Go to the top of the page
+Quote Post
thek
post
Post #12





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




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.
Go to the top of the page
+Quote Post
Lejto
post
Post #13





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


działa (IMG:style_emoticons/default/winksmiley.jpg) z szybkości brak dokładności
dzięki
Go to the top of the page
+Quote Post

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 - 16:19