PHP - jednoduché vyhľadávanie v MySQL

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ť.

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.

27.08.2005 17:13

PaBi3

Programovanie