Programátorská sociální síť a materiálová základna pro C#, Java, PHP, HTML, CSS, JavaScript a další.


Přihlásit se Registrace  

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

Zpět do sekce Práce s MySQL a dalšími databázemi 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.


 

Autor: Kit
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 (4 hlasů):
4.5 4.5 4.5 4.5 4.5


 


Všechny články v sekci
Práce s MySQL a dalšími databázemi v PHP
Série článků se věnuje různým přístupům pro práci s databází v PHP. Jsou probrány ovladače MySQL, MySQLi, PDO a různé objektové přístupy k datům.
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:

05.07.2012 17:12:42
Avatar
sdraco
Moderátor
Skill: Kvantový počítač
DotDotDotDotDotDotDotDotDotDot

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--;
You only get one shot, do not miss your chance to blow. This opportunity comes once in a lifetime.
05.07.2012 17:29:23
Avatar
Kit
Moderátor
Skill: Core i7 extreme
DotDotDotDotDotDotDotDotDotDot
Odpovídá na sdraco:

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--;
Aplikace je hotova až tehdy, když z ní nelze nic odebrat.
17.07.2012 12:55:40
Avatar
albertpatera
Redaktor
Skill: 486 DX
DotDotDotDotDotDotDotDotDotDot

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--;
03.05.2013 20:55:20
Avatar
relycanx
Člen
Skill: ZX-Spectrum
DotDotDotDotDotDotDotDotDotDot

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--;

 

Zobrazeno 4 z 4 zpráv


Přidat novou zprávu

Avatar
Neregistrovaný

Pro výhody se přihlaš. Pokud ještě nemáš účet, zaregistruj se.

Jméno:
E-mail:
Web:

Šťastný Smutný S vyplazeným jazykem Mrkající Smějící se Plačící Cool Nemocný Naštvaný S brýlemi Stydící se On to nebyl Překvapený Hodně překvapený Šokovaný Srdce sdraco
Vložení obrázků Obrázky mohou nahrávat pouze registrovaní uživatelé
Vložení dlouhého zdrojáku Pouze pro registrované

 

Pro ověření prosím zaškrtněte pravdivá tvrzení:
Registrovaní uživatelé se tímto zdržovat nemusí. Zaregistrovat se

Jsem člověk
Píši z důvodu spamování
Píši zprávu i přesto, že nemá žádný význam
Nejsem člověk