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.