Vyhľadávač v PHP a MySQL 1.

23. října 2002

Na stránkach môžete pomerne často natrafiť na vyhľadávače, ktoré vyhľadávajú z databázi určité články alebo adresy. V tejto minisérii článkov sa dozviete, ako si spraviť taký jednoduchý vyhľadávač, ktorý pri správnom využití kaskádových štýlov môžete pomerne jednoducho vložiť do hotovej stránky.

Celá séria sa skladá z troch článkov, v prvom si vytvoríme vyhľadávač s jeho základnými prvkami. Náročnejší si určite radi prečítajú i druhú časť, v ktorej popíšem tvorbu odkazov na všetky strany naraz (1, 2, 3, … 15), formulár na napísanie čísla strany a dodatočný formulár pre vyhľadávanie. V tretej časti si vytvoríme štatistiku vyhľadávaní, kde budete mať prehľad, aké slová sú najčastejšie vyhľadávané a tak ďalej.

Ako to funguje

Vyhľadávače nevypisujú všetky nájdené údaje na jednu stranu. Pokiaľ ich je veľa, stránka by sa načítala veľmi pomaly. Preto ich vypíše napríklad po desiatich odkazoch a rozdelí na strany. Ukáže vám počet strán a číslo strany, na ktorej sa práve nachádzate. Tak isto vám ukáže počet nájdených záznamov a pokiaľ ich je viac ako dovoľuje zobraziť na jednej strane, tak vytvorí odkaz na zobrazenie ďalších alebo predošlých strán. V našom vyhľadávači si okrem tohto môžete priamo kliknúť na číslo stránky, na ktorú chcete ísť. K dispozícii máte formulár, kde si číslo strany môžete napísať a prejsť na ňu. Dodatočný formulár bude umožňovať výber databázy alebo niektorej podmienky, pre ktorú sa bude vyhľadávať a výber položky, podľa ktorej budú výsledky zoradené.

Pre prehľad si najprv stručne opíšeme všetky stránky:

  • db.php – pripojenie k databáze
  • vytvor_tabulku.php – vytvorenie skúšobnej tabuľky na údaje pre tento príklad
  • vyhladavac.php – samotný vyhľadávač

Vytvorenie databázovej tabuľky (vytvor_tabulku.php)

Vyhľadávať môžete prakticky čokoľvek. Podstatné je, aby sa to nachádzalo v databáze. Pre náš vyhľadávač môžeme použiť napríklad vyhľadávanie internetových stránok. Preto si vytvoríme jednu jednoduchú tabuľku. Tabuľka bude obsahovať položky:

  • ID – identifikačné číslo stránky
  • Nazov – názov stránky
  • URL – adresa stránky
  • Popis – popis stránky
  • Kde – krajina (napr. sk – Slovensko, cz – Česká republika)
  • Datum – kedy bola stránka pridaná do databázy

Primárnym kľúčom je ID, ktoré je pri každej stránke v databáze rozdielne. Aby ste ho vždy nemuseli zadávať, môže obsahovať hodnotu auto_increment, ktorá ho pri každom novom zázname automaticky zvýši o 1. Text, ktorý sa zadá do vyhľadávacieho formulára sa bude vyhľadávať v položkách Nazov a Popis. Ešte raz pripomínam, že pre vyhľadávač môžete vytvoriť akúkoľvek tabuľku a môžete vyhľadávať akékoľvek údaje. Táto tabuľka slúži len pre ukážku a lepšie pochopenie tohto príkladu.

require „db.php“; // otvorí databázu
$vytvor_tabulku = MySQL_Query(„CREATE TABLE vyhladavac(
ID int DEFAULT ‚0‘ NOT NULL auto_increment,
Nazov varchar(100),
URL varchar(255),
Popis varchar(255),
Kde varchar(3),
Datum datetime,
PRIMARY KEY(ID))“) or die(„Tabulku sa nepodarilo vytvoriť“); // vytvorí tabuľku

Súbor db.php obsahuje údaje pre pripojenie k databázi. Tieto údaje treba zmeniť podľa vlastných potrieb:

