V tomto článku bych vám rád ukázal docela užitečnou třídu pro práci s databází MySQL. Umožňuje například jediným příkazem vykonat SQL dotaz a vrátit všechny jeho výsledky v poli. A to samozřejmě není poslední výhoda…

Ještě než se ponoříme do hlubin PHP a SQL, můžete si kompletní zdrojový kód třídy stáhnout, abyste si ji mohli zároveň s výkladem testovat. (Obsahuje ovšem jen ty nejpoužívanější operace s MySQL, pokud vám v ní bude něco chybět, můžete si to doprogramovat.)

Objektový přístup

Pokud MySQL ovládáte pomocí objektů, jedna z výhod je například ta, že si nemusíte ukládat do pomocné proměnné identifikátor spojení nebo identifikátor výsledku, protože třída si tyto údaje pamatuje za vás. Můžete být spojeni s více databázemi a pro každou mít jednu instanci třídy.

Definice vlastní obsluhy chyb

Chybové hlášení může třeba vypsat do stránky dotaz, který způsobil chybu, což se hodí při ladění aplikace, nebo naopak v ostrém provozu zapsat chybu do logu, aplikaci ukončit a uživateli ukázat nějaké „user-friendly“ hlášení. Výhoda je ta, že funkci, která obsluhuje chyby, nastavíte jen jednou a nemusíte už provádět kontrolu po každé operaci s databází.

Název funkce uložíte do vlasnosti err_handler a funkce, která zpracovává chybu, bude mít tvar function zpracuj_chybu_sql($r, $q, $e) (parametr $r obsahuje identifikátor výsledku, $q obsahuje dotaz, který chybu způsobil, a $e obsahuje chybové hlášení). Funkce může vypadat například takto:

function zpracuj_chybu_sql($r, $q, $e){
  // vypíše chybu
  echo "<h1>Chyba</h2>
        Omlouvame se vyskyla se chyba, zkuste akci opakovat pozdeji.";
  // uloží do logu
  $f = fopen(‚sql_error.log‘, ‚a‘);
  fwrite($f, date("Y-m-d H:i:s")."\t".$r."\t".$q."\t".$e."\n");
  fclose($f);
};
// nastaveni obsluhy
$sql->err_handler = ‚zpracuj_chybu_sql‘;

Identifikátor výsledku

Používáte-li klasický způsob $vysledek=mysql_query('SELECT * FROM tabulka', $spojeni);, musíte „tahat sebou“ pomocnou proměnnou. Zde popisovaná třída si identifikátory ukládá do sebe, takže se nestane, že by například mohly kolidovat s jinými proměnnými. Ukázka:

$sql->query(‚zviratka‘, ‚SELECT * FROM zviratka‘);
  // provedení sql dotazu
while($zviratko = $sql->fetch_assoc(‚zviratka‘)) {
  // zpracování výsledků
  …
};

Připojení, odpojení, nastavení…

Nejprve musíte vytvořit instanci třídy:

include ‚mysql.class.php‘;          // vloží soubor s třídou
$sql = new tMysql();                // vytvoří instanci třídy

Dále nastavte parametry připojení:

$sql->dbServer=’databaze.server.cz‘;// jmeno db serveru
$sql->dbUser=’uzivatel‘;            // jmeno uživatele
$sql->dbPassword=’tajneheslo‘;      // uživatelské heslo
$sql->dbName=’moje_db‘;             // jméno databáze

Nyní se už můžete připojit pomocí metody connect(); ($sql->connect();). Až nebudete databázové spojení potřebovat, můžete se odpojit pomocí metody close(); ($sql->close();).

Základní metody

Těchto několik metod „nahrazuje“ volání standardních funkcí mysql_*:

  • queryquery($id_vysledku, $dotaz). Metoda provede SQL dotaz, zapsaný v parametru $dotaz, a případný výsledek uloží do result[$id_vysledku].
  • resultresult($id_vysledku, $radek, $pole). Metoda pracuje podobně jako funkce mysql_result. První parametr $id_vysledku obsahuje id (retezec nebo číslo) výsledku, který byl předtím získán metodou query. Druhý parametr $radek je nepovinný a obsahuje číslo řádku, ze kterého se má číst výsledek, třetí parametr $pole je také nepovinný a obsahuje název pole, ze kterého se má hodnota číst.
  • num_rowsnum_rows($id_vysledku). Metoda pracuje podobně jako funkce mysql_num_rows – zjistí počet řádků ve výsledku. Parametr $id_vysledku obsahuje id (řetězec nebo číslo) výsledku, který byl předtím získán metodou query.
  • free_resultfree_result($id_vysledku). Metoda uvolní výsledek z paměti. Parametr $id_vysledku obsahuje id (řetězec nebo číslo) výsledku, který byl předtím získán metodou query.
  • insert_id – tato metoda pracuje stejně jako funkce mysql_insert_id, vrací id naposledy vloženého záznamu.

