PHP - jednoduché vyhľadávanie v MySQL

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.

Alternatívne verzie: Text PDF Voice
Autor: PaBi3 · Kategória: Programovanie · Dátum: 27.08.2005 17:13

Komentáre

#1 thema Web E-mail
15.04.2007 22:18
Dobry den, chcem sa spytat, ze to vyhladvanie je super, ale chcel by som to este neako renovovat.
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 :)

#2 laik Web
23.06.2008 21:45
dá sa...
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>'
)

#3 johny E-mail
01.10.2012 12:38
no ja som to robil v dreamweaweri, vsetko bolo fajn až na posledny bod. pri tvoreni stranky vyhladavanie.php som nakopiroval kod, ale po nacitani v prehliadači sa zobrazila len cista strana bez žiadneho formulara , neviem kde som robil chybu :/ , proste akokeby som ziadny formular nevytvoril

#4 Kubo2 Web E-mail
10.02.2013 18:16
thema:
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!

#5 Erik
03.04.2013 15:51
Perfektná práca! :)

#6 Jaykiss E-mail
17.05.2013 08:37
Zdravím, nechcem obťažovať ale prosím nejakého skúseného , nedalo by sa spraviť, že ak nájde výsledok vypíše cely riadok v DB ?

#7 Ivaňuška
13.03.2015 22:18
ten for maš zle cize ti to sice vyhladava ale len podľa prvého slova
$hladaj si nemal nikde deklarovane

oprava:
for ($num=1;$num<count($retazec);$num++)
{
$sql .= " AND vypis LIKE '%".$retazec[$num]."%'";
}

Osobné údaje
Captcha
Odpíšte text z obrázku. Rozlišujú sa malé a veľké písmená.
Obsah
Možnosti