Strona 1 z 6

Alternatywna wyszukiwarka internetowa PHP + MySQL

: 23 lipca 2007, 18:39
autor: Demerzel
Witam wszystkich. Co prawda nie całkiem potrzebuje pomocy ale chyba niema lepszego miejsca na zamieszczenie tego. Po informacjach o braku prywatności na wyszukiwarkach internetowych odkurzyłem stary pomysł. Wkopiuje tu kod dwóch plików które razem pozwalają utworzyć wyszukiwarkę. Z czasem zamierzam zrobić poprawki i usprawnić to. Tymczasem zapraszam wszystkich znających się na rzeczy do zabawy z tym kodem. Obecnie poszerzam już posiadaną bazę danych stron.Może ktoś posiadający taką możliwość uruchomi nową wyszukiwarkę, poprawianą i rozszerzaną przez wszystkich chętnych...

Kod: Zaznacz cały

<?php
/*TINY web searcher by Demerzel
Jest to prosta przeglądarka bazy MySQL która działa jak wyszukiwarka internetowa. każdy może w dowolny sposób modyfikować kopiować i wykorzystywać ten kod, pod warunkiem pozostawienia powyższej informacji w niezmienionej formie.
*/
$str = <<< EOP
<HTML>
 <HEAD>
 	<TITLE>TINY web searcher</TITLE>
	<meta="Content-type" content="text/html; charset=iso-8859-2">
 </HEAD>
<BODY>
<div align="center">
<H1>TINY web searcher</H1>
 <FORM  ACTION="przegladarka.php" method="POST">
  <input type="text" size="50" name="haslo" value="">

  <input type="submit" value="poszukaj">
 </FORM>
</div>
</BODY>
</HTML>
EOP;
echo $str;
if(isset($_POST['haslo']))//Jeżeli użytkownik podał już słowa do wyszukania
{
	$sql_conn = mysql_connect('localhost', 'root', '');//łączenie z mysql
	$haslo=trim($_POST['haslo']);//ucieńcie początkowej i końcowej spacji
	if (strpos($haslo, " ")==True){//czy spacja między wyrazami
	 $i=0;//zmienne pomocnicze do pentli
	 $j=0;
	 do{
	    $temp1[$j].=$haslo[$i];//przepisanie hasła do tablicy po wyrazie
	    $i++; 
	    if($haslo[$i]==" "){ $i++; $j++;}//jeżeli użytkownik rozdzielił wyrazy spacj¹ następny wyraz wpisany zostaje do kolejnego pola tablicy
	 }while($haslo[$i]!=FALSE);//koniec przepisywania
	}
	else $temp1[0]=$haslo;//utworzenie tablicy temp1 jeżeli jedno słowo
	mysql_select_db('find');//wybranie bazy danych
	echo '<table>'; //początek tablicy
	foreach($temp1 as $key => $value)//pobranie kolejno wszystkich wyrazów
	{
	 $wyraz='\'%'.$value.'%\'';//forma wymagana do zapytania SQL
	 $zapytanie = mysql_query("SELECT * FROM adres WHERE slowa LIKE $wyraz"); //Zapytanie SQL
	 while ($wiersz = mysql_fetch_row($zapytanie))// wiersz[0]=link wiersz[1]=słowa kluczowe 
	 {
	       	$link='http://'.$wiersz[0];
		echo "<tr><td>[b]<a href=$link>". $wiersz[0] .'</a>[/b]</td></tr>';
 		echo '<tr><td>'. $wiersz[1] .'</td></tr>';
         }
	}
	echo '</table>';//koniec tablicy
	mysql_close($sql_conn);//zamknięcie poł¹czenia z baz¹ danych
}
?>

Kod: Zaznacz cały

<?PHP
*/ Robo by Demerzel.
   Jest to bardzo prosta ale skuteczna metoda wyszukiwania i zapisywania stron internetowych do bazy danych.
   Wykonane s¹ następuj¹ce kroki:
	-Generowanie ci¹gu do sprawdzenia jako adres www
	-Wczytanie storny jeżeli taka istnieje
	-Wyszukanie Słów kluczowych z mety
	-Zapis do bazy danych
   Litera w na końcu niektórych zmiennych oznacza jedynie iż są one wykorzystane wewnątrz funkcji
