Skocz do zawartości
Michael2318

[PHP/MySQL] Wyszukiwarka

Polecane posty

Michael2318

W tym poradniku pokażę jak zrobić wyszukiwarkę (strona praktyczna) oraz jak ona dokładnie działa (strona teoretyczna).

Część teoretyczna:

Wyszukiwarka najczęściej służy nam do przeszukiwania danych w bazie, za pomocą krótkiej frazy. Teksty, które zawierają daną frazę zostają wyświetlone.

Od strony SQL'a, w przeszukiwaniu bazy pomoże nam instrukcja LIKE. Przykłady:

SELECT `username` FROM `users` WHERE username LIKE "%nazwa";

Zwrócone zostaną nicki, które na początku zawierają frazę nazwa, czyli przykładowo będzie to nick: nazwatak.

SELECT `username` FROM `users` WHERE username LIKE "%nazwa%";

Zwrócone zostaną nicki, które w środku zawierają frazę nazwa, czyli przykładowo będzie to nick: testnazwatak.

SELECT `username` FROM `users` WHERE username LIKE "nazwa%";

Zwrócone zostaną nicki, które na końcu zawierają frazę nazwa, czyli przykładowo będzie to nick: testnazwa.

SELECT `username` FROM `users` WHERE username LIKE "n%a";

Zwrócone zostaną nicki, które zaczynające się na literę n, a kończą na literę a czyli będzie to nick po prostu nazwa.

Jak widać, znak procenta (%) oznacza dowolny ciąg znaków, co pomaga dokładnie przeszukać bazę danych pod względem wskazanej frazy :)

Część praktyczna:


Pokażę tutaj jak zrobić wyszukiwarkę, która będzie przeszukiwała użytkowników pod względem nicku (oczywiście będzie to łatwo podpiąć pod mój poradnik dot. "logowania i rejestracji na sesjach", bo to na nim właśnie będę bazował ;) ).

No więc, zaczynajmy.

Najpierw połączymy się z bazą danych - uzupełniamy hosta, nazwę użytkownika bazy danych, hasło oraz nazwę bazy danych:

<?php 

/* Połączenie z bazą danych */ 
mysql_connect('host', 'user', 'password') 
       or die('Could not connect to database'); 
mysql_select_db('database_name') 
       or die('Could not select database'); 
/* Połaczenie z bazą danych */

Następnie krótka konfiguracja. Określamy, ile słów maksymalnie użytkownik może wpisać do naszej wyszukiwarki oraz maksymalną długość całej frazy:

/* Konfiguracja */ 
$max_words = 5; // maksymalna liczba słów 
$max_length = 50; // maksymalna długość całej frazy 
/* Konfiguracja */

W kolejnym kroku tworzymy formularz, czyli pole do wpisania frazy oraz button "submit" do przeszukania bazy pod względem danej frazy:

if ( !isset($_POST['submit']) ) 
{ 
   $body = '<h1>Wyszukiwarka użytkowników by Michael2318</h1><br><br> 
   <form action="search.php" method="post"> 
   Fraza nicku <span style="color: red; font-weight: bold;">*</span> <input type="post" style="width: 200px;" name="fraza" maxlength="'.$max_length.'"><br> 
   <input type="submit" name="submit" value="Szukaj"> 
   </form><br><br> 
   <span style="color: red; font-weight: bold;">*</span> - znak gwiazdki (<b>*</b>) zastępuje dowolny ciąg znaków.'; 
    
   echo $body; 
}

Teraz już trochę więcej roboty :) Usuwamy z frazy spacje z początku i z końca (jeśli istnieją), zabezpieczamy ciąg znaków (czyli frazę) funkcją mysql_escape_string()/span> (o niej i zabezpieczaniu się przed atakami SQL INJECTION TUTAJ) zliczamy ile we frazie występuje spacji (czyli innymi słowy - ile użyto słów) i dodajemy warunek - jeśli użyto więcej słów niż zezwolono (patrz, wcześniej wspominałem o konfiguracji - tam ustawiamy maksimum) to wypluwamy błąd:

