1. díl - Práce s MySQL v PHP - použití základního ovladače
Zkusím popsat některé z metod pro práci s databází MySQL. Nemyslím si, že tohle panoptikum bude úplné, protože variant je velmi mnoho. Zkusím zde uvést ty, které mě napadly.
PHP nám nabízí 3 ovladače pro ovládání jedné databáze.
- MySQL - nejstarší procedurální ovladač
- MySQLi - novější ovladač použitelný procedurálně i objektově
- PDO - univerzální objektový ovladač pro více druhů databází
Je dobré si vybrat jeden z ovladačů a v aplikaci důsledně používat jen ten jeden.
Pro začátek jsem si vybral příklad z diskuzního fóra od uživatele matesax. Trochu jsem ho pro své potřeby upravil, abych si ho mohl na svém PC odladit.
<?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 této podobě je aplikace funkční, i když z hlediska bezpečnosti a spolehlivosti nevyhovující. Především nejsou ošetřeny znaky &, <, >, " a '. To může být velmi nepříjemné, pokud texty do databáze ukládá někdo jiný se zlým úmyslem.
Další nepříjemností je nepřehlednost. Způsobuje to míchání příkazů SQL s generováním výstupů v HTML. Je doporučeno takový kód rozdělit do více komponent i za cenu prodloužení výsledného programu.
V neposlední řadě nejsou ošetřeny chyby. Pokud komunikace s databází neproběhne podle našich představ, obrazovka bude zaplněna chybovými hláškami. Zkusím tedy původní kód trochu upravit. Zároveň nahradím zastaralé a zavrhované funkce novější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");
Nyní jsou ošetřeny znaky nebezpečné pro HTML, nahrazeny nevhodné funkce a ošetřeny některé chyby, ale o přehlednosti se moc mluvit nedá.
Rovněž ošetření chyb funkcí die() bychom mohli raději přenechat zastaralým učebnicím, protože zobrazený chybový výsledek nevypadá příliš esteticky. Je čas použít objekty a výjimky. Použití objektů se zastaralým procedurálním ovladačem MySQL však nepovažuji za příliš inovativní. Proto se v tuto chvíli omezím pouze na výjimky.
<?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žná není výhoda použití výjimek patrná na první pohled, ale pokud se nám v daném případe něco s databází nepovede, pouze se tabulka nevypíše a aplikace pokračuje nerušeně dál. Do bloku catch je možné napsat cokoliv jiného, například zalogování chyby místo vypisování uživatelům. To by s funkcí die() šlo sice také, ale bylo by to trochu krkolomné.
V dalších dílech bude popsáno použití ovladačů MySQLi a PDO.


Tisk