Każdy może w dowolny sposób modyfikować kopiować i wykorzystywać ten kod, pod warunkiem pozostawienia powyższej informacji w niezmienionej formie.
*/	
function katalog($adresw){
	$trescw= file_get_contents($adresw);
	//if(!$trescw) echo'Niema takiej strony 
');
	if (strpos($trescw, 'Keywords')!=FALSE){
	$pozw= strpos($trescw, 'Keywords');
	do{
		$pozw++;
		if( $trescw[$pozw]=='"') $iw++;
	  }while($iw<2);
	$pozw++;
	do
	{
	 $kluczew.=$trescw[$pozw];
	 $pozw++;
	}
	while($trescw[$pozw]!='"');
//	echo $kluczew .'
';
	//echo $adresw .'
';
	$sql_conn = mysql_connect('localhost', 'root', '');//łączenie z mysql
	mysql_select_db('find',$sql_conn);
	$wpis="INSERT INTO adres (link,slowa) VALUES('$adresw','$kluczew')";
	mysql_query($wpis);
	mysql_close($sql_conn);
	$wpis="";
	$kluczw="";
	$adresw="";
	}
}
$litery = array(a,b,c,d,e,f,g,h,i,j,k,l,ł,m,n,o,p,r,s,t,u,w,y,z);
$prefix = "http://www.";
$postfix = ".pl";
$i=0;
$j=0;
$k=0;
$temp="";

	foreach( $litery as $key => $value)
	{ 	echo '<H1>BEGINING</H1>';	
		$ciag=$value;
		$adres=$prefix.$ciag.$postfix;
		katalog($adres);
		foreach( $litery as $key2 => $value2)
		{       $ciag2=$ciag;
			$ciag2.=$value2;
			$adres=$prefix.$ciag2.$postfix;
			katalog($adres);
			foreach( $litery as $key3 => $value3)
			{
				$ciag3=$ciag2;
				$ciag3.=$value3;
				$adres=$prefix.$ciag3.$postfix;
				katalog($adres);
				foreach( $litery as $key4 => $value4)
				{
					$ciag4=$ciag3;
					$ciag4.=$value4;
					$adres=$prefix.$ciag4.$postfix;
					katalog($adres);
				}
			}
		}
	}

?>

: 23 lipca 2007, 19:05
autor: Ventrue
Jak już coś, to rozbij $postfix na tablicę wieloelementową - bo niby dlaczego tam miałoby być tylko .pl? :idea:
Tak samo, zamiast ciągle definiować

Kod: Zaznacz cały

$sql_conn = mysql_connect('localhost', 'root', '');//łączenie z mysql
    mysql_select_db('find',$sql_conn); 
zrobiłbyś coś na zamysł pliku config.php i potem includowanie go, z zawartością np.

Kod: Zaznacz cały

$host = localhost;
$user = uzytkownik;
$pass = haselko;
$baza_danych = moja_baza_danych;
A potem tak jak korzystasz z $sql_conn. To o wiele wygodniejsze rozwiązanie :-)

No i może zamiast ISO-8859-2 przejść na UTF-8 ? ;-)

Oczywiście mógłbyś też poprawić błędy językowe -
//if(!$trescw) echo'Niema takiej strony
');
"Niema" piszemy osobno :evil:

Pozdrawiam :-)

: 23 lipca 2007, 19:13
autor: Demerzel
Musze dodać jedną rzecz.Pod wieloma względami pisząc te skrypty upraszczałem i skracałem. Z wielu rzeczy zdaje sobie sprawę. Tym niemniej dziękuje za wszystkie rady. Mam również nadzieje że ktoś to naprawdę podchwyci i będzie chciał nad tym popracować aby zrobić wyszukiwarkę z prawdziwego zdarzenia. Szybką nie ograniczającą prywatności, nie robioną dla pieniędzy ale dla przyjemności.