$server = “localhost“; // meno serveru
$login = ““; // prihlasovacie meno
$heslo = ““; // heslo
$databaza = “test“; // názov databáze
MySQL_Connect($server, $login, $heslo)
or die(“Nepodarilo sa pripojiť k databáze”); // pripojenie k databáze
MySQL_Select_DB($databaza)
or die(“Nepodarilo sa otvoriť databázu“); // výber databáze

Do databázy vložíme nejaké údaje, tie tu vypisovať nebudem, záleží len na vás, čo do nej vložíte. Môžem však predviesť príklad:

INSERT INTO vyhladavac VALUES(‘’, ‘Interval.cz’, ‘http://www.interval.cz’, ‘Programovanie, grafika, tvorba stránok…’, ‘cz’, ‘2002-08-29 17:32:15’);

V našom vyhľadávači sa formulár na hľadanie bude objavovať na každej strane. Takto sa dá jednoducho začať nové hľadanie. Použité kaskádové štýly tu opisovať nebudem, lepšie si ich môžete pozrieť na stránke vyhladavac.php. Keďže ich nieje až tak veľa, tak nie sú oddelené do samostatného súboru. Ako som spomínal, záznamy sa budú vypisovať po desiatich odkazoch. Tento efekt dosiahneme príkazom LIMIT, ktorý sa vpisuje do časti SELECT * FROM... LIMIT $od, $do. Limit je obmedzený dvoma číslami, ktoré sa uchovávajú v premennej. Tieto premenné ($od, $do) sa menia pri prechode na každú nájdenú stranu. Preto sme v skripte vytvorili podmienky, ktoré určujú veľkosť týchto premenných. Ich hodnota sa určuje na základe hodnoty, ktorú obsahuje premenná $strana. Na prvej nájdenej strane túto premennú sami vytvoríme s  hodnotou 1. Je vytvorená podmienka:

if($strana==1 && $pocet_stran>1):
$od = „0“;
$do = „10“;

V premennej $pocet_stran je uchovaná hodnota počtu strán. Táto podmienka platí len v prípade, že strán je viacej. Pokiaľ je strana len jedna, znamená to, že počet nájdených záznamov môže byť menší ako 10. V takomto prípade nemôžeme nechať vypísať desať záznamov a vytvoríme ďalšiu podmienku, ktorá zaistí ich limit:

elseif($pocet_stran==1 && $strana==1):
$od = „0“;
$do = $pocet;

V premennej $pocet pritom uchovávame celkový počet nájdených záznamov. Limit nám zaručí vypísanie nájdených záznamov od 0 po ich celkový počet, ktorý je pri tejto podmienke menší alebo rovný 10. Na ďalšej strane už premenná $strana nesie hodnotu 2 alebo viacej. Naša ďalšia podmienka preto vyzerá takto:

elseif($strana<=$pocet_stran && $zvysok==0):
$od = $strana*10-10;
$do = $strana*10;

Premennú $zvysok vypočítame $zvysok = $pocet%10 a pokiaľ celkový počet nájdených záznamov má pri delení desiatimi nejaký zvyšok, tak táto premenná ho obsahuje. Je to samozrejme i v prípade, že je zvyšok nula. Táto podmienka vychádza z toho, že sme na ktorejkoľvek strane, ale zvyšok sa musí rovnať nule. Tak ako na prvej strane, tak ani na poslednej nemôžme nechať vypísať desať záznamov, keď ich zostáva napríklad len deväť. Pri nulovom zvyšku však môžeme. Premenná $strana obsahuje hodnotu, ktorá sa vynásobí desiatimi. Tak získavame limit $do. Samozrejme, potom $od musí byť $do-10, keďže vyhľadávame záznamy po desiatich. Predposledná podmienka vyzerá takto:

elseif($strana<$pocet_stran && $zvysok!=0):
$od = $strana*10-10;
$do = $strana*10;

Je to prakticky veľmi podobné, lenže tu sa zvyšok nerovná nule a strana, na ktorej sa nachádzate nesmie byť posledná. Posledná podmienka je určená pre poslednú stranu pri nenulovom zvyšku:

elseif($strana==$pocet_stran && $zvysok!=0):
$od = $strana*10-10;
$do = $strana*10-BCSub(10, $zvysok);

Funkcia BCSub() odráta druhé číslo od prvého a vráti výslednú hodnotu. V tomto prípade sme ju využili na vypočítanie počtu nájdených záznamov odčítaním zvyšku od desiatich.

Funkciu MySQL_Query v našom vyhľadávači použijeme pre vyhľadávanie až dva krát. Prvý krát iba zistíme počet nájdených záznamov ($pocet). Z toho odvodíme počet strán, zvyšok a tiež limit. Druhý krát už vyhľadávame konkrétne záznamy v rozsahu. Pokiaľ je $pocet väčší ako nula, vypíšu sa nájdené údaje. Potom je potrebné vytvoriť odkazy na ostatné strany. V tejto časti si popíšeme iba tvorbu odkazov na ďalšiu a predchádzajúcu stranu. Odkaz na ďalšiu stranu zobrazuje aj počet záznamov, ktoré nás na druhej strane čakajú. Na poslednej ich môže byť menej ako desať. V odkaze musíme prenášať všetky údaje, ktoré sú vyplnené vo formulári. Musia obsahovať názvy polí vo formulári a tiež ich hodnoty. Celý odkaz bude vyzerať napríklad takto: vyhladavac.php?strana=$kolko_stran&slovo=$slovo.... V ďalšom článku bude údajov pre vyhľadávanie viacej. Vyhľadávač môže robiť „problémy“ v prípade, že zabudnete do odkazu napísať všetky premenné s ich hodnotami. Musia byť napísané až dva krát. Prvý krát v odkaze „Ďalšie záznamy“ a druhý krát v odkaze „Predchádzajúce záznamy“, keďže sa chceme vrátiť i späť.

Celý skript vyzerá takto:

<!– začiatok formuláru –>
<form action=“vyhladavac.php“ method=“get“>
<div class=“normal“>
<!– čo budeme vyhľadávať –>
Vyhľadať:
<input name=“slovo“ class=“textinput“>
&nbsp;
<!– potvrdíme vyhľadávanie –>
<button type=“submit“ class=“button“>Hľadaj</button>
</div>
</form>
<!– koniec formuláru –>
<hr size=“1″ color=“black“>
<!– čiara, ktorá oddeľuje formulár od nájdených záznamov –>
<?php
if($slovo != „“ && $slovo != “ „): // vyhľadávať sa začne pod podmienkou, že existuje slovo pre vyhľadávanie a nesie aj nejaké rozumnú hodnotu
   require „db.php“ // pripojíme sa k databáze
   $result = mysql_query(„SELECT * FROM vyhladavac WHERE (Nazov like ‚%$slovo%‘) OR (Popis like ‚%$slovo%‘)“); // zistíme počet nájdených záznamov
   $pocet = mysql_NumRows($result); // počet uchovávame v premennej
   $zvysok = $pocet%10; // zistíme zvyšok pri delení desiatimi
   // vypočítame celkový počet strán
   if($zvysok!=0): $pocet_stran = BCDiv($pocet, 10)+1;
   else: $pocet_stran = BCDiv($pocet, 10);
   endif;
   if(IsSet($strana) && $strana>$pocet_stran): die(„Táto strana neexistuje!“); // ak sme sa dostali na stranu väčšiu, ako je možné
endif;
if(Empty($strana) || !$strana) $strana = 1; // ak neexistuje premenná $strana, tak ju vytvoríme a dáme jej hodnotu 1
   if($pocet > 0) echo „<div align=\“center\“ class=\“normal\“>($strana/$pocet_stran)</div>“;
   // ak sú nejaké nájdené záznamy, tak pre orientáciu vypíšeme číslo strany, na ktorej sa nachádzame a celkový počet strán
   echo „<div class=\“normal\“>Hľadám slovo \“$slovo\“</div><br>“;
   // napíšeme názov hľadaného slova
   echo „<div class=\“normal\“>Počet nájdených záznamov: $pocet</div><br><br>“;
   // vypíšeme počet nájdených záznamov
   if($pocet > 0): // ak je počet väčší ako nula, tak ideme ďalej
      if($strana==1 && $pocet_stran>1): $od = 0;
      $do = 10;
      // ak $strana je prázdna a počet strán je väčší ako 1
   elseif($pocet_stran==1 && $strana==1):
      $od = 0;
      $do = $pocet;
      // ak je len jedna strana a na nej sa práve nachádzame
   elseif($strana<=$pocet_stran && $zvysok==0):
      $od = $strana*10-10;
      $do = $strana*10;
      // ak je strana menšia alebo rovná počtu strán a zvyšok je nula
   elseif($strana<$pocet_stran && $zvysok!=0):
      $od = $strana*10-10;
      $do = $strana*10;
      // ak je strana menšia ako počet strán a zvyšok sa nerovná nule
   elseif($strana==$pocet_stran && $zvysok!=0):
      $od = $strana*10-10;
      $do = $strana*10-BCSub(10, $zvysok);
      // ak sme na poslednej strane a zvyšok sa nerovná nule
   endif; // koniec podmienky
   $vysledok = mysql_query(„SELECT * FROM vyhladavac WHERE (Nazov like ‚%$slovo%‘) OR (Popis like ‚%$slovo%‘) LIMIT $od,$do“);
   // získali sme potrebné údaje z databázi
   $novy_pocet = BCSub($do, $od);
   // vypočítame nový počet, podľa ktorého budeme vypisovať nájdené záznamy (odčítavame $do – $od)
   echo „<table>“;
   // vytvoríme začiatok tabuľky
   for($i=0;$i<$novy_pocet;$i++):
      $nazov = MySQL_Result($vysledok, $i, „Nazov“);
      $url = MySQL_Result($vysledok, $i, „URL“);
      $popis = MySQL_Result($vysledok, $i, „Popis“);
      echo „<tr><td><div class=\“big\“><a href=\“$url\“><b>$nazov</b></a></div></td></tr>“;
      echo „<tr><td><div class=\“small\“><a href=\“$url\“><i>$url</i></a></div></td></tr>“;
      echo „<tr><td width=\“700\“><div class=\“normal\“>$popis</div></td></tr>“;
      echo „<tr><td height=\“10\“></td></tr>“;
      // vypísali sme záznamy do požadovaného formátu
   endfor;
   echo „</table>“; // vytvoríme koniec tabuľky
endif; // koniec podmienky
if($strana==1): $kolko_stran = 2; // akú hodnotu bude mať ďalšia strana?
else: $kolko_stran = $strana+1;
endif;
$kolko_stran2 = $strana-1; // akú hodnotu mala predchádzajúca strana?
// vypočítame, koľko odkazov bude na ďalšej strane (môže ich byť napr. iba 6)
$odkaz2 = $strana*10;
$odkaz = BCSub($pocet, $odkaz2);
if($odkaz>10) $odkaz=10;
   if($pocet_stran>1 && $strana<$pocet_stran):
      echo „<br><br><div align=\“right\“ class=\“normal\“><a href=\“vyhladavac.php?strana=$kolko_stran&slovo=$slovo\“>Ďalšie odkazy ($odkaz)</a></div>“;
   endif;
   if($strana>1):
      echo „<div align=\“left\“ class=\“normal\“><a href=\“vyhladavac.php?strana=$kolko_stran2&slovo=$slovo\“>Predchádzajúce odkazy (10)</a></div>“;
   endif;
endif; // koniec úplne prvej podmienky
?>

Pokiaľ zmeníte všetky potrebné údaje, tak vám vyhľadávač bude spoľahlivo fungovať. Je to pomerne rýchle a jednoduché. Netreba robiť žiadne špeciálne úpravy so stránkou, stačí len, keď do nej vložíte skript so zmenami. V ďalšom článku si vytvoríme zdokonalený vyhľadávač s väčšími možnosťami. Ak vám postačí i prvá časť, tak si ju môžete stiahnuť vrátane kaskádových štýlov.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek Jak funguje digitální podpis
Další článek Toulky po webu 11.
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *