Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Wyszukiwanie w kilku tabelach.
Forum PHP.pl > Forum > PHP
jaca19
Witam,
Otóż mam problem. Mam już działającą wyszukiwarkę, przy wpisaniu nazwy użytkownika wyświetla się użytkownik z linkiem do profilu, ale chciałbym żeby również przy wpisaniu miasta wyświetlili się userzy z danej lokacji. Moje pytanie jak połączyć wyszukiwanie w 2 tabelach aby wyniki wyświetlały się zależnie od tego czy user wpisze nick bądź lokalizację.Słyszałem o UNION , ale jakoś mi to nie wychodzi. Link do wyszukiwarki: http://compsite.privacy.pl/Skrypt2/viewfriends.php#, można przetestować wpisując a*.

  1. if($type == "count")
  2. {
  3. $sql = mysql_query("SELECT count(username)
  4. FROM users
  5. WHERE MATCH(username)
  6. AGAINST('$query' IN BOOLEAN MODE)");
  7. $total = mysql_fetch_array($sql);
  8. $num = $total[0];
  9.  
  10. echo $num;
  11.  
  12. }
  13.  
  14. if($type == "results")
  15. {
  16. $sql = mysql_query("SELECT username, name, location, avatar
  17. FROM users
  18. WHERE MATCH(username)
  19. AGAINST('$query' IN BOOLEAN MODE)");
  20.  
  21. while($array = mysql_fetch_array($sql)) {
  22.  
  23. $avatar = $array['avatar'];
  24. $username = $array['username'];
  25. $name = $array['name'];
  26. $location = $array['location'];
CuteOne
użyj JOIN
jaca19
Sorry pisałem późno ten temat i nie w wielu tabelach tylko wyszukiwanie w jednej tabeli ;P. I jeśli JOIN to jak tego dokładnie użyć, użyłem tak jak w manualu i wyskakuje błąd z mysql_fetch_array.
ylk
  1. SELECT * FROM users WHERE name LIKE '%$q%' OR address LIKE '%$q%'
jaca19
no tak tylko ja mam to zrobione WHERE MATCH AGAINST
ylk
hmmm
  1. WHERE MATCH(username) AGAINST('$query' IN BOOLEAN MODE) OR WHERE MATCH(address) AGAINST('$query' IN BOOLEAN MODE)

questionmark.gif
jaca19
Zrobiłem tak jak napisałeś ale:

  1. Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/compsite/public_html/Skrypt2/search.php on line 37


A 37 linijka to:

  1. while($array = mysql_fetch_array($sql))
ylk
daj
  1. $result=mysql_query("$q") or die(mysql_error());

może coś wypluje tongue.gif
Zbigizmi
W twoim zapytaniu nie widzę dwóch tabel. Cały czas odnosisz się do tabeli users i wybierasz z niej kilka kolumn (username, name, location, avatar).
W pierwszym pytaniu pytasz o ilość wierszy odpowiedzi a w drugim wyszukujesz po username operując także na tabeli users.

Jeśli używasz przeszukiwanie pełnotekstowe, to przy tworzeniu tej tabeli powinno być zaznaczone utworzenie indeksu. Pełnotekstowe szukanie usera z username, które najczęściej jest tylko jednym słowem jest lekką przesadą. W tym wypadku like wystarczy w zupełności. I tak wyłapie wszystkie podobne nazwy userów.

Nie ma co używać JOIN, ponieważ nie ma nawet dwóch tabel.

pozdrawiam
jaca19
Cytat
Sorry pisałem późno ten temat i nie w wielu tabelach tylko wyszukiwanie w jednej tabeli ;P. I jeśli JOIN to jak tego dokładnie użyć, użyłem tak jak w manualu i wyskakuje błąd z mysql_fetch_array.


No rozumiem, spróbuje z LIKE i dam znać.

Dodano:
No powiem Ci że działa teraz, tylko że problem jak wpisuje polskie znaki np w "Wrocław" Jak napisze Wroc to znajduje, ale jak dodam ł to od razu błąd wyskakuje..
Zbigizmi
Problem z polskimi znakami może wynikać z kilku problemów.
1. Kodowania strony - używaj najlepiej utf8
2. porównywanie znaków w Mysql (najlepiej: utf8_general_ci)
3. Czy w edytorrze php masz tę same tablicę kodową, co twoja strona?

pozdrwiam
jaca19
1. Używam
2. Tak mam ustawione
3. Tak

I nadal błąd kiedy próbuje wyszukać frazy z polskim znakiem. Nie mam pojęcia gdzie tkwi problem.
Zbigizmi
A jaki błąd wyskakuje?
wstaw to w linijce 20 (powyższy listing) i powiedz, co wypluło.

echo '<pre>'; var_dump($sql); echo '</pre>';
franki01
Cytat(ylk @ 6.02.2011, 15:34:03 ) *
daj
  1. $result=mysql_query("$q") or die(mysql_error());

może coś wypluje tongue.gif

Podbijam. Na pewno coś wypluje. Spróbuj tego i podaj rezultat.

Przy okazji podaj, jak wygląda Twoje obecne zapytanie.
jaca19
  1. if($type == "count")
  2. {
  3. $sql = mysql_query("SELECT count(username)
  4. FROM users
  5. WHERE username LIKE '%$query%' OR location LIKE '%$query%' OR name LIKE '%$query%'");
  6. $total = mysql_fetch_array($sql);
  7. $num = $total[0];
  8.  
  9. echo $num;
  10.  
  11. }
  12.  
  13. if($type == "results")
  14. {
  15. $sql = mysql_query("SELECT *
  16. FROM users
  17. WHERE username LIKE '%$query%' OR location LIKE '%$query%' OR name LIKE '%$query%'
  18. /* AGAINST('$query' IN BOOLEAN MODE)*/ ");
  19.  
  20. while($array = mysql_fetch_array($sql)) {


Obecny kod wyszukiwania. Zrobiłem tak jak napisał zbigizmi i przy wpisywaniu polskich znaków wypluwa "bool(false)" a jak dałem "die(mysql_error());" to:
  1. Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'


omg, działa ;P miałem username w bazie ustawione na porównywanie latin_general_ci stąd te błędy. Przepraszam za niedopatrzenie ale oczywiście daje po + wszystkim którzy mnie naprowadzili smile.gif. Pozdrawiam.
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.