: 23 lipca 2007, 19:31
autor: jang
Demerzel pisze:Musze dodać jedną rzecz.Pod wieloma względami pisząc te skrypty upraszczałem i skracałem.
£ącząc się co chwilę, jak to już zauważył Ventrue z bazą danych ?
Demerzel pisze:Mam również nadzieje że ktoś to naprawdę podchwyci i będzie chciał nad tym popracować aby zrobić wyszukiwarkę z prawdziwego zdarzenia.
Demerzel pisze:Każdy może w dowolny sposób modyfikować kopiować i wykorzystywać ten kod, pod warunkiem pozostawienia powyższej informacji w niezmienionej formie.
a Ty zostaniesz jej autorem ?
Możesz być pewien że jeśli komuś coś takiego będzie potrzebne to napisze ją sobie sam na pewno nie wzorując się na tym cudzie techniki.
Demerzel pisze:$prefix = "http://www."]Spróbuj dodać do tego linka -> http://pl.help-eu.com/pages/thm-aide-2-13-SUPPORT.html swoje www

Pozdrawiam

--------------------------------------------------------------------

Ventrue przepraszam

---------------------------------------------------------------------

: 23 lipca 2007, 19:43
autor: Ventrue
jang, ventrue ;-)
UPDATE: No problem, wszyscy mylą :-)
jang pisze:Spróbuj dodać do tego linka -> http://pl.help-eu.com/pag...13-SUPPORT.html swoje www
I otrzymamy bardzo ładny wynik nie przemyślanego rozwiązania :mrgreen:
Demerzel, dopracuj jescze swój skrypt, a może wyjśc z tego coś naprawdę fajnego :)

: 23 lipca 2007, 19:55
autor: Demerzel
Tak łączy i rozłancza się co chwila z bazą. Było to ominięcie pewnego dziwnego problemu w trakcie wykonywania zapytania do bazy. Obecnie można to po przesuwać..Chwilowo robiłem to sam. Jak ktoś zechce jakiś fragment sam przepisać będzie równie mocno autorem jak ja. Z czasem sam to wygładzę i dopracuje jednak na pewno będzie to dłużej trwało niż dzieląc na funkcje i robiąc jedynie pewne fragmenty.

: 23 lipca 2007, 20:53
autor: jang
Demerzel pisze:Z czasem sam to wygładzę i dopracuje jednak na pewno będzie to dłużej trwało niż dzieląc na funkcje i robiąc jedynie pewne fragmenty.
Możesz po polsku ? To że Ty wiesz o co chodzi to nie znaczy, że każdy czytający również.
Demerzel pisze:

Kod: Zaznacz cały

$trescw= file_get_contents($adresw)][/quote] Wiesz do czego służy ta funkcja ? bo ja jestem pewien że nie ! i to na 1000%
[url]http://pl2.php.net/file_get_contents[/url]
[url]http://www.gajdaw.pl/php/plikiwphp2.html[/url]

Proponuję abyś zanim zaczniesz ulepszać ten swój skrypt zaczął uczyć się PHP i to najlepiej od razu PHP5 bo z końcem tego roku prace nad PHP4 dobiegną końca.

Pozdrawiam

: 23 lipca 2007, 21:10
autor: Demerzel
Tak kolego jang wiem jak działa wymieniona przez Ciebie funkcja. Bardzo dobrze się sprawdza w miejscu w którym jest. Zważywszy że następna metoda zapisu stron ma się opierać na rekurencyjnym przechodzeniu po linkach z jednej strony na drugą konieczne będzie wczytanie całej strony.

jang napisał/a:
Możesz po polsku ?
Powiem to w języku dla przedszkolaków. Dwie osoby mogą więcej niż jedna. Sam skrypt zapisujący strony do bazy MySQL można spokojnie podzielić na 3 funkcje z których każda mogła by być pisana osobno. Tego co tutaj jest też nie pisałem w całości ale w fragmentach które sprawdzałem i złożyłem.

