[php][mysql] Problem z wyszukiwarką

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

[php][mysql] Problem z wyszukiwarką

Post autor: Strachu »

Witam, mam problem z wyszukiwarką zrobioną w PHP, opartą o bazę mysql. Otóż gdy napisałem jej kod, sprawdzałem ją to było wszystko dobrze oprócz tego, że nie wyświetlała wyników wyszukiwania :(
Gdy w pole z szukanym słowem wpisywałem słowo, które nie znajduje się w bazie, to wyszukiwarka wyświetlała, że nie ma wyników do wyświetlenia, a gdy wpisałem słowo, które jest w bazie, to skrypt wyświetlił tabelę, ale bez wyników.
Oto cały kod mojej wyszukiwarki:
[php]<?php
require "config.php";
require "includes/connect.php";
require "includes/function-select.php";
include "includes/function.php";

session_start();

include "includes/page_header.php";
IF ($_GET[ok]==1) {
$query = htmlspecialchars($_POST[query]);
$result = @mysql_query("SELECT * FROM " .$prefix. "posts WHERE contents LIKE '%$query%'");
?>
<TABLE border=0 cellspacing=0 width=100%><TR><TD>
<TABLE border=0 cellspacing=1 width=100%><TR><TD style="BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid;" bgcolor=#00BBCA><CENTER>Wyniki wyszukiwania:</CENTER></TD></TR>
<TR><TD><TABLE border=0 cellspacing=0 width=100%>
<?
IF ($result && @mysql_num_rows($result) != 0) {
?>
<TR>
<TD align="center" width=25%>Forum:</TD>
<TD align="center" width=30%>Nazwa tematu:</TD>
<TD align="center" width=20%>Autor:</TD>
<TD align="center" width=10%>Odpowiedzi:</TD>
<TD align="center" width=15%>Data utworzenia:</TD></TR>
</TR>
<?
$rekord = mysql_fetch_array($result);
$rekord_topic = @mysql_query("SELECT * FROM " .$prefix. "topics WHERE id='$rekord[topic]' ORDER BY createdate DESC");
$rekords = mysql_fetch_array($rekord_topic);
$autor = @mysql_fetch_array(@mysql_query("SELECT * FROM " .$prefix. "users WHERE id='$rekords[autor]'") );
$forums = @mysql_fetch_array(@mysql_query("SELECT * FROM " .$prefix. "forums WHERE id='$rekords[forum]'") );
while ($a = mysql_fetch_array($result) ) {
?>
<TR>
<td width=25% height="25"><a href="forums.php?id=<? echo $forums[id] ?>"><FONT SIZE="3" COLOR="000000"> <? echo $forums[name] ?></FONT></TD>
<td width=30% height="25"><a href="topics.php?t=<? echo $rekords[id] ?>"><FONT SIZE="3" COLOR="000000"> <? echo $rekords[name] ?></FONT></TD>
<td width=20% height="25" nowrap align="center"><a href="profile.php?mode=viewprofile&id=<? echo $autor[id] ?>"><FONT SIZE="2" COLOR="000000"><? echo $autor[username] ?></FONT></a></TD>
<td width=10% height="25" nowrap align="center"><FONT SIZE="2" COLOR="000000"><? echo $rekords[reply] ?></TD>
<td width=15% height="25" nowrap align="center"><FONT SIZE="2" COLOR="000000"><? echo $rekords[createdate] ?></TD>
</TR>
<?
}
echo "</TABLE></TD></TR></TABLE></TD></TR></TABLE>";
} else {
echo "Nie ma wyników do wyświetlenia!";
}
} else {
?>
<TABLE border=0 cellspacing=0 width=100%><TR><TD>
<TABLE border=0 cellspacing=1 width=100%><TR><TD style="BORDER-LEFT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid;" bgcolor=#00BBCA><CENTER>Wyszukiwarka:</CENTER></TD></TR>
<TR><TD><TABLE border=0 cellspacing=0 width=100%><TD><TR>
<FORM action="search.php?ok=1" method="POST">
<TABLE width=100% border=0>
<TR>
<TD>Szukane słowo:</TD>
<TD><INPUT TYPE="POST" NAME="query"></TD>
</TR>
<TR>
<TD><CENTER><INPUT TYPE="SUBMIT" VALUE="Szukaj" NAME="SUBMIT"></CENTER></TD>
</TR></TABLE>
</FORM></TD></TR></TABLE></TD></TR></TABLE></TD></TR></TABLE>
<?
}
require "includes/page_footer.php";
?>[/php]

Możecie mi powiedzieć co w Tym kodzie jest źle i jak to naprawic?

Z góry dziękuję za pomoc.
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql] Problem z wyszukiwarką

Post autor: viraptor »