Zjednodušení některých operací

Občas potřebujete získat například jen jeden řádek z tabulky, nebo třeba jen jednu hodnotu z jednoho řádku. Při použití klasických postupů byste potřebovali několikařádkový kód, při použití některé z metod popisované třídy si ušetříte značné množství práce.

  • query_resultquery_result($dotaz, $radek, $pole). Jak jistě tušíte jde o spojení funkcí mysql_query a mysql_result. Metodu je vhodné použít tam kde chceme z dotazu získat jen jeden údaj. Metoda provede sql dotaz, vrátí požadovanou hodnotu a uvolní výsledek z paměti. Parametr $dotaz ,který obsahuje SQL dotaz, je povinný. Druhý parametr $radek je nepovinný a obsahuje číslo řádku, ze kterého se má číst výsledek, třetí parametr $poleje také nepovinný a obsahuje název pole ze kterého se má hodnota číst. Příklad:

    $pocet_radku = $sql->query_result(‚SELECT COUNT(id) FROM tabulka‘);
      // zjistí počet řádků v tabulce

  • query_fetch_assocquery_fetch_assoc($dotaz). Tato metoda je podobná předchozí. Metodu je vhodné použít tam, kde výsledek dotazu je jeden řádek. Metoda provede SQL dotaz, vrátí požadované hodnoty v asociativním poli a uvolní výsledek z paměti. Parametr $dotaz obsahuje SQL dotaz. Příklad:

    $radek=$sql->query_fetch_assoc(‚SELECT * FROM tabulka WHERE id=2154‘);
      // přečte všechny údaje z řádku s id=2154

  • query_result_allquery_result_all($dotaz, $pole). Tato metoda se podobá metodě query_result s tím rozdílem, že nebere pouze jednu hodnotu z jednoho řádku, ale jednu hodnotu ze všech řádků. Výsledná data uloží do pole. Parametr $dotaz, který obsahuje SQL dotaz, je povinný. Parametr $pole je nepovinný a obsahuje název pole, ze kterého se má hodnota číst. Příklad:

    $jmena = $sql->query_result(‚SELECT jmeno FROM zviratka‘);
      // získá všechny jména z tabulky, výsledné pole může vypadat třeba takto :
      // array(‚Pajda‘, ‚Pepa‘, ‚Rum‘, ‚Micka‘);

  • query_fetch_assoc_allquery_fetch_assoc_all($dotaz, $index). Ve většině případů můžete řádek, který vytáhnete z databáze, hned zpracovat, pokud ale potřebujete nejprve „vytáhnout“ všechna data, můžete k tomu požít tuto metodu. Parametr $dotaz, který obsahuje SQL dotaz je povinný. Parametr $index je nepovinný. Pokud tento parametr nezadáte, bude bude bude výsledné pole indexováno postupně (0, 1, 2, …, n). Pokud jej zadáte, bude pole indexováno podle tohoto prvku. Příklad:

    // takovýmto použitím třídy…
    $data = $sql->query_result(‚SELECT jmeno, druh, id FROM zviratka‘, ‚id‘);
    // …získáte všechna jména z tabulky, přičemž výsledné pole může vypadat například takto:
    array(
    1285=>array(jmeno=>’Pajda‘, druh=>’pes‘, id=>1285),
    45  =>array(jmeno=>’Pepa‘, druh=>’andulka‘, id=>45),

  • insert, update, replaceinsert($tabulka, $data). Tyto metody jsou „opačné“ k fetch_assoc. Jako parametr zadáte asociativní pole s daty a metoda tato data vloží nebo upraví v tabulce. Parametr $tabulka určuje, do které tabulky se data budou vkládat. Parametr $data už obsahuje samotná vkládaná data. Metoda replace má stejné parametry jako insert. Metoda update má ještě třetí parametr, který určuje podmínku pro funkci UPDATE. Příklady:

      // vloží nový záznam do tabulky
    $sql->insert(‚zviratka‘,array(‚jmeno’=>’Šotek‘,’druh’=’křeček‘,id=532);
      // upraví záznam s id=532
    $sql->update(‚zviratka‘, array(‚jmeno’=>’Šotouš‘,’druh’=>’myš‘),’id=532);

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

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

1 Příspěvěk v diskuzi

  1. Jakožto lenoch jsem si spoustu těch úkonů zjednodušil. Protože jsem byl línej se všechny ty vychytávky sql učit, udělal jsem si adresář s pomůckou, který lze nakopírovat ke stránkám a přistupuje se do toho pod heslem. Lze v tom vytvářet dbase a tabulky, jakož i rušit pouhým vypsáním názvů do formulářů. Je to určené jako náhrada hrabání se v poněkud nešikovném administrátorském rozhraní. Zájemcům mohu poslat. Třeba i výměnou za nějaký podobný nápad.

Odpovědět