: 24 lipca 2007, 02:21
autor: Stawi
Pomysl ciekawy, ale raczej jest to tzw. "prove of concept" niz cos uzytecznego z wielu powodow, o ktorych nie bede sie rozpisywac, chyba ze ktos poprosi.
A co do samego skryptu, to niestety/stety musze sie troszke powymadrzac/podzielic wiedza:

- Znaczniki HTMLa pisze sie malymi literkami, mozna ostatecznie duzymi, ale juz wszystkie a nie tylko niektore.
- Przed <html> powinno byc DOCTYPE
- zamykasz html a potem robisz tabelke... troszke nieladnie.
- ustawienia mysql na logowanie roota bez hasla nie sa dobre. Wiem ze to tylko dla polaczen lokalnych jednak...
- trim() obcina "poczatkowe i koncowe spacje" - liczba mnoga, nie wiem czy blad w komentarzu czy w rozumieniu
- strpos(...)==True -> oj brzydkie, powinno byc bez "== True" bo robi to samo, a dwa ze "true" powinno byc malymi pisane
- tablica $temp1 niedosc ze ma malo mowiaca nazwe (a jest uzywana w pilku miejscach) to w dodatku powinna zostac zainicjalizowana jaki array.
- rodzielanie hasel na wyrazy - w koncowym while powinno byc '\0' a nie FALSE - taki detal, a dwa, mozna to wszystko zrobic za pomoca funkcji explode(' ', $haslo)
- ogolnie zamiast tego calego expolode itd, mozna uzywac indexow full text ktore roba duzo fajnych rzeczy http://dev.mysql.com/doc/refman/5.0/en/ ... earch.html
- "SELECT *" nie jest uznawane za dobra praktyke, jednak mysle ze tutaj nie robi zadnych problemow
- Zamiast mysql_fetch_row() polecam mysql_fetch_array() albo mysql_fetch_assoc() wtedy nie musisz pamietac ktora kolumna jest ktora, bo mozesz sie odwolac $wiersz['nazwa_kolumny']
- jak wpiszesz "biale czarne" to wyswieli wszystkie strony ktore maja slowa kluczowe "biale" LUB "czarne" powinno byc raczej I

Drugiego mi sie nei chce analizowac, ale tak na szybko to te literki powinny byc w cudzyslowiach bo tak to sa traktowane jako stale.
Demerzel pisze:Mam również nadzieje że ktoś to naprawdę podchwyci i będzie chciał nad tym popracować aby zrobić wyszukiwarkę z prawdziwego zdarzenia. Szybką nie ograniczającą prywatności, nie robioną dla pieniędzy ale dla przyjemności.
Prawde mowiac jak mialbym robic cos takiego to by wygladalo zupelnie inaczej, wiec nie ma co podchwytywac tylko raczej pisac od nowa calosc - bez urazy ;)
Wyszukiwarka z prawdziwego zdarzenia = kilku dobrych programistow + kupa czasu. Wez przyklad z microsoftowego Live search.. jakos nie mam do niego szczescia, moze dlatego ze tylko pare razy w nim szykalem ale nigdy nie znalazl mi tego co chialem. Szybka to nie bedzie, bo serwerek domowy zdechnie przy kilku milionach wpisow i bedzie szukac parenascie sekund, pieniedzy i tak z tego by nie bylo bo jest zaduza konkurencja, a przyjemnosc, przynajmniej jak dla mnie znikoma i wole juz ze google wie jakiego pornola szukam niz zebym mial pisac wlasna, ktora mi zje kilka/kilkaset giga z dysku i nie znajdzie polowy rzeczy ktorych szukam bo nie jest w stanie aktualizowac sie tak czesto jak inne - googlebot pracuje nonstop na laczach o jakim nam sie tylko sni i mimo to nie zawsze jest super aktualny. Jak mam byc szczery to mnie wali to ze google wie czego szukam, bo zapewne nic nie robi z tego wiecej niz ze mi reklame odpowiednia wyswietli ktora i tak ADblock mi wywali.

