Jak pracujφ databßze na Webu
ZaΦlen∞nφ SQL do skript∙
Ji°φ Kosek ml.
Dnes se struΦn∞ seznßmφme s p°φkazy jazyka SQL pro mazßnφ a modifikaci zßznam∙ v tabulce. PotΘ si ukß₧eme, jak se dajφ SQL p°φkazy zaΦle≥ovat do skript∙.
Mazßnφ zßznam∙ v tabulce
K mazßnφ zßznam∙ v tabulce slou₧φ p°φkaz DELETE FROM. Zßznamy, kterΘ chceme smazat, musφme urΦit podmφnkou v klauzuli WHERE:
DELETE FROM jmΘno_tabulky WHERE podmφnka
Praktickß ukßzka smazßnφ zam∞stnance, jeho₧ osobnφ Φφslo je 1 023:
DELETE FROM Zamestnanci WHERE OsobniCislo = 1023;
Modifikace zßznamu v tabulce
Ke zm∞n∞ obsahu zßznamu slou₧φ p°φkaz UPDATE:
UPDATE jmΘno_tabulky SET polo₧ka=hodnota, ...
WHERE podmφnka
Ten modifikuje vÜechny zßznamy, kterΘ vyhovujφ podmφnce. Pokud chceme m∞nit pouze jeden zßznam -- to je ostatn∞ nejtypiΦt∞jÜφ p°φklad -- je vhodnΘ jako podmφnku uvΘst test primßrnφho klφΦe na jedineΦnou hodnotu:
UPDATE Zamestnanci SET Plat = 14 000
WHERE OsobniCislo = 1 023;
P°φkaz zm∞nφ plat Jana Novßka na 14 000 (osobnφ Φφslo pana Novßka je 1 023).
ZaΦle≥ovßnφ SQL do skript∙
ASP i PHP nabφzejφ pohodln² zp∙sob prßce s databßzemi prßv∞ pomocφ jazyka SQL. Prßce s databßzφ ve skriptu se sklßdß z n∞kolika krok∙. Nejprve je nutnΘ se k databßzi p°ipojit. PotΘ m∙₧eme na server odeslat dotaz v jazyce SQL. Zp∞t se nßm vrßtφ v²sledek, se kter²m m∙₧eme dßle pracovat -- vybφrat z n∞j jednotlivΘ zßznamy a polo₧ky. Dotazy a zpracovßnφ v²sledk∙ m∙₧eme provßd∞t opakovan∞ a nakonec bychom se m∞li od databßze odpojit.
My si dnes ukß₧eme nejjednoduÜÜφ p°φklad komunikace s databßzφ a tφm bude vypsßnφ obsahu nßm ji₧ znßmΘ tabulky Zamestnanci. Nejprve si cel² postup ukß₧eme v prost°edφ PHP za pou₧itφ nativnφho ovladaΦe pro databßzi MySQL.
Pro p°ipojenφ k databßzi slou₧φ funkce mysql_Connect(). Ta mß t°i parametry. Prvnφm z nich je adresa, na kterΘ je dostupn² SQL server. V naÜem p°φpad∞, kdy na jednom poΦφtaΦi b∞₧φ SQL i WWW server, pou₧ijeme adresu localhost. DalÜφ 2 parametry jsou jmΘno a heslo u₧ivatele, pod kter²m se k databßzovΘmu serveru p°ipojujeme. NaÜe pokusnß databßze "test" je vÜak p°φstupnß ka₧dΘmu, a proto m∙₧eme jmΘno a heslo vynechat. K p°ipojenφ tedy pou₧ijeme p°φkaz:
mysql_Connect("localhost");
K samotnΘmu provßd∞nφ SQL dotaz∙ pou₧ijeme funkci mysql. Ta mß 2 parametry -- prvnφm je jmΘno databßze, ve kterΘ chceme dotaz provΘst, a druh² parametr je samotn² SQL dotaz. Funkce vracφ hodnotu, pomocφ kterΘ pak m∙₧eme pracovat s v²sledkem dotazu. K vybrßnφ ·daj∙ o vÜech zam∞stnancφch poslou₧φ nßsledujφcφ k≤d:
$result = mysql("test",
"SELECT * FROM Zamestnanci");
P°es prom∞nnou $result je nynφ dostupn² v²sledek dotazu. Pokud nßs zajφmß poΦet zßznam∙, kter² vyhovuje naÜemu dotazu, m∙₧eme pou₧φt funkci mysql_NumRows($result).
Pro p°φstup k jednotliv²m polo₧kßm v²sledku slou₧φ funkce mysql_Result(). Ta mß 3 parametry:
mysql_Result(id_v²sledku,
Φφslo_zßznamu,
jmΘno_polo₧ky);
Zßznamy jsou ve v²sledku Φφslovßny od nuly a jejich poΦet zjistφme prßv∞ pomocφ funkce mysql_Result(). Pro vypsßnφ jmΘna prvnφho zam∞stnance, kter² vyhovuje naÜemu dotazu, m∙₧eme pou₧φt p°φkaz:
echo mysql_Result($result, 0, "Jmeno");
Pokud chceme vypsat vÜechny zßznamy, vytvo°φme si cyklus, kter² vÜechny zßznamy zpracuje. PoΦet iteracφ tohoto cyklu nßm urΦφ v²sledek funkce mysql_NumRows().
Nynφ ji₧ vφme vÜe, co je pot°eba pro vytvo°enφ naÜeho prvnφho skriptu pracujφcφho s databßzφ. Obsah tabulky Zamestnanci p°ehledn∞ zformßtujeme pomocφ tabulky:
<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>
<?
mysql_Connect("localhost");
$result = mysql("test",
"SELECT * FROM Zamestnanci");
$pocet = mysql_NumRows($result);
echo "V tabulce \"Zamestnanci\" je
$pocet zßznam∙.\n";
echo "
";
for($i=0; $i<$pocet; $i++):
echo "<TR>\n";
echo "<TD ALIGN=CENTER>".
mysql_Result($result, $i, "OsobniCislo").
"</TD>\n";
echo "<TD>".mysql_Result($result, $i, "Jmeno").
"</TD>\n";
echo "<TD>".mysql_Result($result, $i, "RC").
"</TD>\n";
echo "<TD>".mysql_Result($result, $i, "Adresa").
"</TD>\n";
echo "<TD ALIGN=RIGHT>".
mysql_Result($result, $i, "Plat").
"</TD>\n";
echo "</TR>\n";
endfor;
mysql_Close();
?>
</TABLE>
</BODY>
</HTML>
Pro pr∙chod vÜemi zßznamy v²sledku jsme s v²hodou pou₧ili cyklus for, jeho₧ °φdicφ prom∞nnou ($i) pou₧φvßme p°i odvolßvßnφ na jednotlivΘ zßznamy v²sledku.
Novinkou je funkce mysql_Close(), kterß uzav°e spojenφ s databßzφ.
Nynφ si ukß₧eme, jak stejnΘho v²sledku dosßhnout pomocφ ASP. ASP neobsahujφ nativnφ databßzovΘ ovladaΦe a p°φstup ke vÜem databßzφm musφme provßd∞t p°es rozhranφ ODBC.
To vÜak nebude jen tak. Nejprve musφme nainstalovat ODBC ovladaΦe pro nßÜ databßzov² server (MySQL) a pak pro po₧adovanou databßzi (test) vytvo°it datov² zdroj ODBC.
ODBC ovladaΦe pro MySQL nalezneme nap°. na ΦeskΘm zrcadle http://mirror.opf.slu.cz/mysql/ v souboru myodbc-2.50.17.zip nebo nov∞jÜφm. Po rozbalenφ zazipovanΘho archivu spustφme instalaΦnφ soubor setup.exe -- ODBC ovladaΦe pro MySQL jsou nainstalovßny.
Nynφ musφme vytvo°it datov² zdroj ODBC. Ten odpovφdß jednΘ databßzi a pomocφ n∞j mohou k databßzi p°istupovat vÜechny aplikace, kterΘ podporujφ ODBC. Pro vytvo°enφ zdroje spustφme v Ovlßdacφm panelu ikonu ODBC a vybereme zßlo₧ku System DSN. Nynφ pomocφ tlaΦφtka Add... p°idßme nov² datov² zdroj. V nßsledujφcφm dialogovΘm okn∞ jako server samoz°ejm∞ vybereme MySQL. Objevφ se okno (obr. 2) pro nastavenφ parametr∙ zdroje dat.
Do pole Windows DSN Name vyplnφme jmΘno datovΘho zdroje. DoporuΦuji pro datov² zdroj pou₧φt jmΘno stejnΘ, jako mß databßze -- alespo≥ se v tom pozd∞ji vyznßme. Mezi dalÜφ d∙le₧itΘ parametry pat°φ jmΘno databßze (test) a adresa serveru (localhost). Parametry doporuΦuji nastavit na hodnotu 256, kterß zamezφ p°φpadn²m problΘm∙m s n∞kter²mi starÜφmi aplikacemi.
Nynφ se dostßvßme k samotnΘmu principu prßce s databßzemi v ASP. Ten je obdobn² jako u PHP. Nejprve se musφme k p°ipojit k datovΘmu zdroji. Vytvo°φme si proto objekt spojenφ, kter² slou₧φ pro p°ipojovßnφ ke zdroj∙m dat:
Set spojeni = Server.CreateObject("ADODB.Connection")
K samotnΘmu p°ipojenφ slou₧φ metoda Open, jejφm₧ parametrem je identifikace datovΘho zdroje. My pou₧ijeme datov² zdroj test:
spojeni.Open "DSN=test"
Pro zadßvßnφ dotaz∙ a zpracovßnφ jejich v²sledk∙ musφme vytvo°it objekt typu Recordset -- pojmenujeme jej t°eba vysledek:
Set vysledek = Server.CreateObject("ADODB.Recordset")
SQL dotaz se spouÜtφ pomocφ metody Open, kterß mß jako druh² parametr ji₧ vytvo°enΘ spojenφ k po₧adovanΘmu datovΘmu zdroji:
vysledek.Open "SELECT * FROM Zamestnanci", spojeni
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>