MySQL a web
V prípade, že už máme navrhnutú databázu, v ktorej sú už nejaké dáta je vhodné ju prepojiť s určitým informačným systémom. Každý informačný systém pozostáva z databázového modelu, ktorý modeluje požadovanú časť reality. Aby sa dalo s týmto databázovým modelom ľahko pracovať (bez znalosti administrátorských nástrojov ako je napríklad phpMyAdmin[1]) je potrebné vytvoriť používateľské rozhranie.
Možnosti spojenia sa s databázou MySQL
Pre databázový systém MySQL [2] existuje veľa spôsobov ako sa k databáze pripojiť. V našom kurze využijeme možnosť programovacieho jazyka php pre spojenie sa s databázou a jazyka HTML pre zobrazenie výsledkov.
HTML - prezentácia výsledkov
Jazyk HTML je značkovací jazyk používaný pre tvorbu web stránok. Pri našej práci využijeme len základné schopnosti tohoto jazyka:
- použitie nadpisov, odstavcov,
- pre zobrazenie databázových tabuliek použijeme tabuľkové zobrazenie.
Prázdny HTML dokument môže vyzerať nasledujúco:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>DBS - Databázové systémy</title>
</head>
<body>
Tu je obsah dokumentu. Teda to, čo sa zobrazí na web stránke.
</body>
</html>
php - nástroj pre prácu s databázou
Pre správnu funkcionalitu jazyka PHP je vhodné ak spolupracuje s nejakým webserverom (Apache[3], IIS[4], ...). Web server poskytuje služby zobraeznia web stránok a jazyk PHP je časťou, ktorá dovoľuje vytvárať menšie či väčšie programy. Jazyk PHP je skriptovací jazyk, ktorý pracuje na strane servera. To znamená, že príkazy jazyka PHP už nie sú na web stránke, ktorá je zobrazená v internetovom prehliadači. Príkazy jazyka PHP sa píšu priamo do HTML kódu medzi značky <?php a ?>.
Ukážka použitia bloku PHP na web stránke.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>DBS - Databázové systémy</title>
</head>
<body>
Tu je obsah dokumentu. Teda to, čo sa zobrazí na web stránke.
<?php
tu môžem písať príkazy jazyka php
?>
</body>
</html>
1. Spojenie sa s databázou
Pre pripojenie k databázovému serveru MySQL slúži v PHP funkcia mysql_connect. Táto funkcia má zvyčajne 3 parametre:
mysql_connect (adresa_db_servera, meno_používateľa, heslo_používateľa)
kde
- adresa_db_servera - je názov alebo IP adresa databázového servera MySQL.
- V prípade, ak máte nainštalovaný databázový server na rovnakom počítači ako je webový server, tak adresa je 'localhost' (alebo IP adresa 127.0.0.1).
- meno_používateľa - používateľské meno, pre prihlásenie sa k databáze,
- heslo_používateľa - heslo pre prihlásenie sa k databáze.
Funkcia mysql_connect nám vracia identifikátor spojenia, v ktorom sú informácie o spojení.
Použitie tejto funkcie:
<?php
$link=mysql_connect("db.server","meno","heslo") or die("Chyba pri pokuse o nadviazanie spojenia");
// praca s databazou
mysql_close($link);
?>
Príkaz mysql_connect vytvorí spojenie. V prípade, ak sa nepodarilo nadviazať spojenie, vykoná sa druhá časť príkazu - die. Die je funkcia, ktorá okamžite ukončí vykonávanie skriptu. Ale ešte predtým, ako ukončí vykonávanie skriptu vypíše text, ktorý je uvedený v parametri tejto funkcie.
Funkcia mysql_close slúži na ukončenie spojenia s databázou. Parametrom je identifikátor spojenia.
2. Výber databázy
Pre tým, ako začneme klásť dotazy na databázu musíme si vybrať s ktorou databázou chceme pracovať. V prvom kroku sme sa spojili s databázovým serverom, na ňom však zvyčajne existuje viacero databáz. Výber databázy robíme pomocou funkcie mysql_select_db.
Funkciu mysql_select_db je vhodné používať s dvoma parametrami:
mysql_select_db(názov_databázy, identifikátor_spojenia);
kde:
- názov_databázy je názov databázy, tak ako je vytvorená na databázovo serveri,
- identifikátor_spojenia je nepovinný v prípade, ak v PHP skripte máme len jedno databázové spojenia.
V našom príklade doplníme výber databázy student.
<?php
$link=mysql_connect("db.server","meno","heslo") or die("Chyba pri pokuse o nadviazanie spojenia");
mysql_select_db("student", $link) or die("Požadovanú databázu sa nepodarilo vybrať");
// praca s databazou
mysql_close($link);
?>
3. Nastavenie znakovej sady pre spojenie
Práca s rôznymi znakovými sadami môže byť (a je) komplikovaná. Je dobré, ak používame jednu znakovú sadu, aby sme sa vyhli s problémami s konvertovaním medzi znakovými sadami. Pri práci s databázami v prostredí webu existujú viaceré nastavenia znakových sád:
- znaková sada použitá na ukladanie dát do tabuliek databázy,
- znaková sada použitá pre zobrazovanie údajov (znaková sada web stránky),
- znaková sada pre spojenie s databázovým serverom.
Ak používame v databáze znakovú sadu utf-8, tak je dobré použiť tú istú znakovú sadu aj pre web stránku. Pre nastavenie znakovej sady pre spojenie existuje SQL príkaz SET NAMES[5]:
SET NAMES 'charset_name'
kde charset_name je názov znakovej sady (napríklad, utf-8, latin1, latin2, ...).
Do našej aplikácie pridáme tento SQL príkaz pomocou volania funkcie mysql_query, ktorá odošle na databázový server pripravený SQL príkaz. Syntax príkazu mysql_query je nasledovná:
mysql_query ( dotaz [, $identifikácor_spojenia] )
kde:
- dotaz je SQL dotaz, ktorý chceme vykonať,
- identifikácor_spojenia (nepovinný parameter) je identifikátor spojenia získaný pomocou funkcie mysql_connect,
- funkcia mysql_query vráti identifikátor výsledku, ktorý použijeme pre výber údajov, ktoré sú výsledkom SQL dotazu.
Zdrojový kód rozšírime o ďalší riadok:
1 <?php
2 $link=mysql_connect("db.server","meno","heslo") or die("Chyba pri pokuse o nadviazanie spojenia");
3 mysql_select_db("student", $link) or die("Požadovanú databázu s nepodarilo vybrať");
4 mysql_query("SET NAMES 'utf8'");
5 // praca s databazou
6 mysql_close($link);
7 ?>
4. Odoslanie dotazu na databázu
Po vytvorení spojenia, vybratí konkrétnej databázy a nastavení vhodného kódovania môžeme na databázu poslať SQL dotaz, ktorý chceme vykonať. Slúži na to už spomínaná funkcia mysql_query. Výhodnejšie je si pripraviť SQL dotaz a uložiť ho do jednej premennej (premenná $dotaz):
1 <?php
2 $link=mysql_connect("db.server","meno","heslo") or die("Chyba pri pokuse o nadviazanie spojenia");
3 mysql_select_db("student", $link) or die("Požadovanú databázu s nepodarilo vybrať");
4 mysql_query("SET NAMES 'utf8'");
5 $dotaz="SELECT * FROM city WHERE CountryCode = 'SVK' ";
6 $idVysledku = mysql_query($dotaz) or die ("pravdepodobne chybný dotaz");
7 // praca s databazou
8 mysql_close($link);
9 ?>
5. Načítanie výsledkov dotazu
Po zavolaní funkcie mysql_query máme v premennej $idVysledku identifikátor výsledku dotazu. Pomocou neho dokážeme výsledok z databázy prečítať. Pre správne načítanie výsledku budeme potrebovať nasledujúce funkcie: Funkcia mysql_fetch_array[6] vráti jeden riadok z množiny výsledkov. Ak je teda výsledkom dotazu tabuľka, ktorá má napríklad 10 záznamov, je potrebné túto funkciu zavolať 10x. Funkcia mysql_fetch_array vráti pole, ktorého položkami sú hodnoty atribútov jedného záznamu výsledku.
mysql_fetch_array ( idVysledkuSQL_dotazu [typVysledku] )
kde:
- idVysledkuSQL_dotazu je identifikátor výsledku, ktorý získame pomocou funkcie mysql_query,
- typVysledku je symbolická konštanta, ktorá môže mať hodnoty MYSQL_NUM, MYSQL_ASSOC alebo MYSQL_BOTH. Predvolená hodnota je MYSQL_BOTH.
- MYSQL_NUM - výsledky budú v tvare numerického poľa, teda poľa s indexmi 0, 1, ... počet atribútov výsedku,
- MYSQL_ASSOC - výsledky budú v tvare asociatívneho poľa, teda indexy budú názvy atribútov (napr: vysledok['CountryCode']),
- MYSQL_BOTH - výsledky budú v oboch formátoch.
V nasledujúcom príklade bude spôsob, akým vyberieme jeden záznam z výsledku dotazu a vypíšeme všetky hodnoty atribútov:
1 // v premennej data bude pole hotnot vsetkych atributov
2 $data=mysql_fetch_array($idVysledku);
3 // vypis tychto hodnot
4 echo $data["ID"].", ";
5 echo $data["Name"].", ";
6 echo $data["CountryCode"].", ";
7 echo $data["District"].", ";
8 echo $data["Population"];
alebo pomocou číselných indexov:
1 $data=mysql_fetch_array($idVysledku);
2 // vypis tychto hodnot
3 echo $data[0].", ";
4 echo $data[1].", ";
5 echo $data[2].", ";
6 echo $data[3].", ";
7 echo $data[4];
V oboch prípadoch sa vypíšu rovnaké údaje.
Keďže väčšinou nevieme, koľko je riadkov vo výsledku dotazu, budeme tieto výsledky vypisovať až pokým ich nevypíšeme všetky. Využijeme na to cyklus while:
1 // v premennej data bude pole hotnot vsetkych atributov
2 while ($data=mysql_fetch_array($idVysledku))
3 {
4 // vypis tychto hodnot
5 echo $data["ID"].", ";
6 echo $data["Name"].", ";
7 echo $data["CountryCode"].", ";
8 echo $data["District"].", ";
9 echo $data["Population"];
10 echo "<br/>"; // HTML znacka pre novy riadok
11 }
Výsledkom bude:
3210, Košice, SVK, Východné Slovensko, 242874 3211, Prešov, SVK, Východné Slovensko, 94977 3209, Bratislava, SVK, Bratislava, 432061 4080, Trenčín, SVK, Trenčiansky, 56215 4081, Prievidza, SVK, Trenčiansky, 52070
Pomocou pripravenej funkcie zobraz_vysledok_dotazu (pozri súbory na stiahnutie) môžeme zobraziť výsledok dotazu v tvare tabuľky: Pomocná funkcia zobraz_vysledok_dotazu sa nachádza v súbore funkcie.php (pozri prílohu).
Celý zdrojový kód pre prácu s databázou:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>DBS - Databázové systémy</title>
</head>
<body>
<?php
$link=mysql_connect("db.server","meno","heslo") or die("Chyba pri pokuse o nadviazanie spojenia");
mysql_select_db("student", $link) or die("Požadovanú databázu s nepodarilo vybrať");
mysql_query("SET NAMES 'utf8'");
$dotaz="SELECT * FROM city WHERE CountryCode = 'SVK' ";
$idVysledku = mysql_query($dotaz) or die ("pravdepodobne chybný dotaz");
echo "<p class='dotaz'>";
echo $sql;
echo "</p>";
zobraz_vysledok_dotazu($idVysledku);
mysql_close($link);
?>
</body>
</html>
Poznámka: Obsah funkcie zobraz_vysledok_dotazu je nasledovný:
<?php
function zobraz_vysledok_dotazu($res)
{
// zistenie, kolko je vo vysledku stlpcov
$field = mysql_num_fields( $res );
for ( $i = 0; $i < $field; $i++ ) {
//nazvy stlpcov si ulozime do pola $names
$names[] = mysql_field_name($res, $i);
}
// informativny vypis o pocte riaadkov vysledku
echo "<p>";
echo "Počet riadkov: ".mysql_num_rows($res);
echo "</p>";
//vysoledok bude formatovany v tabulke
echo "<table border='1'>";
//hlavicka tabulky
echo "<tr class='tabulka_hlavicka'>";
for ( $i = 0; $i < $field; $i++ )
{ //pocet hlaviciek sme si zistili v riaku c. 5
echo "<th>".$names[$i]."</th>";
}
echo "</tr>";
//data tabulky
//prikazom mysql_fetch_array vyberieme jeden (dalsi) zaznam vysledku dotazu
//ak uz dalsi zaznam neexistuje funkcia vrati prazdnu hodnotu a cyklus sa zastavi
while($data=mysql_fetch_array($res,MYSQL_NUM))
{
// zaciatok riadka
echo "<tr>";
//v kazdom riadku bude tolko buniek, kolko je stlpcov vo vysledku
for ( $i = 0; $i < $field; $i++ )
{
//v premennej $data su vysledky dotazu pre jeden riadok
echo "<td>".$data[$i]."</td>";
}
// koniec riadka
echo "</tr>";
}
// koniec tabulky
echo "</table>";
}
?>
Súbory na stiahnutie
- http://subory.fmtnuni.sk/ki_files/databazy/dbs1.zip,
- index.php - súbor obsahujúci samotnú HTML stránku (bez príkazov jazyka PHP),
- funkcie.php - súbor s pomocnými funkciami pre uľahčenie práce,
- dbs_styl.css - súbor s definíciou zobrazenia HTML stránky.
Zdroje a odkazy
- ↑ phpMyAdmin http://www.phpmyadmin.net
- ↑ konektory mySQL http://www.mysql.com/downloads/connector/
- ↑ Apache www.apache.org
- ↑ IIS - www.iis.net
- ↑ SET NAMES (mysql)http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
- ↑ mysq_fetch_array http://www.php.net/manual/en/function.mysql-fetch-array.php