Co polecam bardziej niz cos takiego - katalog stron, ale taki naprawde fajny i dobry, cos moze w stylu del.icio.us ale np. do zastosowan przywatnych / rodzinnych / grupy znajomych a nie kilku milionow uzytkownikow ;)
Oczywiscie mozna calkowicie odbiec od indeksowania www i zrobic cos zupelnie innego. Nie obrazajac cie, twoj poziom PHP jest dosyc niski i zabieranie sie za wielkie projekty czesto konczy sie zrazeniem i rzuceniem tego wszystkiego w kat. Zacznij jakies proste, ale dobre i dokladne projekty. Nic na odwal sie, dokladne komentowanie nawet oczywistych rzeczy, podzial na funkcje / klasy (zalezy kto co woli) dynamizm, elastycznosc, zgodnosc z standardami zarowno pisania w PHP jak i standardami wyswietlania strony w HTML+CSS. Jak do tego dorzucisz troszke javascriptu, a najlepiej w postaci AJAX to nawet "debilna" ksiazka teleadresowa / katalog CD / katalog mp3 / terminarz bedize NAPRAWDE lepsza i bardziej uzyteczna rzecza jaka zrobisz i moge sie teraz zalozyc ze bedziesz zadowolony bo masz 99% szans na skonczego tego.
Wiem ze tez sa takie projekty na rynku oparte na tym wszystkim co mowie, albo jako aplikacje darmowe i z kodem zrodlowym ale tu chodzi o zabawe i radosc z tworzenia tak? Pozatym czasem jest tak ze na 5 programow kazdy opcje ktorej brakuje w innych i mozna sobie zrobic cos wylacznie pod siebie a moze i komus innemu sie tez spodoba ;) Wiec bez tego typu jeczenia mi tu..

Z gory przepraszam jesli poczules sie urazony moim postem, jesli wylalem ci troche zimnej wody na glowe. Nie mowie ze to jest calkowicie debilny pomysl czy cos, ale wiem ile czasu cos takiego moze pochlonac i ze i tak bedziesz googlowac dalej ;) Zebys poczul sie lepiej powiem ze ja nie jeden WIELKI projekt mam za soba i oczywisice wszystkie leza i sie kurza bo nie bylo szans zrobic ich chociaz w 1/1000 tak dobrych jak inne juz gotowe.

: 24 lipca 2007, 16:36
autor: Demerzel
Chociaż nie ze wszystkim co powiedziałeś Stawi się zgadzam to na pewno nie czuje się urażony. Robiłem wcześniej strony HTML+CSS. Prawdę mówiąc wszystkie wcześniejsze skrypty PHP mieściły się w kilku linijkach, także to była pierwsza większa rzecz jaką napisałem w PHP. Co do wymienionych rad to dziękuje za zrobienie listy o 2czy 3 punktach z niej nawet nie pomyślałem. Wygląda na to iż w miarę posiadanego czasu sam będę dalej to rozwijał. Napisanie lepszych wersji z pewnością zajmie więcej niż parę godzin. Następnej wersji pewnie nie podam szybko ale jak będzie gotowa znów poddam ją pod krytykę. Co do robienia mniejszych projektów. Aby się uczyć najlepiej robić rzeczy przekraczające dotychczasową wiedzę.
Obecnie uruchamiałem to na PIII 700Mhz przy bazie prawie 400stron internetowych i obciążeniu procesora przez BOINC przeszukanie bazy było niemal niezauważalne. Po wysłaniu zapyta niemal jednocześnie pokazały się wyniki. Przeglądarka była uruchomiona na innym komputerze w sieci lokalnej.
Stawi skoro masz za sobą nie jeden WIELKI projekt który leży może przyłączysz się do kolejnego który ma marne szanse? ;-) A nuż z czasem urośnie do czegoś lepsze niż obecnie wykorzystywane programy. Jeżeli ktoś uważa że to niemożliwe niech zapamięta powiedzonko. "Rzeczy niemożliwe tylko trwają dłużej". ;-)