1. diel - Práca s MySQL v PHP - použitie základného ovládača
Skúsim popísať niektoré z metód pre prácu s databázou MySQL. Nemyslím si, že toto panoptikum bude úplné, pretože variantov je veľmi veľa. Skúsim tu uviesť tie, ktoré ma napadli.
PHP nám ponúka 3 ovládače pre ovládanie jednej databázy.
- MySQL - najstaršie procedurálny ovládač
- MySQLi - novší ovládač použiteľný v procedúre objektovo
- PDO - univerzálny objektový ovládač pre viac druhov databáz
Je dobré si vybrať jeden z ovládačov a v aplikácii dôsledne používať len ten jeden.
Pre začiatok som si vybral príklad z diskusného fóra od užívateľa matesax. Trochu som ho pre svoje potreby upravil, aby som si ho mohol na svojom PC odladiť.
<?php $spojeni=mysql_connect("localhost","kit",""); $co="SET NAMES utf8"; $navrat=mysql_db_query("test", $co, $spojeni); $co="SELECT * FROM adresar"; $navrat=mysql_db_query("test", $co, $spojeni); echo("<table border=\"1\">\n"); echo("<tr>\n"); for ($i=0;$i<mysql_num_fields($navrat); $i++){ echo("<td><strong>".mysql_field_name($navrat, $i)."</strong></td>\n"); } echo("</tr>\n"); while (list($nazev, $datum, $delka) = mysql_fetch_row($navrat)){ echo("<tr><td>$nazev</td><td>$datum</td><td>$delka</td></tr>\n"); } echo("</table>\n");
V tejto podobe je aplikácia funkčný, aj keď z hľadiska bezpečnosti a spoľahlivosti nevyhovujúce. Predovšetkým nie sú ošetrené znaky &, <,>, "a '. To môže byť veľmi nepríjemné, ak texty do databázy ukladá niekto iný so zlým úmyslom.
Ďalšie nepríjemností je neprehľadnosť. Spôsobuje to miešanie príkazov SQL s generovaním výstupov v HTML. Odporúča taký kód rozdeliť do viacerých komponentov aj za cenu predĺženia výsledného programu.
V neposlednom rade nie sú ošetrené chyby. Ak komunikácia s databázou neprebehne podľa našich predstáv, obrazovka bude zaplnená chybovými hláškami. Skúsim teda pôvodný kód trochu upraviť. Zároveň nahradím zastarané a zavrhované funkcie novšími.
<?php $spojeni=mysql_connect("localhost","kit","") or die('Nepodařilo se otevřít databázi'); $navrat=mysql_query("SET NAMES utf8", $spojeni) or die('Chyba SET NAMES'); $navrat=mysql_query("USE test", $spojeni) or die('databáze "test" neexistuje'); $navrat=mysql_query("SELECT * FROM adresar", $spojeni) or die('Chyba dotazu SELECT'); echo("<table border=\"1\">\n"); echo("<tr>\n"); for ($i=0;$i<mysql_num_fields($navrat); $i++){ echo("<th>".mysql_field_name($navrat, $i)."</th>\n"); } echo("</tr>\n"); while ($row = mysql_fetch_row($navrat)){ echo("<tr>"); foreach($row as $value) { echo("<td>".htmlspecialchars($value)."</td>"); } echo("</tr>\n"); } echo("</table>\n");
Teraz sú ošetrené znaky nebezpečné pre HTML, nahradené nevhodné funkcie a ošetrené niektoré chyby, ale o prehľadnosti sa veľmi hovoriť nedá.
Takisto ošetrenie chýb funkcií die () by sme mohli radšej prenechať zastaralým učebniciam, pretože zobrazený chybový výsledok nevyzerá príliš esteticky. Je čas použiť objekty a výnimky. Použitie objektov sa zastaraným procedurálnym ovládačom MySQL však nepovažujem za príliš inovatívne. Preto sa v túto chvíľu obmedzím len na výnimky.
<?php try{ if(!@$spojeni=mysql_connect("localhost","kit","")) throw new Exception('Nepodařilo se otevřít databázi'); if(!@$navrat=mysql_query("SET NAMES utf8", $spojeni)) throw new Exception('Chyba SET NAMES'); if(!@$navrat=mysql_query("USE test", $spojeni)) throw new Exception('databáze "test" neexistuje'); if(!@$navrat=mysql_query("SELECT * FROM adresar", $spojeni)) throw new Exception('Chyba dotazu SELECT'); echo("<table border=\"1\">\n"); echo("<tr>\n"); for ($i=0;$i<mysql_num_fields($navrat); $i++){ echo("<th>".mysql_field_name($navrat, $i)."</th>\n"); } echo("</tr>\n"); while ($row = mysql_fetch_assoc($navrat)){ echo("<tr>"); foreach($row as $value) { echo("<td>".htmlspecialchars($value)."</td>"); } echo("</tr>\n"); } echo("</table>\n"); } catch(Exception $e) { echo "Tabulku nelze vypsat<br />\n"; echo $e->getMessage(),"\n"; }
Možno nie je výhoda použitie výnimiek viditeľná na prvý pohľad, ale ak sa nám v danom prípade niečo s databázou nepodarí, len sa tabuľka nevypíše a aplikácie pokračuje nerušene ďalej. Do bloku catch je možné napísať čokoľvek iné, napríklad zalogovanie chyby miesto vypisovania užívateľom. To by s funkciou die () išlo síce tiež, ale bolo by to trochu krkolomné.
V ďalších dieloch bude popísané použitie ovládačov MySQLi a PDO.