Nie powiem ci dokładnie, bo nie sprawdze, ale powiem ci jak sam to możesz zrobić.
Nie przesyłaj od razu query do bazy, tylko zapisz do $query, wypisz sobie w komentarzu na stronie, a potem zrób mysql_query().
Zobacz jak wygląda to $query - jeśli widzisz błąd -> popraw.
Jeśli nie, to skopiuj DOKŁADNIE otrzymane zapytanie do mysql'a w konsoli / phpadminie / co tam używasz. Jeśli nie ma wyników - zobacz co jest nie tak z pytaniem, jeśli są sprawdź print_r $rekords; print_r $autor; print_r $forums;
Zobacz czy wszędzie dostajesz to co chcesz.
Jeśli tam jest to co chcesz, to daj konkretne przykłady wpisu z bazy, pytanie, przy którym nie działa i wyniki print_r z poprzednich kroków -> wtedy innym będzie łatwo cokolwiek sprawdzić.

PS. Czemu korzystasz z 3 SELECT'ów pod rząd?
Proponuje:
SELECT * FROM topics LEFT JOIN users ON users.id=topics.autor LEFT JOIN forums ON forums.id=topics.forum WHERE topics.id=$rekord[topic];
albo i jeszcze włączając w to pierwsze zapytanie.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql] Problem z wyszukiwarką

Post autor: Strachu »

viraptor pisze:Nie przesyłaj od razu query do bazy, tylko zapisz do $query, wypisz sobie w komentarzu na stronie, a potem zrób mysql_query().
Zobacz jak wygląda to $query - jeśli widzisz błąd -> popraw.
Jeśli nie, to skopiuj DOKŁADNIE otrzymane zapytanie do mysql'a w konsoli / phpadminie / co tam używasz. Jeśli nie ma wyników - zobacz co jest nie tak z pytaniem,
Wyniki były, ale w phpmyadminie(w wyszukiwrce nie było)
viraptor pisze:jeśli są sprawdź print_r $rekords; print_r $autor; print_r $forums;
Zobacz czy wszędzie dostajesz to co chcesz.
Wszędzie dostaję to co chcę:roll:

Dowiedziałem się, że problem jest przy pętli while, ponieważ wszystko przed pętlą było wykonywane, a gdy dałem print_r w pętli to nic nie wyświetliło.
Czyli pętla się wcale nie wykonuje.

Wyszukiwarka wyświetla wyniki dopiero wtedy gdy dane słowo występuje w tytule tematu.
A jeśli występuje tylko w poście, to wyszukiwarka je olewa :?

Np. Gdy wpisałem w wyszukiwarkę "tak" to mi nic nie wyświetliło(mimo to iż takie słowo jest w jednym poście), a gdy wpisałem tak to wyświetliło mi 4 razy 1 temat, w którym tytule występuje litera "t" :? , a przecież ona występuje 5 razy w różnych postach.

Więc jak to naprawić, aby wyświetlało mi wyniki w postaci tematów, w których postach występuje dane słowo?

Proszę o pomoc.
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql] Problem z wyszukiwarką

Post autor: viraptor »

Linia 28 i 33: pierwszy post już znalazłeś w 28, a potem chcesz wziąść następny wynik - jeśli nie było więcej, to nie wejdzie wogóle do pętli while w 33. Wypisz sobie do debuga wartość mysql_num_rows($result); to będziesz wiedział ile ich się znajduje. Jeśli możesz znaleźć taką fraze, która występuje w kilku postach, to sprawdź dla niej, czy nie wypiszą się kolejne posty po 1, który zginie.
Ale i tak radze to skompresować do 1 query - "select ... join ... join ... where" wykonuje się z racji indeksów zwykle szybciej niż 3 selecty, a efekt jest taki sam.

PS. ten skrypt jest źle napisany - nie dostaniesz poprawnych wyników, bo forum i usera szukasz tylko dla pierwszego wyniku, a później wypisujesz rzędy pomijając pobieranie danych, które chesz wypisać... Napisz to od początku i poprawnie.
Pozatym jeśli piszesz forum, to przeszukiwanie za każdym razem CAŁYCH postów jest raczej głupim pomysłem... zrób jakiś indeks słów najlepiej.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql] Problem z wyszukiwarką

Post autor: Strachu »

viraptor pisze:Ale i tak radze to skompresować do 1 query - "select ... join ... join ... where" wykonuje się z racji indeksów zwykle szybciej niż 3 selecty, a efekt jest taki sam.
A jak wtedy się będzie odwowyłać do poszczególnych wartości? Np. jak napiszę tak:
[php]<?php
$results = @mysql_fetch_array(@mysql_query("SELECT * FROM " .$prefix. "topics LEFT JOIN " .$prefix. "users ON " .$prefix. "users.id=" .$prefix. "topics.autor LEFT JOIN " .$prefix. "forums ON " .$prefix. "forums.id=" .$prefix. "topics.forum WHERE " .$prefix. "topics.id=$rekord[topic]") );
?>[/php]
To do poszczególnej kolumny będzie się odwoływał tak:
[php]<?php
echo $results[users.id];
?>[/php]
tak:
[php]<?php
echo $results[users][id];
?>[/php]
Czy może jakoś inaczej? Proszę o wytłumaczenie mi tego :wink:
viraptor pisze:nie dostaniesz poprawnych wyników, bo forum i usera szukasz tylko dla pierwszego wyniku, a później wypisujesz rzędy pomijając pobieranie danych, które chesz wypisać...
:-D Dzięki, to powodowało niedziałanie wyszukiwarki :-D , wsadziłem to w pętlę i już śmiga :-D
viraptor pisze:Pozatym jeśli piszesz forum, to przeszukiwanie za każdym razem CAŁYCH postów jest raczej głupim pomysłem... zrób jakiś indeks słów najlepiej.
Dzięki za radę, jak będę je rozbudowywał to to zastosuję :wink:
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql] Problem z wyszukiwarką

