Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Prosta wyszukiwarka a jednak problem, Problem z wyszukiwanie np: imion i nazwisk
kilinho
post 28.06.2008, 23:27:54
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.05.2008

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


Witam.

Mam sobie wyszukiwarke osob ktore zarejestrowaly sie na mojej stronie.
Tabela danych tych osob:
ID | Imie | Nazwisko | Miejscowsc | itd

I teraz problem polega na tym ze wpisujac w formularzu znajdz np. Jan Kowalski, to skrypt pyta sie w do tabelki:
select * from tabelka where nazwisko like '%Jan Kowalski%' and imie like '%Jan Kowalski%'
to zapytanie da 0 wynikow.
Jan Kowalski jest wpisywane w jednym polu.
W jaki sposob zadac pytanie badz przerobic skrypt php aby dojsc do takiej formy:
select * from tabelka where nazwisko like '%Kowalski%' and imie like '%Jan%'?
Czy tworzac indeksy w tabelce dla Imie i Nazwisko badz explod`ujac Jana Kowalskiego na dwa oddzielne wyrazy (tworzac z niego tablice i najpierw przeszukac Jan a potem Kowalski). Czy te dwie metody dadza rozwiazanie? (tablica moze byc malo wydajna przy wiekrzej ilosc slow?)
Go to the top of the page
+Quote Post
milupo2nd
post 28.06.2008, 23:39:53
Post #2





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 12.08.2004

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


jeśli zawsze ktos bedzie szukal w formie [imie]_[nazwisko] to rozbij ten ciag na dwa stringi i daj zapytanie:
select * from tabelka where nazwisko like '%[nazwisko]%' and imie like '%[imie]%'
Go to the top of the page
+Quote Post
nithajasz
post 29.06.2008, 01:10:15
Post #3





Grupa: Zarejestrowani
Postów: 230
Pomógł: 27
Dołączył: 27.05.2008
Skąd: Warszawa

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


Najlepiej przerób formularz na oddzielne pola imie i nazwisko, a dlaczego? Bo explode utrudni Ci tylko zadanie w przypadku gdy np. ktoś będzie miał dwa imiona i ktoś będzie w ten sposób wyszukiwał albo ktoś będzie miał nazwisko dwuczłonowe.
Go to the top of the page
+Quote Post
kilinho
post 29.06.2008, 08:07:59
Post #4





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.05.2008

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


No to w jaki sposob jest zrobiona wyszukiwarka osob np. w najpopularniejszym serwisie przyjaciol szkolnych. Wpisujemy w wyszukiwarce np. Jan Kowalski badz Kowalski Jan to zawsze otrzymamy ten sam wynik. Więc jednak da sie to jakos zrobic. Najprawdopodobniej kazde slowo jest przeszukiwane oddzielnie, tylko ze jakos to musieli fajnie zrobic ze tak szybko dziala. Bo tak ponaszemu jak tu piszemy to kazde slowo bedzie przeszukiwane oddzielne:
imie like '%jan%' and nazwisko like '%jan%' and imie like '%kowalski%' and nazwisko like '%kowalski%'
. To jest dobre rozwiazanie jak mamy mala baze, a jezeli bedziemy mieli jakies 100 000 danych do przeszukania, to ten skrypt bedzie dzialal i dzialal.
Prosze o pomoc
Go to the top of the page
+Quote Post
wlamywacz
post 29.06.2008, 09:17:16
Post #5





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


Bo tam nie używają LIKE gdyż to zabija bazę.
Go to the top of the page
+Quote Post
kilinho
post 29.06.2008, 09:26:09
Post #6





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.05.2008

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


Mozna dokladniej, tworza indeksy dla tabeli?
Go to the top of the page
+Quote Post
wlamywacz
post 29.06.2008, 09:27:52
Post #7





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


Na takie tematy to na PHP Pro
Temat: wyszukiwarka
Go to the top of the page
+Quote Post
bim2
post 29.06.2008, 10:20:13
Post #8





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Bo po co dawać like? Jan to Jan... Nie chce żeby mi znalazło Janosik, albo Wonajan (nazwisko powiedzmy).

WHERE nazwisko = 'Jan' OR imie = 'Jan' OR nazwisko = 'Kowalski' OR imie = 'Kowalski'


--------------------
Go to the top of the page
+Quote Post
wlamywacz
post 29.06.2008, 10:59:42
Post #9





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


Źle
  1. WHERE nazwisko = 'Jan' OR imie = 'Jan' OR nazwisko = 'Kowalski' OR imie = 'Kowalski'


  1. WHERE imie = 'Jan' AND nazwisko = 'Kowalski' OR imie = 'Kowalski' AND nazwisko = 'Jan'


Jednak nie jest to zbyt praktyczne.

Ten post edytował wlamywacz 29.06.2008, 11:00:10
Go to the top of the page
+Quote Post
kilinho
post 29.06.2008, 12:05:05
Post #10





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.05.2008

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


Skrypcik generujacy zapytanie do bazy:
  1. <?php
  2. $_GET[query]='Jan Kowalski';
  3.  $szukane_slowa = explode(" ", $_GET[query]);
  4.  
  5.  
  6.  $licz = count($szukane_slowa);
  7.  $query = "SELECT * FROM `uzytkownicy` where"; 
  8.  
  9.  for ($x=0; $x < $licz; $x++){
  10.  $imie[$x] = "`first_name` = '$szukane_slowa[$x]'";
  11.  $nazwisko[$x] = "`last_name` = '$szukane_slowa[$x]'";
  12.  }
  13.  
  14.  
  15.  for ($x=0; $x < $licz; $x++){
  16.  $query .= ' '.$imie[$x].' and '.$nazwisko[($licz-$x-1)].' '; 
  17.  if ($x >= 0 and $x < ($licz-1)){
  18.  $query .= "or";
  19.  }
  20.  }
  21.  
  22.  $znajdz = mysql_query($query);
  23.  while ($znajdz_row = mysql_fetch_array($znajdz)){
  24.  echo $znajdz_row[first_name].' '.$znajdz_row[last_name].'';
  25.  }
  26. ?>

Wygeneruje nam zapytanie po wpisaniu w wyszukiwarce np: Jan Kowalski


  1. <?php
  2. SELECT * FROM `uzytkownicy` where `first_name` = 'Jan' and `last_name` = 'Kowalski' or `first_name` = 'Kowalski' and `last_name` = 'Jan';
  3. ?>


Czy to ma sens?
Go to the top of the page
+Quote Post
bim2
post 29.06.2008, 12:18:06
Post #11





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Ma. Nie powiem troche to zagmatwałeś. Mogłeś odrazu dać budowe zapytania.
  1. <?php
  2. $szukane_slowa = explode(" ", $_GET[query]);
  3. foreach($szukane_slowa AS $i => $value)
  4. {
  5.  $wheres[] = ' `last_name`=''.$value.'' AND `first_name`=''.$szukane_slowa[$i++].''';
  6. }
  7.  
  8. $sql = 'SELECT * FROM `uzytkownicy` where '.implode('OR', $wheres);
  9. ?>


EDIT: Poprawiłem. Chyba bedzie ok.

Ten post edytował bim2 29.06.2008, 12:34:24


--------------------
Go to the top of the page
+Quote Post
kilinho
post 29.06.2008, 13:29:26
Post #12





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.05.2008

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


EDIT: teraz jest tak:
ten skrypt da nam teraz
  1. <?php
  2. SELECT * FROM `uzytkownicy` where `last_name`='Jan' AND `first_name`='Jan'OR `last_name`='Kowalski' AND `first_name`='Kowalski'
  3. ?>

a powinno byc

  1. <?php
  2. SELECT * FROM `uzytkownicy` where (`first_name` = 'Jan' and `last_name` = 'Kowalski') or (`first_name` = 'Kowalski' and `last_name` = 'Jan');
  3. ?>


Pisanie takich skryptow jest zlym rozwiazaniem:
1. Wpisujac Jan to bedzie szukac imie=jan i nazwisko=jan wiec jest bez sensu
2. przy trzech slowach juz trzeba sprawdzac wszystkie kombinacje
3. malo wydajne pzy wiekrzej ilosci danych
4. generowane zapytanie staje sie zbyt dlugie co juz samo spowolni dzialanie

Wniosek:
Szukac innego rozwiazania, byc moze ktos ma jakis pomysł?

Ten post edytował kilinho 29.06.2008, 13:29:10
Powód edycji: jak używasz bbcode to poprawnego
Go to the top of the page
+Quote Post
bim2
post 29.06.2008, 18:39:03
Post #13





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Jak nie wydajne? Maksymalnie ktoś wpisze 3 wyrazy...

Poprawiony:
  1. <?php
  2. $szuakne_slowa = 'lol bim tata';
  3. $szukane_slowa = explode(" ", $szuakne_slowa);
  4. foreach($szukane_slowa AS $i => $value)
  5. {
  6. $tmp = (!isset($szukane_slowa[$i+1])?$szukane_slowa[0]:$szukane_slowa[$i+1]);
  7.  $wheres[] = ' (`last_name`=''.$value.'' AND `first_name`=''.$tmp.'') ';
  8.  $wheres[] = ' (`last_name`=''.$tmp.'' AND `first_name`=''.$value.'') ';
  9. }
  10.  
  11. $sql = 'SELECT * FROM `uzytkownicy` where '.implode('OR', $wheres);
  12. echo $sql;
  13. ?>

Działa ładnie i jest wydajne moim zdaniem.


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

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.06.2025 - 13:10