Strona 2 z 6

: 25 lipca 2007, 12:02
autor: Stawi
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.

: 25 lipca 2007, 16:18
autor: Demerzel
Robienie małych kółeczek nie jest tak zabawne jak jazda bez trzymanki :-D . Kiedy zamieszczę coś lepszego będę wyczekiwał Twojego komentarza kolego Stawi :-). Pozdrawiam i biorę się do pracy.

: 27 lipca 2007, 17:59
autor: Stawi
Zebys tylko zebow nie powybijal ;) ) A powaznie to zycze powodzenia i czekam z niecierpliwoscia na wyniki, google jako startowa juz mnie troszke drazni czas na cos nowego ;) )

: 27 lipca 2007, 22:12
autor: Demerzel
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.

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);
Rzecz jasna nawet rozwiązanie tego problemu to tylko fragment. Do dalszej części to musi działać.

: 28 lipca 2007, 08:07
autor: jang

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();
http://php.net.pl/manual/pl/ref.array.php#63802

: 29 lipca 2007, 02:32
autor: Stawi
Nie jestem pewien czy dobrze zalapalem co to ma robic ale bym zrobil tak:

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

: 29 lipca 2007, 22:48
autor: Demerzel
Niestety mam problem z ugryzieniem komendy

Kod: Zaznacz cały

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

: 29 lipca 2007, 23:44
autor: Stawi
Demerzel pisze:wyrzuca błędy albo robi zrzut nie wiadomo gdzie
Najczesciej robi zrzut na ekran :)

Kod: Zaznacz cały

mysqldump -u USER -pHASLO -B baza1 baza2
jak nie podasz hasla jako w parametrze (co jest zalecane) to grzecznie o nie zapyta. jak nie podasz wogole "-p" to uzna ze haslo nie jest wymagane. Bez "-B ..." robi zrzut wszystkiego o ile dobrze pamietam defaultowe zachowanie.

A co do kodu, to mniejwiecej tak zrozumialem i mniejwiecej tak to dziala ;) Sprawdz.

: 30 lipca 2007, 11:39
autor: Demerzel
Zrzut taki otrzymałem tą komendą ale podprowadziłeś mnie Stawi na to czego było mi brak.

Kod: Zaznacz cały

 mysql -u root -B nauka >> plik
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)

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'];
        }
Dodam załącznik z bazą

: 30 lipca 2007, 11:44
autor: Ventrue

Kod: Zaznacz cały

 $sql.=" OR (slowo LIKE '%{$slowo}%')"; 
Tutaj żeś się ze spacją walnął (przy "=")