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.
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č 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.
Podívejme se nyní, jak se rozhraní ODBC používá v systému PHP.
Názvy všechny 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á tři 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é
nemusí 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 dvě tlačítka, která
slouží k vyvolání skriptu pro výpis obsahu naší tabulky resp. pro
přidání dalšího zaměstnance.
![]() |
![]() |