Ako na jednoduché vyhľadávanie v MySQL

Rasťo Turek  /  03. 03. 2004, 00:00

Konečne dnes zúročíme naše vedomosti z oblasti MySQL a ukážeme si, ako vytvoriť pekné a jednoduché vyhľadávanie v MySQL. Toto vyhľadávanie bude vedieť prehľadávať len jednu databázu, jednu tabuľku a hlavne len jeden stĺpec. Nechcem moc zasahovať hlbšie, pretože to by som chcel prebrať v ďalšej budúcnosti a teda rozšírené (fulltextové) vyhľadávanie si necháme na potom. Poďme si rozobrať náš script.

Analýza scriptu
Je jasné, čo potrebujeme aby script robil. Po zadaní požiadavky do poľa formuláru by nám mal dokázať prehliadať stĺpec tabuľky, ktorý si určíme. Teda tzv. pevné vyhľadávanie, keďže ho nebudeme aplikovať na iné stĺpce tabuľky. Samozrejme záleží len na Vašej šikovnosti a vedomostiach, či si po jednoduchej úprave nedokážete script rozšíriť, mne však ide len o teoretické vysvetlenie a praktickú funkčnú ukážku. Tu by som rad podotkol, že pri mojom článku o odosielaní mailov pomocou php som narazil na dlho preberanú otázku „Vypnuté globálne premenné“ a teda celý script bude upravený pre php 4.1.0 a vyššie.

Teória
Keďže sme si príkaz pre predávanie požiadaviek zaoberali už v minulých článkoch, teraz ho tu rozoberať nebudem. Ale samozrejme že Vám podrobne vysvetlím príkaz na prehľadávanie databáze. Týmto príkazom je samozrejme mysql_query poprípade mysql_db_query. Rozdielom medzi nimi je, že mysql_query pracuje s aktuálnou databázou, ktorú práve používame a mysql_db_query pracuje s databázou, ktorú mu určíme a teda požiadavka pre prvý vyzerá asi takto:

mysql_query("SELECT * FROM tabuľka")

a pre mysql_db_query takto:

mysql_db_query("databaza","SELECT * FROM tabuľka")

Jedine v tomto je rozdiel. Poďme však späť k téme. Aby sme MySQL povedali, čo chceme spraviť, musíme použiť jeden s hore spomínaných príkazov. Teda medzi úvodzovky zadáme:

mysql_query("SELECT * FROM tabuľka WHERE stĺpec LIKE "výraz"");

Takže teraz si presne vysvetlíme celý príkaz. SELECT teda vyber * všetko FROM z tabuľka tabuľky WHERE zo stĺpca LIKE tento výraz. Tento príkaz nám zabezpečí, že mysql prehľadá všetky dáta v tomto stĺpci a vyberie všetky dáta zodpovedajúce zadanému výsledku.

Je však mnoho spôsobov zadania výrazu, keďže návštevník nemôže vedieť, či sa u Vás napríklad nachádzajú informácie o základnej doske typu ASUS a tak nezadá presný typ ale stačí len ASUS. No čo ak nevie, ako sa výraz, ktorý hľadá presne píše? Tak namiesto „počítač“ zadá len „poč“ a čaká, že mu Váš script ponúkne možnosti a on si už len vyberie. Aj toto sa dá mysql povedať a teda ak chcete aby hľadaný výraz hľadalo mysql s hocijakou príponou doplníte za LIKE "b%". Teraz akýkoľvek výraz začínajúci písmenom b bude vyhodnotený ako pravda a teda bude ponúknutý ako výsledok vyhľadávania. Čiže ak návštevník hľadal výraz Bavlna, tak ju nájde. Samozrejme že nájde aj výraz Banán, Brazília a prakticky všetky výrazy začínajúce na b.

Ďalšou možnosťou je, že návštevník bude vedieť, že výraz ktorý hľadá končí napríklad na sql. Teda zadá výraz „sql“ a bude čakať, že mu Váš script vráti všetky možné výrazy končiace na sql. Aby ste mu mohli aj toto zabezpečiť, a ponúkli mu všetky výsledky doplníte podmienku takto LIKE "%sql". Teraz mu Váš script môže vypísať informácie napríklad o MySQL, ale aj o MsSQL, PostgreSQL alebo OracleSQL a iných, o ktorých máte zmienku v databáze.

