COMPUTERWORLD
 

profil kontakt CD-ROM CW100 předplatné

archiv anketa CO VY NA TO? CW kariéra seriály
 

IDG

IDG CZ homepage
COMPUTERWORLD
PC WORLD
INTERNET4U
MEGABYTE
TESTCENTRUM
ON-LINE






COMPUTERWORLD 37/98

Jak pracují databáze na Webu
Zpřístupnění databáze přes webové rozhraní

Jiří Kosek ml.

V minulém díle jsme si ukázali, jak přistupovat k databázi pomocí nativního ovladače v PHP. Rovněž jsme nakousli způsob připojení databáze přes rozhraní ODBC v ASP. Dnes dokončíme práci s ODBC v ASP a pak si ukážeme, jak využívat rozhraní ODBC v PHP. Předtím se ještě seznámíme s některými důvody, které hovoří pro používání ODBC při přístupu k databázím.

Práce s ODBC v ASP

V ASP se již umíme připojit k databázi a provést v ní dotaz. Výsledek dotazu je nyní přístupný pomocí objektu vysledek. Při práci s databázemi přes ODBC nemůžeme přistupovat náhodně k libovolnému záznamu výsledku, ale musíme je procházet postupně. K pohybu na další záznam výsledku slouží metoda MoveNext. Pomocí metody EOF můžeme zjistit, zda výsledek obsahuje ještě nějaké nezpracované záznamy. K jednotlivým položkám aktuálního záznamu se dostaneme pomocí volání vysledek.fields("jméno_položky"). Skript pro vypsání obsahu tabulky vypadá v ASP následovně:

<HTML>
<HEAD>
<TITLE>Výpis všech zaměstnanců</TITLE>
</HEAD>
<BODY>
<H1>Výpis všech zaměstnanců</H1>
<TABLE BORDER=1 CELLPADDING=2>
<TR><TH>Osobní číslo</TH>
<TH>Jméno</TH>
<TH>Rodné číslo</TH>
<TH>Adresa</TH>
<TH>Plat</TH>
</TR>
<%
Set spojeni = Server.CreateObject("ADODB.Connection")
spojeni.Open "DSN=test"
Set vysledek = Server.CreateObject("ADODB.Recordset")
vysledek.Open "SELECT * FROM Zamestnanci", spojeni
Do Until vysledek.EOF
Response.Write "<TR>" & vbNewLine
Response.Write "<TD ALIGN=CENTER>"
Response.Write vysledek.fields("OsobniCislo")
Response.Write "</TD>" & vbNewLine
Response.Write "<TD>" & vysledek.fields("Jmeno")
Response.Write "</TD>" & vbNewLine
Response.Write "<TD>" & vysledek.fields("RC")
Response.Write "</TD>" & vbNewLine
Response.Write "<TD>" & vysledek.fields("Adresa")
Response.Write "</TD>" & vbNewLine
Response.Write "<TD ALIGN=RIGHT>"
Response.Write vysledek.fields("Plat")
Response.Write "</TD>" & vbNewLine
Response.Write "</TR>" & vbNewLine
vysledek.MoveNext
Loop
%>
</TABLE>
</BODY>
</HTML>

Velkou výhodou ODBC je, že stejným způsobem můžeme přistupovat k libovolné databázi. Pokud se tedy z nějakého důvodu změní SQL server, na kterém běží naše aplikace, nemusíme měnit v PHP skriptech žádný kód. Stačí upravit mapování datových zdrojů na databáze v konfiguračním programu ODBC.

Počáteční nevýhodou, která mluvila proti použití ODBC, byl nižší výkon oproti nativním ovladačům. Staré ODBC ovladače sloužily pouze jako mezistupeň mezi aplikací a nativním protokolem databáze. Novější ODBC ovladače jsou však optimalizovány a k databázovému serveru přistupují přímo -- jejich výkon je srovnatelný s použitím nativních ovladačů.

Poslední otázka, která se nabízí, se týká využitelnosti ODBC na jiných platformách, než jsou Windows. ODBC bylo původně vyvinuto pro platformu Windows, ale dnes jeho implementace existuje i pro všechny významnější verze operačního systému Unix.

Použití ODBC v PHP

Podívejme se nyní, jak se rozhraní ODBC používá v systému PHP. Názvy všech funkcí pro práci s ODBC až neuvěřitelně začínají písmeny ODBC. Nejprve se musíme připojit k datovému zdroji pomocí funkce ODBC_Connect(). Ta má 3 parametry -- jméno datového zdroje, jméno a heslo uživatele, pod kterým se ke zdroji připojujeme. Funkce vrací identifikátor spojení. Pokud se ke zdroji nelze připojit, vrací funkce hodnotu false.

Vrácení této hodnoty bychom měli vždy ošetřit, protože se může stát, že se nepodaří k databázovému serveru připojit. V našich skriptech bychom měli vždy testovat a ošetřit všechny možné chybové stavy -- jen tak se pozná dobře napsaná aplikace.

K provádění SQL dotazů slouží funkce ODBC_Exec(). Jejími parametry jsou identifikátor spojení a SQL dotaz. Funkce vrací výsledek dotazu. Pokud při provádění SQL dotazu došlo k chybě, vrací funkce false -- další místo v našem skriptu, kde bychom měli testovat chyby.

