Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL]Wyszukiwanie w kilku tabelach.
jaca19
post 6.02.2011, 01:47:11
Post #1





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.02.2009

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


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'];
Go to the top of the page
+Quote Post
CuteOne
post 6.02.2011, 07:37:55
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


użyj JOIN
Go to the top of the page
+Quote Post
jaca19
post 6.02.2011, 12:50:15
Post #3





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.02.2009

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


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.
Go to the top of the page
+Quote Post
ylk
post 6.02.2011, 12:54:41
Post #4





Grupa: Zarejestrowani
Postów: 194
Pomógł: 26
Dołączył: 9.01.2011
Skąd: /dev/null

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


  1. SELECT * FROM users WHERE name LIKE '%$q%' OR address LIKE '%$q%'
Go to the top of the page
+Quote Post
jaca19
post 6.02.2011, 13:01:51
Post #5





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.02.2009

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


no tak tylko ja mam to zrobione WHERE MATCH AGAINST
Go to the top of the page
+Quote Post
ylk
post 6.02.2011, 14:51:12
Post #6





Grupa: Zarejestrowani
Postów: 194
Pomógł: 26
Dołączył: 9.01.2011
Skąd: /dev/null

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


hmmm
  1. WHERE MATCH(username) AGAINST('$query' IN BOOLEAN MODE) OR WHERE MATCH(address) AGAINST('$query' IN BOOLEAN MODE)

questionmark.gif
Go to the top of the page
+Quote Post
jaca19
post 6.02.2011, 15:32:14
Post #7





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.02.2009

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


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))
Go to the top of the page
+Quote Post
ylk
post 6.02.2011, 15:34:03
Post #8





Grupa: Zarejestrowani
Postów: 194
Pomógł: 26
Dołączył: 9.01.2011
Skąd: /dev/null

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


daj
  1. $result=mysql_query("$q") or die(mysql_error());

może coś wypluje tongue.gif
Go to the top of the page
+Quote Post
Zbigizmi
post 6.02.2011, 15:34:26
Post #9





Grupa: Zarejestrowani
Postów: 18
Pomógł: 4
Dołączył: 4.02.2011

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


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
Go to the top of the page
+Quote Post
jaca19
post 6.02.2011, 15:48:46
Post #10





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.02.2009

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


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

Ten post edytował jaca19 6.02.2011, 15:55:10
Go to the top of the page
+Quote Post
Zbigizmi
post 6.02.2011, 16:18:22
Post #11





Grupa: Zarejestrowani
Postów: 18
Pomógł: 4
Dołączył: 4.02.2011

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


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
Go to the top of the page
+Quote Post
jaca19
post 6.02.2011, 19:48:19
Post #12





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.02.2009

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


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.
Go to the top of the page
+Quote Post
Zbigizmi
post 6.02.2011, 20:19:00
Post #13





Grupa: Zarejestrowani
Postów: 18
Pomógł: 4
Dołączył: 4.02.2011

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


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>';

Ten post edytował Zbigizmi 6.02.2011, 20:29:08
Go to the top of the page
+Quote Post
franki01
post 8.02.2011, 19:46:56
Post #14





Grupa: Zarejestrowani
Postów: 508
Pomógł: 75
Dołączył: 2.11.2005
Skąd: Bydgoszcz

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


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.
Go to the top of the page
+Quote Post
jaca19
post 8.02.2011, 23:22:23
Post #15





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 23.02.2009

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


  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.

Ten post edytował jaca19 8.02.2011, 23:04:55
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: 12.06.2024 - 02:11