Post autor: viraptor »

Strachu pisze: [php]<?php
echo $results[users.id];
?>[/php]
W ten sposób, chyba, że wiesz z góry jakie pola chcesz, to zamiast np.
SELECT * ...
robisz
SELECT topics.id as tid, topics.name as tname, .......
i masz zmienne $results['tid'], $results['tname'], etc.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql] Problem z wyszukiwarką

Post autor: Strachu »

viraptor pisze:
Strachu pisze: [php]<?php
echo $results[users.id];
?>[/php]
W ten sposób, chyba, że wiesz z góry jakie pola chcesz, to zamiast np.
A co jeśli przed nazwą danej tabeli mam prefiks, który znajduje się w zmiennej $prefix to jak wówczas odwołać się do takiej wartości?
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql] Problem z wyszukiwarką

Post autor: viraptor »

$results[$prefix.'users.id']
Indeks tabeli to normalny string, nie stała (w zasadzie poprawny zapis jest z ', albo "), czyli normalnie sklejasz przez kropke 2 stringi.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql] Problem z wyszukiwarką

Post autor: Strachu »

Dzięki za pomoc :wink:
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql] Problem z wyszukiwarką

Post autor: Strachu »

viraptor pisze:$results[$prefix.'users.id']
Indeks tabeli to normalny string, nie stała (w zasadzie poprawny zapis jest z ', albo "), czyli normalnie sklejasz przez kropke 2 stringi.
Niestety po sprawdzeniu okazuje się, że nie działa :cry:
Oto zmienna z zapytaniem:
[php]<?php
$results = @mysql_fetch_array(@mysql_query("SELECT * FROM " .$prefix. "topics LEFT JOIN " .$prefix. "users ON " .$prefix. "users.id=" .$prefix. "topics.autor LEFT JOIN " .$prefix. "forums ON " .$prefix. "forums.id=" .$prefix. "topics.forum WHERE " .$prefix. "topics.id=$rekord[topic] ORDER BY createdate DESC") );
?>[/php]
Gdy wypiszę polecenie aby mi wyświetliło 1 wartośc z zapytania:
[php]<?php
echo $results[$prefix. "topics.title"];
?>[/php]
To skrypt zamiast wyświelić zawartośc tej tablicy, to nic nie wyświetla(tak jakby ona nie istniała).

Więc jak to zapisać?
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql] Problem z wyszukiwarką

Post autor: viraptor »

Stawiam na to, że nic nie masz w $results...
print_r $results;
Prawda? :)
Sprawdź, bądź kreatywny - na pewno gdzieś znajdziesz błąd.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql] Problem z wyszukiwarką

Post autor: Strachu »

Sprawdzałem print_r $results, jeszcze przed napisaniem poprzedniego posta.
Print_r pokazuje na to, że są dane w tej tablicy.
Tylko, że pewnie jest złe odwołanie się do poszczególnych jej elementów. :?
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql] Problem z wyszukiwarką

Post autor: viraptor »

Jak widzisz to w tablicy, to spróbuj się odwołać przez pełną nazwę - bez prefix'a. Dołączenie prefixa na pewno jest dobre - kombinuj...
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql] Problem z wyszukiwarką

Post autor: Strachu »

Witam, zamieniłem to:
[php]<?php
$results = @mysql_fetch_array(@mysql_query("SELECT * FROM " .$prefix. "topics LEFT
JOIN " .$prefix. "users ON " .$prefix. "users.id=" .$prefix. "topics.autor LEFT JOIN
" .$prefix. "forums ON " .$prefix. "forums.id=" .$prefix. "topics.forum WHERE "
.$prefix. "topics.id=$rekord[topic] ORDER BY createdate DESC") );
?>[/php]
Na takie coś:
[php]<?php
$results = @mysql_fetch_array(@mysql_query("SELECT t.*, u.*, f.* FROM " .$prefix. "topics t, " .$prefix. "users u, " .$prefix. "forums f WHERE t.id=$rekord[topic] AND u.id=t.autor AND f.id=t.forum ORDER BY createdate DESC") ) OR die(mysql_error () );
?>[/php]
I na to odwołuję się tak:
[php]<?php
echo $results[pole];
?>[/php]
I mam pytanie:

Jak się odwołać do tablicy $results aby odczytać powiedzmy pole 'id' z tabeli users o aliasie 'u' wiedząc, ze tabele forums i topics równiez posiadają pole o nazwie 'id'?
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql] Problem z wyszukiwarką

Post autor: viraptor »

$results['u.id'];
Jak nie chcesz kropek, to SELECT u.id as uid, itd. -> dostajesz $results['uid'];
ODPOWIEDZ