A je tu ešte jedna možnosť zadania výrazu, ktorý nespadá do predošlých kategórií a tou je ak návštevník nepozná spôsob uchovania záznamu o údajoch jeho záujmu vo Vašej databázi a tak zadá stred výrazu, ktorým si je naprosto istý. Ak napríklad hľadá v databázi s menami a hľadá trebárs všetky mená, ktoré obsahujú „ure“. Tomuto výrazu môžu zodpovedať mená ako Šurek, Murek, Kurek, Jurek a množstvo iných ale s týmito sa stretávam takmer denne :o). Tomu, kto pozorne čítal celý článok od začiatku určite prišlo na um, že takýto výraz môžete vyhľadať úplne jednoducho a teda doplníte podmienku takto LIKE "%ure%". Teraz si zaručíte, že výrazy budú vyhľadané aj prvým, druhým a samozrejme hlavne tretím spôsobom. Tento spôsob využijeme aj my v našom scripte. Chcem podotknúť, že existuje viac spôsobov pre vyhľadávanie v MySQL ale tými sa ja už zaoberať v článku nebudem, keďže sú len ekvivalentami k predošlému spôsobu. Ale viac o nich nájdete v manuále MySQL o ktorom som písal nedávno v predošlom článku.

Teraz si spravíme prípravu aplikácie pre vyhľadávanie a podrobne si rozoberiem možné problémy a vylepšenia.

Príprava aplikácie pre vyhľadávanie
Neoddeliteľnou súčasťou všetkých aplikácií využívajúcich MySQL je konfiguračný súbor config.php, ktorý sme si vytvorili už v predošlých článkoch. Teda samozrejme že ho použijeme aj teraz a to prvú variantu bez použitia funkcie. Ďalej si musíme spraviť návrh databáze v ktorej budeme vyhľadávať a samozrejme v neposlednom rade script, ktorý toto vyhľadávanie zabezpečí. Nezabudnite, že od verzie php 4.1.0 a vyššej je funkcia register_globals vypnutá a tak budeme pred každú volanú premennú pridávať $_POST, $_GET, $_REQUEST a $_SERVER. Vždy to závisí od toho, odkiaľ sa snažíme premennú zaregistrovať (získať). Keďže som sa tomuto ešte nevenoval, narýchlo Vám skúsim vysvetliť, ako to funguje.

Ak používate php od verzie 4.1.0 musíte pred premenné pridávať reťazec, ktorý Vám zabezpečí získanie premennej. Táto možnosť funguje už od php 3 ale začala sa používať až od php 4, keďže sa vývojari php snažia zvýšiť bezpečnosť php a teda funkcia register_globals bude z php v ďalších verziách (myslím že už od verzie 5.0) úplne odstránená. Tento spôsob využívajte nasledovne:

$_POST['premenná']  namiesto $premenná

V konečnom dôsledku teda použijete:

$_POST – keď získavate premenné z formulára pomocou metódy POST
$_GET - keď získavate premenné z formulára alebo riadku pre zadanie url pomocou metódy GET
$_REQUEST - keď získavate premenné z akéhokoľvek zdroja akýmkoľvek spôsobom, teda zaregistruje akúkoľvek premennú
$_SERVER - keď získavate premenné od serveru ako príkladom aktuálnu adresu scriptu, ktorý práve používate ($PHP_SELF)

Ak sa Vám však nechce používať tento spôsob, tak tu máte malý kód prebratý z interval.cz, ktorý Vám zaregistruje všetky premenné a teda už nemusíte používať tento spôsob zápisu pre získanie premenných.

foreach($_REQUEST as $ind => $val)
{
 $val=addslashes($val);
 eval("$".$ind."=\"".$val."\";");
}

Chcem však upozorniť, že tento script nekopírujem, lebo by som ho nevedel napísať, ale preto, lebo ho nemá zmysel písať znovu, keď to už niekto spravil predo mnou. Ja aj tak vo všetkých svojich scriptoch používam spôsob osobitného zápisu, je to bezpečnejšie. Toto len pre tých, ktorí by sa radi vybúrili v diskusii.
Keďže sme už prebrali celý základ, navrhneme si databázu.
Databázu si spravíme jednoduchú a do nej naplníme niekoľko záznamov.

