Zwariowany
18.07.2009, 20:40:44
Mam w tabeli trzy kolumny. Imię, nazwisko, nick. Np. Jan, Kowalski, Kowal. I teraz moje pytanie. Jeżeli użytkownik chcę go znaleźć i wpisuje w wyszukiwarkę Jan Kowalski Kowal, to jak zrobić, żeby like dotyczyło wszystkim kolumn i dopasowywało fragment z tego kodu? bo takie coś to niestety nie działa:
SELECT * FROM `users` WHERE (`imie` LIKE 'Jan Kowalski Kowal') OR (`nazwisko` LIKE 'Jan Kowalski Kowal') OR (`nick` LIKE 'Jan Kowalski Kowal')
wookieb
18.07.2009, 20:51:31
to nie jest takie proste.
Zrob sprytny kod który ci to ułatwi
1) rozbije ciag na słowa
2) wstawi te slowa do poszczegolnych kolumn w takiej postaci
[sql]
pole LIKE '%slowo1%' OR pole like '%slowo2%' itd
przydatne funkcje
http://php.net/explode - rozbijanie na slowa
http://php.net/implode - warunki wrzucasz do tablicy ktore potem laczysz ciagem ' OR '
Zwariowany
18.07.2009, 20:55:18
Już próbowałem rozbijać, ale doszedłem do wniosku, że jeżeli użytkownik np wpiszę: Jan Kowalski Janek pogromca czarnych jajek. To co wtedy? już nie będzie tak łatwo, że to rozbiję, bo nie wiem ile będzie słów, dlatego szukam jakiegoś innego rozwiązania.
wookieb
18.07.2009, 21:03:17
musisz ograniczyc uzytkownikowi ilsoc znakow albo słow. to juz zalezy od ciebie. ta metoda jest najprostsza pomijajac wyszukiwanie pełnotekstowe (fulltext)
Zwariowany
18.07.2009, 22:17:45
uznałem, że 5 słów to najwięcej ile może być sprawdzane ze wszystkimi polami: oto kod dla imie i nazwisko
<?php
if ($ile == '1')
{
$poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
}
if ($ile == '2')
{
$poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
$poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
}
if ($ile == '3')
{
$poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
$poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
$poczatek.=' OR `imie` LIKE '%'.$eksplode[2].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[2].'%'';
}
if ($ile == '4')
{
$poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
$poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
$poczatek.=' OR `imie` LIKE '%'.$eksplode[2].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[2].'%'';
$poczatek.=' OR `imie` LIKE '%'.$eksplode[3].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[3].'%'';
}
if ($ile == '5')
{
$poczatek.='`imie` LIKE '%'.$eksplode[0].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
$poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
$poczatek.=' OR `imie` LIKE '%'.$eksplode[2].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[2].'%'';
$poczatek.=' OR `imie` LIKE '%'.$eksplode[3].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[3].'%'';
$poczatek.=' OR `imie` LIKE '%'.$eksplode[4].'%'';
$poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[4].'%'';
}
?>
wookieb
18.07.2009, 22:33:58
to wcale nie jest sprytny skrypt...
<?php
$fields=array('imie', 'nazwisko');
// wywalamy puste "słowa"
// jezeli jest za duzo słow to bierzemy tylko nasze 5
foreach($slowa as $slowo)
{
foreach($fields as $field)
{
}
}
$twojeWhere=implode(' OR ',$where); ?>
Czyż nie łatwiej + bezpieczniej + efektywniej
Ja rozumiem początkujący etap ale podałem ci link do implode który jest bardzo dużym ułatwieniem
Zwariowany
18.07.2009, 22:52:22
Ale tutaj nawet na początku zapytania na wstępie wywali OR a przecież pierwszy `name` nie może być z OR
wookieb
18.07.2009, 22:53:17
Sprawdź a potem mów.
Twój post oznacza, że nadal nie przeczytałeś o implode...
planet
19.07.2009, 12:55:15
implode wstawia OR pomiędzy wyrazy, analogicznie z tego co piszesz należałoby sądzić, że po ostatnim parametrze też doda OR a tak nie jest. kod, który podał wookieb na pewno jest poprawny.
rama
19.07.2009, 16:37:57
Cytat(Zwariowany @ 18.07.2009, 21:40:44 )

SELECT * FROM `users` WHERE (`imie` LIKE 'Jan Kowalski Kowal') OR (`nazwisko` LIKE 'Jan Kowalski Kowal') OR (`nick` LIKE 'Jan Kowalski Kowal')
Innym sposobem jest złączenie "kolumn" poprzez funkcję
CONCAT, chociaż rozwiązanie to może być kosztowne.
SELECT * FROM `users` WHERE CONCAT(`imie`,`nazwisko`,`nick`) LIKE '%wyrazenie_szukane%';
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.