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_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_rows –
num_rows($id_vysledku)
. Metoda pracuje podobně jako funkcemysql_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_result –
free_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_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$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. 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$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_all –
query_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_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$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, 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$tabulka
určuje, do které tabulky se data budou vkládat. Parametr$data
už obsahuje samotná vkládaná data. Metodareplace
má stejné parametry jakoinsert
. Metodaupdate
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.
Mohlo by vás také zajímat
-
AI a internetové podvody
29. října 2024 -
inPage AI: Jak na generování obsahu
18. července 2024 -
inPage AI: Revoluční nástroj pro tvorbu webů
3. července 2024 -
Od iPhonu po Android: Ultra HDR přináší nový standard fotografií
1. listopadu 2024
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024
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.