Facebook RSS feed

1. díl - Práce s MySQL v PHP - použití základního ovladače

Zpět do sekce Ostatní tutoriály v PHP


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.


 

Článek pro vás napsal Kit
Avatar
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...

Jak se vám líbí článek?
Celkem (7 hlasů):
4.571434.571434.571434.571434.57143


 


Všechny články v sekci
Ostatní tutoriály v PHP
Ostatní tutoriály pro programovací jazyk PHP a ukázkové skripty ke stažení, které se již nevešly do ostatních sekcí.
Další článek
Práce s MySQL v PHP - Použití ovladače MySQLi
Databáze MySQL se dá z PHP ovládat pomocí tří ovladačů. Modernější MySQLi odstraňuje některé nedostatky zastaralého ovladače.


 

 

Vaše komentáře:

Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Avatar
David Čápka:

mysql_db_query neznám, ale je prý deprecated, vůbec jsem ten kód od matesaxe moc nepochopil :)

Ten poslední je již docela hezký. Jsem zvědavý na MySQLi a PDO, v PHP 5.4 prý lze result přímo iterovat. Osobně používám DiBi, ale její funkcionalita je v nových verzích PHP dosažena nativně. Líbí se mi na ní, že lze předávat query asociativní pole při INSERT nebo UPDATE, to nevím, jestli jde nativně.

Odpovědět   i++; | i--; 05.07.2012 17:12:42
Metal is the transitional element for the construction of Artifact Vessels.
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Avatar
Odpovídá na David Čápka
Kit:

mysql_db_query() jsem také neznal, než ho použil matesax. Jeho kód mi však po kosmetických úpravách fungoval, tak jsem ho dal jako výchozí. Vím, že mysql_db_query() je deprecated. Všechny uvedené příklady jsou odzkoušené a funkční.

Sám jsem zvědav, jak zvládnu MySQLi, protože jsem v něm kromě jednoho benchmarku nikdy nedělal. Šel jsem rovnou do PDO, protože mi něco v MySQLi chybělo. Nelituji, protože SQLite3 se z PHP dá ovládat pouze přes PDO. Později jsem těch výhod objevil víc, nemám tedy důvod se k MySQLi vracet a už vůbec ne k původnímu ovladači MySQL. Pro mne je PDO jasnou volbou zejména kvůli univerzálnosti rozhraní.

Odpovědět   i++; | i--; 05.07.2012 17:29:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
albertpatera
Redaktor
DotDotDotDotDotDotDotDotDotDot
Avatar
albertpatera:

jeste sem se chtel zeptat, jaktoze, kdyz si v Mysql Workbench vytvorim databazi, tak jaktoze, kdyz tam zadam heslo. ono to chvíli nabíhá a pak mi to oznámí chybu, jaktoze se tam nemuzu pripojit? diky

 
Odpovědět   i++; | i--; 17.07.2012 12:55:40
Avatar
relycanx
Člen
DotDotDotDotDotDotDotDotDotDot
Avatar
relycanx:

ahoj, chtěl bych se zeptat, jak můžu zpřístupnit svou databázi i lidem na svých stránkách, když u sebe používám klasiku localhost bez jména a hesla, prostě ze svýho počítače :) přemýšlel jsem, že tam naklapu svou IP adresu a jméno a heslo nevyplním, ale to je asi blbost...

 
Odpovědět   i++; | i--; 03.05.2013 20:55:20
Avatar
Riwa-chan
Člen
DotDotDotDotDotDotDotDotDotDot
Avatar
Riwa-chan:

Článek je to velmi dobrý, ale pro začátečníky trochu složitý. Možná by chtělo vysvětlit co to vlastně ta databáze, ovladače a MySQL je, než začneš psát kód.

Odpovědět   i++; | i--; 03.08.2013 07:43:50
Kimi ga ashita hebi to nari, hito o kurai hajimeru toshite... hito o kuratta sono kuchi de... boku o aisu to hoeta to...
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Avatar
Odpovídá na Riwa-chan
Kit:

Vysvětlení pojmu databáze je na několik samostatných článků, které tady už někde jsou. Je zbytečné to popisovat stále dokola. Článek je pouze o vazbě PHP a MySQL.

Odpovědět   i++; | i--; 03.08.2013 09:43:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Riwa-chan
Člen
DotDotDotDotDotDotDotDotDotDot
Avatar
Odpovídá na Kit
Riwa-chan:

Alespoň základní vysvětlení v pěti větách. Na začátek stačí vědět co to je MySQL, proč MySQL, kdy využít jinou databázi a k čemu databáze vůbec slouží. No ale to je jedno, jestli to tu někde je, tak není potřeba.

Odpovědět   i++; | i--; 03.08.2013 09:47:49
Kimi ga ashita hebi to nari, hito o kurai hajimeru toshite... hito o kuratta sono kuchi de... boku o aisu to hoeta to...
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Avatar
Odpovídá na Riwa-chan
Kit:

Nechce se mi zasahovat do vydaného článku, protože bych ho přepsal celý.

Proč MySQL? Protože když PHP hledalo databázi, tak ostatní databáze neměly vhodnou licenci a uživatelé si na MySQL prostě zvykli. Jakmile však má někdo potřebu ORM, je obvykle lepší MySQL opustit a přejít k jiným databázím, které ORM nepotřebují.

Odpovědět   i++; | i--; ( +1 ) 03.08.2013 10:23:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.

 

Zobrazeno 8 z 8 zpráv



Přidat novou zprávu

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlaš. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.