Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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.


 

Všetky články v sekcii
Ostatné tutoriály v PHP
Článok pre vás napísal Kit
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Jsem spokojeným uživatelem operačních systémů založených na linuxovém jádře. Zejména openSUSE a Ubuntu. Pro psaní veškerých textů a programů používám vynikající textový editor Vim. Aplikace se snažím psát vždy v tom nejvhodnějším programovacím jazyk...
Aktivity