Alternatywna wyszukiwarka internetowa PHP + MySQL
Maly projekt wcale nie oznacza stanie w miejscu Nie raz male projekty sa wymagajace, zwlaszcza jak chce sie je dopracowac. Z drugiej strony latwiej dopracowywac cos co ma kilkaset lini kodu niz kilka tysiecy albo i wiecej. To podobnie jak z nauka jazdy na rowerze - najpierw doskonalisz robienie "koleczek" wokol podworka, potem jedziesz na wieksza trase, a na samym koncu uczysz sie hardkorowej jazdy bez trzymanki i skakania ze skarp )
400 stron, nawet liczac ze maja duzo podstron to jest i tak dopiero kilkadziesiat tysiecy rekordow - malutka baza. W miare jak bedzie rosla napewno zauwazysz ze google nie na daremno ma siec rozproszona z ~500 tysiecy serwerow.
Co do przylaczenia.. przedewszystkim trzymaja mnie inne zajecia i inne projekty. Z drugiej strony nie chce sie dolaczac do projektu ktory jest w pieluchach i narzucac swoje rozwiazania lub piszac wiekszosc. To jest twoj projekt wiec glownie ty powinienes sie nim zajmowac, mimo to bardzo chetnie pomoge w analizie kodu i szukaniu bledow.
400 stron, nawet liczac ze maja duzo podstron to jest i tak dopiero kilkadziesiat tysiecy rekordow - malutka baza. W miare jak bedzie rosla napewno zauwazysz ze google nie na daremno ma siec rozproszona z ~500 tysiecy serwerow.
Co do przylaczenia.. przedewszystkim trzymaja mnie inne zajecia i inne projekty. Z drugiej strony nie chce sie dolaczac do projektu ktory jest w pieluchach i narzucac swoje rozwiazania lub piszac wiekszosc. To jest twoj projekt wiec glownie ty powinienes sie nim zajmowac, mimo to bardzo chetnie pomoge w analizie kodu i szukaniu bledow.
No to mam małe co nieco kolego Stawi dla Ciebie. Niestety tym razem problem. Założenie jest takie iż poniżej podany kod przeszukując bazę MySQL tworzy tablice zliczając ile wyrazów zz podanych przez użytkownika odnosi się do treści stron. Testowałem to na bazie z dwoma adresami i pokazał się błąd. Mianowicie prawidłowo zlicza tylko dla jednego adresu następnemu pokazuje 1 punkt czyli jeden wyraz. Za parę godzin pewnie znajdę błąd ale pomoc oszczędziła by mi czasu... Może trochę zamotałem ale już zamieszczam kod.
Rzecz jasna nawet rozwiązanie tego problemu to tylko fragment. Do dalszej części to musi działać.
Kod: Zaznacz cały
if(isset($_POST['szukane']))//warunek wykonania
{
$szukane=trim($_POST['szukane']);//obcięcie spacji
$szukane=explode(" ", $szukane);//rozbicie zapytania na słowa
$ile_slow=count($szukane);
$sql_conn=mysql_connect('localhost','root','');//łączenie z MySQ
mysql_select_db('nauka',$sql_conn);//wybranie bazy danych;
$wynik[0]['adres'];//czy to potrzebne??
$wynik[0]['slowa'];
$wynik[0]['opis'];
$wynik[0]['punkty'];
$i=0;
foreach( $szukane as $key => $value)
{
$wyraz='\'%'.$value.'%\'';
$zapytanie1=mysql_query("SELECT * FROM adres WHERE slowa LIKE $wyraz");//zapytanie do bazy mysql
while($zapytanie=mysql_fetch_array($zapytanie1))
{
$ilosc=count($wynik);
for(;$i<=$ilosc;$i++)
{
// echo $i; echo "
";
if($wynik[$i]['adres']==$zapytanie['adres'])
{
$wynik[$i]['punkty']++;
echo $wynik[$i]['adres']; echo '
';
$zliczenie=TRUE;
}
}$i--;
if(!$zliczenie)
{
// echo $i;
$wynik[$i]['adres']=$zapytanie['adres'];
$wynik[$i]['slowa']=$zapytanie['slowa'];//słowa kluczowe po których idzie wyszukiwanie
$wynik[$i]['opis']=$zapytanie['opis'];
$wynik[$i]['punkty']=1;//ilość punktów rośnie z trafionymi słowami w zapytaniu
}
$zliczenie=FALSE;
}$i=0;
}
echo $wynik[$i]['adres'];
echo $wynik[$i]['punkty'];
echo '
';
$i=1;
echo $wynik[$i]['adres'];
echo $wynik[$i]['punkty'];
}
mysql_close($sql_conn);
Kod: Zaznacz cały
$wynik[0]['adres'];//czy to potrzebne??
$wynik[0]['slowa'];
$wynik[0]['opis'];
$wynik[0]['punkty'];
Kod: Zaznacz cały
$wynik = array();
Nie jestem pewien czy dobrze zalapalem co to ma robic ale bym zrobil tak:
No i wywolac to query, zwroci ci ktory adres spelnil ile slow (tylo te ktore spelnily conajmiej jedno).
Glowy nie daje za poprawnosc bo nie mam bazy, jak mozesz gdzies udostepnic jej dumpa to bede wdzieczny a raczej bedzie mi poprostu latwiej testowac
Mimo to, sprawdz to co mowilem o "full text index". Nie wiem ktorej wersji MySQL uzywasz, ale (glowy nie daje) dziala to dopiero od 5.x, ale (tutaj glowe juz moge dac) napewno bedzie szybsze )
[ Dodano: 2007-07-29, 02:35 ]
Wogole dobra sprawa jest robienie ile sie da przez MySQL, chocby dlatego ze jest szybciej duzo niz pisanie w PHP, no i bardziej przenosne - jak kiedys stwierdzisz ze jednak nie w PHP tylko w Ruby czy czymkolwiek innym chcesz to miec, to kopiujesz cale zapytania ktore robia praktycznie wszystko.
Kod: Zaznacz cały
$szukane = explode(" ", trim($_POST['szukane']));
$sql = "SELECT adres, count(*) as hits FROM adres WHERE (0)";
foreach ($szukane as $slowo) {
$sql .= " OR (slowa LIKE '%{$slowo}%') ";
}
$sql .= " GROUP BY adres ORDER BY hits DESC, adres ASC";
Glowy nie daje za poprawnosc bo nie mam bazy, jak mozesz gdzies udostepnic jej dumpa to bede wdzieczny a raczej bedzie mi poprostu latwiej testowac
Mimo to, sprawdz to co mowilem o "full text index". Nie wiem ktorej wersji MySQL uzywasz, ale (glowy nie daje) dziala to dopiero od 5.x, ale (tutaj glowe juz moge dac) napewno bedzie szybsze )
[ Dodano: 2007-07-29, 02:35 ]
Wogole dobra sprawa jest robienie ile sie da przez MySQL, chocby dlatego ze jest szybciej duzo niz pisanie w PHP, no i bardziej przenosne - jak kiedys stwierdzisz ze jednak nie w PHP tylko w Ruby czy czymkolwiek innym chcesz to miec, to kopiujesz cale zapytania ktore robia praktycznie wszystko.
Niestety mam problem z ugryzieniem komendy wyrzuca błędy albo robi zrzut nie wiadomo gdzie. Miałem problem z zaproponowanym kodem ale już wiem czemu. Baza składa się z jednej tablicy z kolumnami o nazwach: adres,slowa,opis. Jeżeli w formularzu podam słowa np. "nauka wiedza" skrypt ma przeszukać kolumnę słowa i uszeregować adresy razem z opisami po ilości trafionych słów. Jeżeli w jakimś rekordzie będą oba słowa dostanie dwa punkty będzie miał pierwszeństwo jeno słowo jeden punkt brak słów nie zostanie wyświetlony. W samej bazie danych niema żadnej kolumny z cyframi. A o ile dobrze zrozumiałem kod zakłada on że to w bazie są zliczane "punkty" po których następuje porządkowanie. Sam ze znalezieniem swojego błędu stoję w miejscu (parę drobnych poprawek, problem jaki był taki jest).
Kod: Zaznacz cały
mysqldump
Najczesciej robi zrzut na ekranDemerzel pisze:wyrzuca błędy albo robi zrzut nie wiadomo gdzie
Kod: Zaznacz cały
mysqldump -u USER -pHASLO -B baza1 baza2
A co do kodu, to mniejwiecej tak zrozumialem i mniejwiecej tak to dziala Sprawdz.
Zrzut taki otrzymałem tą komendą ale podprowadziłeś mnie Stawi na to czego było mi brak.
I wyszło jak chciałem.
Podany przez Ciebie kod faktycznie jest świetny :-D niestety wyżuca mi problem kiedy chce go wykorzystać.
-używam zmiennej sql do zapytania (jest dobrze)
-wywołuje mysql_fetch_array (podaje błąd iż nieprawidłowy argument)
Dodam załącznik z bazą
Kod: Zaznacz cały
mysql -u root -B nauka >> plik
Podany przez Ciebie kod faktycznie jest świetny :-D niestety wyżuca mi problem kiedy chce go wykorzystać.
-używam zmiennej sql do zapytania (jest dobrze)
-wywołuje mysql_fetch_array (podaje błąd iż nieprawidłowy argument)
Kod: Zaznacz cały
if(isset($_POST['szukane']))//warunek wykonania
{
$szukane=trim($_POST['szukane']);//obcięcie spacji
$szukane=explode(" ", $szukane);//rozbicie zapytaniana słowa
$sql_conn=mysql_connect('localhost','root','');//łączenie z MySQ
mysql_select_db('nauka',$sql_conn);//wybranie bazy danych;
$sql = "SELECT adres, count(*) as hits FROM adres WHERE (0)";
foreach($szukane as $slowo)
{
$sql.=" OR (slowo LIKE '%{$slowo}%')";
}
$sql .=" GROUP BY adres ORDER BY hits DESC, adres ASC";
echo $sql;
$zapytanie=mysql_query("$sql");
$tab=mysql_fetch_array($zapytanie);//Tutaj pokazuje błąd
echo $array['adres'];
}
Kod: Zaznacz cały
$sql.=" OR (slowo LIKE '%{$slowo}%')";