Vyhľadávanie v PHP a MySQL je súčasťou takmer každej webovej aplikácie. V článku by som chcel znázorniť, ako také vyhľadávanie môže vyzerať.
PHP - jednoduché vyhľadávanie v MySQL
PHP - jednoduché vyhľadávanie v MySQL
Možností ako vyhľadávať v databáze MySQL reťazce pomocu PHP je veľa. Asi najlepším a najrýchlejším spôsobom vyhľadávania je, ak využívate databázové indexy. V tomto článku sa nimi ale zaoberať nebudeme ale prejdem na vyhľadávanie bez ich pomoci. Ako prvé čo by sme si mali vytvoriť alebo predstaviť je tabuľka s ktorou bude PHP a databáza pracovať.
CREATE TABLE clanky( id MEDIUMINT UNSIGNED NOT NULL auto_increment, nadpis VARCHAR(96) NOT NULL, obsah TEXT NOT NULL, PRIMARY KEY(id) );
Vyhľadávanie bude fungovať rozšírene(viz. roz. vyhľadávanie)
urobíme si prostý formulár a ten bude pre vyhľadávanie zatiaľ stačiť. Na výber
bude zadanie reťazca a potom vybranie akým spôsobom chcete vyhľadávať. Či v nadpise
alebo v obsahu článku.
Prvé čo spravíme bude vloženie textu resp. článku do tabuľky. Môžeme si vybrať
akýkoľvek text napr. tento:
INSERT INTO clanky(nadpis,obsah) VALUES( 'Konfigurácia PHP a Apache', 'PHP sa konfiguruje veľmi lahko. Apache je veľmi dobrý server a dobre sa mi s ním pracuje. Mám rád aj jeho mod-rewrite.' )
Nadpis bude "Konfigurácia PHP a Apache". Ostatný text bude obsah článku uložený v stĺpci "obsah". Myslím, že teraz môžeme pristúpiť k súboru na pripojenie do databázy. Súbor sa bude volať mysql.php. Vložíme do neho nasledujúci kód:
<?php #mysql.php $dbc = mysql_connect("localhost","login","heslo") OR die("Chyba spojenia!<br />n"); mysql_select_db("databaza") OR die("Systém nenašiel tabuľky!<br />n"); ?>
Ak nerozumiete niektorým funkciám môžete si ich bližšie preštudovať v článku PHP pre začiatočníkov - Databázy, 11.diel. Teraz ak už sme pripojený do databázy a pripravený vyhľadávať reťazec môžeme začať. Prvé čo urobíme je súbor vyhladavanie.php a vložíme do neho nasledujúci kód:
<?php #vyhladavanie.php require_once("mysql.php"); if(isset($_GET[retazec])){ if(empty($_GET[retazec])){ $retazec = FALSE; $error = "Nezadali ste reťazec pre vyhľadávanie!<br />n"; } else { $retazec = $_GET[retazec]; } if($_GET[podla] == "nadpis"){ $podla = "nadpis"; } elseif($_GET[podla] == "obsah"){ $podla = "obsah"; } if($retazec){ echo "Výsledky vyhľadávania <strong>$retazec</strong>!<br />n"; $retazec = explode(" ",$retazec); $sql = "SELECT nadpis FROM clanky WHERE $podla LIKE '%".$retazec[0]."%'"; for ($num=1;$num<count($hladaj);$num++) { $sql .= "$sql AND $podla LIKE '%".$hladaj[$num]."%'"; } $sql = "$sql ORDER BY id DESC"; $vysledok = mysql_query($sql); $pocet = mysql_num_rows($vysledok); if($pocet == NULL){ die("Zadaný reťazec sa v databáze nenachádza!<br />n"); } while($zaznam = mysql_fetch_object($vysledok)){ $nadpis = $zaznam->nadpis; echo "$nadpis<br />n"; } unset($nadpis); echo "<hr />Výsledkov: <strong>$pocet</strong> | <a href='javascript:history.back()' title='Späť'>Späť</a><br />n"; } else { echo $error; } } else { echo "<form action='{$_SERVER[PHP_SELF]}' method='get'>n"; echo " <fieldset><legend>Zadajte reťazec</legend>n"; echo " Text:<br /><input name='retazec' type='text' /><br />n"; echo " Hľadaj...<br /><select name='podla'>n"; echo " <option value='nadpis'>V nadpise</option>n"; echo " <option value='obsah'>V obsahu</option>n"; echo " </select><br /><br />n"; echo " <input type='submit' value='Vyhľadaj' />n"; echo " </fieldset>n"; echo "</form>n"; } ?>
V zdrojovom kóde si môžete všimnúť formulár na spodku stránky. Pokiaľ nie je odoslaný, zobrazí sa. Ihneď po jeho vyplnení a odoslaní sa spracuje. Spracovanie prebieha tak, že sa zadaný reťazec premení na pole pomocou funkcie explode(" ", $retazec). Následne vyhľadáva obsah databázy a pokúša sa nájsť zadaný reťazec. Ak má pole $retazec viac ako jeden prvok, začne cyklicky vyhľadávať v databáze ďalšie hodnoty poľa. Je jedno koľko ich je, pretože cyklus for ich bude vyhľadávať donekonečna kým nevyčerpá všetky hodnoty poľa.
Nakoniec vyskúšame napísať do formulára reťazec php a čakať na výsledok. Zobrazí sa nám záznam z databázy, ktorý sme tam na začiatku článku vložili. Skúste si do databázy vložiť ešte viac článkov a vyhľadávať ich obsah. Tento kód je len taká malá kostra pre vyhľadávanie. Nie je bezpečný pre použitie pretože nie sú ošetrené odosielané dáta – to nechám na vás.
Komentáre
A to taq, ze v tej tabulke "clanky" bude dalsi stlpec "adresy" a ku kazdemu bude konkretna adresa. A ked najde neaky vyraz, taq ze by ho ihned dalo do "a href" a bolo by to supeeer! ako setko fim urobit, len to nefim v PHP dorobit. Mohli by ste to niekto pls doprogramovat? dakujem :)
do tabuľky zadáš:
odkaz varchar (100) NOT NULL,
do textu zadáš:
INSERT INTO clanky(nadpis,obsah,odkaz) VALUES(
'Konfigurácia PHP a Apache',
'PHP sa konfiguruje veľmi lahko. Apache je veľmi dobrý server a dobre sa mi s ním
pracuje. Mám rád aj jeho mod-rewrite.'
'<a href="#cesta" title=\" cesta ku clanku...\">ABCD</a>'
)
nikto ti to nebude doprogramovavat.
Ak si fedel porozumieť samotnému kódu vyššie, ako to, že nevieš takú jednoduchú vec ako vytvorenie jedného stĺpca v tabuľke navyše a potom ešte uloženie dát do toho konkrétneho stĺpca? Veď pre toho, kto porozumel kódu - hoci je to aj úplný začiatočník - to musí byť úplne triviálne!
$hladaj si nemal nikde deklarovane
oprava:
for ($num=1;$num<count($retazec);$num++)
{
$sql .= " AND vypis LIKE '%".$retazec[$num]."%'";
}