Zjednodušte si práci s MySQL
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_*:
- query –
query($id_vysledku, $dotaz). Metoda provede SQL dotaz, zapsaný v parametru$dotaz, a případný výsledek uloží doresult[$id_vysledku]. - result –
result($id_vysledku, $radek, $pole). Metoda pracuje podobně jako funkcemysql_result. První parametr$id_vysledkuobsahuje id (retezec nebo číslo) výsledku, který byl předtím získán metodou query. Druhý parametr$radekje 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. - num_rows –
num_rows($id_vysledku). Metoda pracuje podobně jako funkcemysql_num_rows– zjistí počet řádků ve výsledku. Parametr$id_vysledkuobsahuje id (řetězec nebo číslo) výsledku, který byl předtím získán metodou query. - free_result –
free_result($id_vysledku). Metoda uvolní výsledek z paměti. Parametr$id_vysledkuobsahuje 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_result –
query_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$radekje 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_assoc –
query_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$dotazobsahuje 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_all –
query_result_all($dotaz, $pole). Tato metoda se podobá metoděquery_results 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$poleje 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_all –
query_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$indexje 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, replace –
insert($tabulka, $data). Tyto metody jsou „opačné“ kfetch_assoc. Jako parametr zadáte asociativní pole s daty a metoda tato data vloží nebo upraví v tabulce. Parametr$tabulkaurčuje, do které tabulky se data budou vkládat. Parametr$datauž obsahuje samotná vkládaná data. Metodareplacemá stejné parametry jakoinsert. Metodaupdatemá 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.








novakus
Led 18, 2012 v 13:20Jakož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.