else 
{ 
   $search_words = trim($_POST['fraza']); 
   $search_words = mysql_escape_string($search_words); 
   $count_words = substr_count($search_words, ' '); 
    
   if ( ($count_words + 1) > ($max_words) ) 
   { 
       echo "Użyłeś za wiele słów"; 
       exit; 
   }

Teraz zamieniamy wszystkie gwiazdki we frazie na znak procenta i wykonujemy zapytanie do bazy danych, które przeszuka nam nicki użytkowników pod względem wskazanej frazy. Zliczamy też ilość zwróconych rekordów przez SQL:

   $search_words = str_replace("*", "%", $search_words); 
    
   $sql = "SELECT * FROM `users` WHERE username LIKE '".$search_words."'"; 
   $result = mysql_query($sql) 
       or die('error in search information about users'); 
   $num = mysql_num_rows($result);

Jeśli ilość zwróconych rekordów jest równa 0 to wyświetlamy błąd, że nic nie znaleziono:

   if ( $num == 0 ) 
   { 
       echo "Nie znaleziono pasujących."; 
       exit; 
   }

w przeciwnym razie (czyli jeśli coś znaleziono) wyświetlamy nicki użytkowników, którzy spełnili podane kryterium odnośnie przeszukiwanych nicków pod względem podanej frazy:

   else 
   { 
       while($row = mysql_fetch_assoc($result)) 
       { 
           $body_search .= $row['username'].'<br>'; 
       } 
       $body = '<h1>Znaleziono '.$num.' użytkowników pasujących do podanej frazy</h1><br><br>'.$body_search.''; 
       echo $body; 
   } 
} 

?>

To wszystko. Plik należy zapisać jako search.php, w przeciwnym razie w formularzu należy zmienić nazwę tego pliku.

Cały gotowy kod:

<?php

/*  
	Skrypt wyszukiwarki napisany przez: Michael2318
	Strona autora: http://michael2318.pl/
	Forum - support: http://michael2318.pl/forum
	
	Zabraniam rozpowszechniania tego skryptu bez mojej zgody
*/

/* Połączenie z bazą danych */
mysql_connect('host', 'user', 'password')
        or die('Could not connect to database');
mysql_select_db('database_name')
        or die('Could not select database');
/* Połaczenie z bazą danych */

/* Konfiguracja */
$max_words = 5; // maksymalna liczba słów
$max_length = 50; // maksymalna długość całej frazy
/* Konfiguracja */

if ( !isset($_POST['submit']) )
{
	$body = '<h1>Wyszukiwarka użytkowników by Michael2318</h1><br><br>
	<form action="search.php" method="post">
	Fraza nicku <span style="color: red; font-weight: bold;">*</span> <input type="post" name="fraza" style="width: 200px;" maxlength="'.$max_length.'"><br>
	<input type="submit" name="submit" value="Szukaj">
	</form><br><br>
	<span style="color: red; font-weight: bold;">*</span> - znak gwiazdki (<b>*</b>) zastępuje dowolny ciąg znaków.';
	
	echo $body;
}
else
{
	$search_words = trim($_POST['fraza']);
	$search_words = mysql_escape_string($search_words);
	$count_words = substr_count($search_words, ' ');
	
	if ( ($count_words + 1) > ($max_words) )
	{
		echo "Użyłeś za wiele słów";
		exit;
	}
	
	$search_words = str_replace("*", "%", $search_words);
	
	$sql = "SELECT * FROM `users` WHERE username LIKE '".$search_words."'";
	$result = mysql_query($sql)
		or die('error in search information about users');
	$num = mysql_num_rows($result);
	if ( $num == 0 )
	{
		echo "Nie znaleziono pasujących.";
		exit;
	}
	else
	{
		while($row = mysql_fetch_assoc($result))
		{
			$body_search .= $row['username'].'<br>';
		}
		$body = '<h1>Znaleziono '.$num.' użytkowników pasujących do podanej frazy</h1><br><br>'.$body_search.'';
		echo $body;
	}
}

?>

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość
Temat jest zablokowany i nie można w nim pisać.
×
×
  • Utwórz nowe...