K získání jedné řádky výsledku slouží funkce ODBC_Fetch_Row(vysledek). Funkce vrací true, pokud se podařilo získat další záznam. Pro přístup k položkám aktuálního záznamu slouží funkce ODBC_Result(vysledek, položka).

Výsledný skript je o něco delší než předchozí, protože jsme do něj přidali nezbytné ošetření chyb -- znovu opakuji, že by nemělo chybět v žádném skriptu.

<HTML>
<HEAD>
<TITLE>Výpis všech zaměstnanců</TITLE>
</HEAD>
<BODY>
<H1>Výpis všech zaměstnanců</H1>
<TABLE BORDER=1 CELLPADDING=2>
<TR><TH>Osobní číslo</TH>
<TH>Jméno</TH>
<TH>Rodné číslo</TH>
<TH>Adresa</TH>
<TH>Plat</TH>
</TR>
<?
@$spojeni = ODBC_Connect("test", "", "");
if (!$spojeni):
echo "<TR><TH COLSPAN=5>Nepodařilo se připojit
k databázi!</TH></TR>";
else:
@$vysledek = ODBC_Exec($spojeni,
"SELECT * FROM Zamestnanci");
if (!$vysledek):
echo "<TR><TH COLSPAN=5>Chyba při provádění
SQL dotazu!</TH></TR>";
else:
while(ODBC_Fetch_Row($vysledek)):
echo "<TR>\n";
echo "<TD ALIGN=CENTER>".
ODBC_Result($vysledek, "OsobniCislo").
"</TD>\n";
echo "<TD>".ODBC_Result($vysledek, "Jmeno").
"</TD>\n";
echo "<TD>".ODBC_Result($vysledek, "RC").
"</TD>\n";
echo "<TD>".ODBC_Result($vysledek, "Adresa").
"</TD>\n";
echo "<TD ALIGN=RIGHT>".
ODBC_Result($vysledek, "Plat").
"</TD>\n";
echo "</TR>\n";
endwhile;
endif;
ODBC_Close($spojeni);
endif;
?>
</TABLE>
</BODY>
</HTML>

Zajímavostí je použití zavináče (@) před příkazy, které nemusejí být vždy provedeny úspěšně. Zavináč potlačí vypsání chybového hlášení PHP, které může běžného uživatele zděsit. Lepší je chybu ošetřit po svém a uživatele informovat nějakým srozumitelným způsobem. Na obrázku 1 si můžete prohlédnout, jak stránka dopadne, když dojde k chybě a nepoužijeme zavináč.

Do skriptu lze vložit libovolný SQL příkaz a tak můžeme pomocí skriptů provádět s tabulkami v databázi libovolné operace. Nyní si ukážeme, jak můžeme přes webové rozhraní jednoduše přidávat nové záznamy do tabulky Zamestnanci. Nejprve vytvoříme formulář, který bude sloužit k zadání údajů o novém zaměstnanci uživatelem. Uložíme jej např. do souboru 15-02.php3:

<HTML>
<HEAD>
<TITLE>Přidání nového záznamu do tabulky Zamestnanci</TITLE>
</HEAD>
<BODY>
<H1>Přidání nového záznamu do tabulky Zamestnanci</H1>
<STRONG>Zadejte údaje o novém zaměstnanci:</STRONG>
<FORM ACTION=15-03.php3>
<TABLE>
<TR><TD>Osobní číslo:<TD><INPUT NAME=OsobniCislo>
<TR><TD>Jméno:<TD><INPUT NAME=Jmeno>
<TR><TD>Rodné číslo:<TD><INPUT NAME=RC>
<TR><TD>Adresa:<TD><INPUT NAME=Adresa>
<TR><TD>Plat:<TD><INPUT NAME=Plat>
<TR><TH COLSPAN=2><INPUT TYPE=Submit VALUE="Přidání zaměstnance">
</TABLE>
</FORM>
</BODY>
</HTML>

K obsluze formuláře slouží skript 15-03.php3, který obstará samotné vložení údajů z formuláře do tabulky:

<HTML>
<HEAD>
<TITLE>Přidání nového záznamu do tabulky Zamestnanci</TITLE>
</HEAD>
<BODY>
<?
@$spojeni = ODBC_Connect("test", "", "");
if (!$spojeni):
echo "<H1>Nepodařilo se připojit k databázi!</H1>";
else:
@$vysledek = ODBC_Exec($spojeni,
"INSERT INTO Zamestnanci VALUES(
$OsobniCislo, '$Jmeno', '$RC',
'$Adresa', $Plat)");
if (!$vysledek):
echo "<H1>Nový záznam se nepodařilo přidat!</H1>";
else: ?>
<H1>Nový záznam byl úspěšně přidán</H1>
<FORM ACTION=15-01.php3>
<INPUT TYPE=Submit
VALUE="Prohlížení seznamu zaměstnanců">
</FORM>
<FORM ACTION=15-01.php3>
<INPUT TYPE=Submit
VALUE="Přidání nového zaměstnance">
</FORM>
<?
endif;
ODBC_Close($spojeni);
endif;
?>
</BODY>
</HTML>

Do stránky jsme navíc pomocí formulářů vložili 2 tlačítka, která slouží k vyvolání skriptu pro výpis obsahu naší tabulky, resp. pro přidání dalšího zaměstnance.

 

 

© IDG Czechoslovakia, a.s., Všechna práva vyhrazena
info@idg.cz, webmaster@idg.cz