CREATE TABLE inet (
id int(8) auto_increment,
meno varchar(100) not null,
priezvisko varchar(100) not null,
sex char(1) not null,
PRIMARY KEY id(id)
) TYPE=MyISAM

a samozrejme si ju naplníme údajmi, ktorými sú meno, priezvisko a pohlavie (sex) dotyčnej osoby. Tu sú údaje:

INSERT INTO inet VALUES (1, 'Rastislav', 'Turek', 'm');
INSERT INTO inet VALUES (2, 'Peter', 'Polakovic', 'm');
INSERT INTO inet VALUES (3, 'Dusana', 'Zahovorova', 'f');
INSERT INTO inet VALUES (4, 'Petra', 'Kovacova', 'f');
INSERT INTO inet VALUES (5, 'Jaroslav', 'Michalak', 'm');
INSERT INTO inet VALUES (6, 'Matus', 'Bukva', 'm');
INSERT INTO inet VALUES (7, 'Zuzana', 'Cundorova', 'f');

Už máme navrhnutú databázu a teraz si vytvoríme script pre vyhľadávanie a samozrejme si ho popíšeme a vysvetlíme.

<?php
include("config.php"); // pripojíme súbor config php pre pripojenie k databázi
?>
<!-- Html script pre vyhľadávanie -->
<form action="index.php" method="get">
Hladanie: <input type="text" name="search">
<input type="submit" name="send" value="Vyhladaj">
</form>

<?php
$sql=mysql_query("SELECT * FROM inet WHERE meno LIKE \"%".$_GET['search']."%\"");
// príkaz mysql pre vyhľadávanie

echo "<table border=\"1\">"; // tabuľka s rámčekom
echo "<tr><td>Meno</td><td>Priezvisko</td><td>Pohlavie</td></tr>"; // popis stĺpcov v tabuľke

if($_GET['send']=="Vyhladaj") // podmienka pre spustenie vyhľadávacieho scritpu
{
 while($zaznam=mysql_fetch_object($sql))
// cyklus pre načítanie všetkých záznamov z databáze
 {
 echo "<tr><td>$zaznam->meno</td><td>$zaznam->priezvisko</td><td>$zaznam->sex</td></tr>";
 // výsledok vyhľadávania zobrazovaný do stránky
 }
}

echo "</table>"; // ukončenie tabuľky
?>

Keď si celý script prezriete zistíte, že je úplne jednoduchý na pochopenie. Na začiatku scritpu si nainkludujeme súbor config.php pre pripojenie k databázi. Potom si vytvoríme jednoduchý formulár, ktorým budeme zasielať vyhľadávaný výraz. Potom nasleduje príkaz pre MySQL na vyhľadávanie v tabuľke.  Ďalej si vytvoríme tabuľku s obrámovaním a popis jednotlivých stĺpcov. Nasleduje podmienka, ktorá overí, či bolo stlačené tlačítko „vyhľadaj“ ak bolo, tak pomocou cyklu si vypíšeme všetky údaje do stránky. Nakoniec si cyklus a podmienku uzavrieme a rovnako uzavrieme aj tabuľku. A to je celý script, ktorý dokáže prehľadávať stĺpec tabuľky a tak vypisuje nájdené dáta do stránky.

Zhrnutie
Tento script je dosť ľahký a tak by pre trošku skúsenejších nemal byť problém jeho zaradenie do vlastných stránok. Samozrejme script nie je ošetrený proti chybám, cudziemu vniknutiu a nenájdeniu výsledku. Odporúčam ošetriť si script, aby nedochádzalo k rozhorčeniu návštevníkov, keď mu script nič nevypíše a on sa bude naďalej snažiť vyhľadávať výraz. Script sa dá samozrejme rozšíriť aj na ďalšie funkcie, poprípade na prehľadávanie viacerých stĺpcov či tabuliek. Myslím, že toľko by k danej problematike stačilo, prikladám ešte prílohu na stiahnutie. Prajem Vám veľa úspešných hodín strávených pri písaní aplikácií v php.

Rastislav Turek // break.sk

Neprehliadnite: