Prakticky s MySQL - 2. díl

Dnes se s naším seriálem o MySQL a jeho možných využitích podíváme na ActiveX Data Objects a vytvoříme si vlastní internetový projekt, velmi jednoduchou diskusi.
Skript pro reprezentaci dat

Abychom si připomněli práci s jazykem MySQL v kombinaci s ASP a VBScriptem, začneme dnešní povídání na toto téma ukázkou reprezentace dat z imaginární tabulky příspěvků naší diskuse a vysvětlíme si na něm základní aspekty celého procesu při generování stránky. Schéma tohoto článku je postaveno tak, že si nejprve uvedeme kód programu, poté si ho postupně analyzujeme a ve zbytku článku si probereme postupně všechny nastíněné aspekty prvků Active X. Proto se kódů neděste, protože jsou vždy níže detailně popsány.

10    <%@ Language=VBScript %>
20    <html>
30    <head>
40    <meta http-equiv="Expires" content="0"> ` Zákaz cashování stránky
50    </head>
60    <%

70    ` Deklarace proměnných
80    Dim rsPole ` ADO Recordset
90    Dim mConn ` ADO Connection
100  Dim mCmd ` ADO Command
110  Dim vPocetZaznamu ` Čítač
120  Dim vBarvaPozadi ` Barva pozadí

130  ` Vytváření obejktů ADO
140  Set mConn = Server.CreateObject("ADODB.Connection") ` Vytvoření spojení
150  Set mCmd = Server.CreateObject("ADODB.Command") ` Vytvoření objektu Command
160  Set rsPole = Server.CreateObject("ADODB.Recordset") ` Vytvoření objektu Recordset

170  ` Nastavení parametrů připojení
180  mConn.CommandTimeout = 30 ` v sekundách
190  mConn.CursorLocation = 1 ` Na straně klienta
200  mConn.ConnectionString = "server.=127.0.0.1;driver=MySQL;" &_
"db=Diskuse;uid=root;pwd=heslo" ` Server je nyní localhost
210  mConn.Open

220  ` Nastavení dotazu
230  mCmd.ActiveConnection = mConn
240  mCmd.CommanedType = 1 ` Text
250  mCmd.CommandText = "SELECT * FROM Prispevky"

260 ` Otevření výsledku dotazu  vloženého do objektu mCmd
270  rsPole.Open mCmd,1,1 ` Standardní užití objektu Recordset s využitím objektu Command

280  %>
290  <body>
300  <table width="100%" border=0 cellPadding=2 cellSpacing=2>
310  <tr>
320  <td colspan=3 align=center><b>Diskuse u Růžového pantofle</b></td>
330  </tr>
340  <tr>
350  <td align=middle bgcolor=black style="color:white"><b>Autor</b></td>
360  <td align=middle bgcolor=black style="color:white"><b>Jméno příspěvku</b></td>
370  <td align=middle width=70% bgcolor=black style="color:white"><b>Příspěvek</b></td>
380  </tr>
390  <%

400  ` Vynulování čítače
410  vPocetZaznamu = 0

420  ` Procházení kolekce záznamů
430  Do Until rsPole.EOF

440  ` Podmínkový cyklus určující barvu pozadí
450  If vPocetZaznamu Mod 2 > 0 Then ` Pokud je vPocetZaznamu dělitelný dvěma
460  vBarvaPozadi = "#COCOCO"
470  Else
480  vBarvaPozadi = "#FFFFFF"
490  End If

500  ` Reprezentace dat v rámci tabulky
510  Response.Write "<tr>"
520  Response.Write "<td align=middle bgcolor=" & vBarvaPozadi & ">" & rsPole.Fields("Autor") & "</td>"
530 Response.Write "<td align=middle bgcolor=" & vBarvaPozadi & ">" & rsPole.Fields("Jmeno") & "</td>"
540  Response.Write "<td align=middle bgcolor=" & vBarvaPozadi & ">" & rsPole.Fields("Prispevek") & "</td>"
550  Response.Write "</tr>"

560  ` Posun na další záznam
570  rsPole.MoveNext

580  ` Zvýšení počtu záznamů čítače
590  vPocetZaznamu = vPocetZaznamu + 1
600  Loop
610  rs.Pole.Close
620  mConn.Close
630  %>
640  </table>
650  </body>
660  </html>

Nyní si probereme kód našeho skriptu. Na začátku definujeme používání jazyka VBScript v rámci tohoto ASP skriptu. Následuje počátek kódu HTML. V rámci jeho hlavičky nám tag META Expires definuje, že se naše stránka nebude ukládat do mezipaměti, což by nebylo v případě vypisování aktuálních příspěvků záhodno, proto hodnota tohoto argumentu je 0. Další kód ASP bude serverem proveden vždy před odesláním prohlížeči a jeho výsledek bude vypsán v čistém HTML. Řádky 70-120 obsahují definice proměnných. Do prvních tří proměnných se uloží objekty, proměnná vPocetZaznamu se bude inkriminovat o jednu s každým nově vypsaným příspěvkem. Podle něj se bude řídit další proměnná, vBarvaPozadi.

Tvorba objektů ADO

Na řádcích 130 - 160 probíhá vytváření instance objektu ADO. Nejdříve se na tento proces podíváme z pohledu akcí, které zde v našem programu probíhají. Do jednotlivých proměnných se nám uloží výsledky metody CreateObject objektu Server. Tento objekt je vestavěným prvkem aplikace IIS (Internet Information Server) spolu s dalšími šesti, Application, Request, Response, Session, ObjectContext a ASPErr, ale v rámci tohoto seriálu se posledními čtyřmi nebudeme zabývat.

Objekt Server

Jedna z jeho metod - CreateObject - tvoří na serveru instanci určitého objektu, úspěšnost tohoto procesu je závislá na existenci správných záznamů v registru serveru a korektní instalaci objektu, jehož instanci vytváříme.

Objekt Request

Pomocí tohoto objektu zjistíme hodnoty předané prohlížeči pomocí vlastnosti QueryString nebo Form. Ty jsou ukládány v asociativním poli tedy ve formátu název=hodnota. Záleží tedy na pojmenování pole v rámci formuláře, jenž je branou k našemu skriptu. Hodnotu proměnné Autor tedy zjistíme takto:

Request.QueryString("Autor")

Vzhledem k faktu, že vlastnost QueryString je nositelem všech informací zformulářečiURL(?Autor=jmeno&Jmeno=prispevek&Prispevek=obsah), je tato vlastnost u objektu Request implicitní a není ji tudíž nutné pojmenovávat jak ukazuje následující příklad.

Request("Autor")

Objekt Response

Posledním z v našem seriálu užitých objektů ADO je objekt Response, který zajišťuje vypsání dat v prohlížeči klienta pomocí metody Write.

Dokončení analýzy skriptu V našem skriptu se na řádcích 290 - 660 používá kód VBScriptu v souladu s jazykem HTML přesně tam, kde je třeba při reprezentaci dat. Nejprve vynulujeme náš čítač. Poté nám podmínkový cyklus Do While…Loop bude do té doby, dokud nevyčerpáme všechny položky naší kolekce, opakovat svůj blok příkazů, jenž vypisuje příspěvek diskuse. Dalším podmínkovým příkazem If…Then…Else řešíme barvu pozadí buněk dle čítače, pokud je hodnota našeho čítače dělená dvěma rovná celé číslo, jedná se o sudý záznam, v opačném případě se použije jiná barva pozadí buněk. Po vypsání dat do tabulky následuje přesun ukazatele na další záznam a inkriminace čítače. Na závěr skript zavře sadu záznamů a ukončí spojení se serverem spolu s korektním ukončením kódu HTML. Abychom správně pochopili systém práce s užitými ADO objekty, vyjádřím se nyní v několika tabulkách a postupech řešení práce se základními ActiveX Data Objects, které bychom mohli potřebovat při užívání technologie ASP.

ActiveX Data Objects

ActiveX data Objects je sada rozhraní pro přístup k datům, založená na objektech s optimalizací pro datové aplikace z oblasti webu. Společně se podíváme pouze na některé metody a vlastnosti pro programování MySQL ODBC v rámci 3. hlavních objektů ADO, Connection, Recordset a Command. Ty slouží k připojení k databázi, odesílání a následné reprezentaci dat dle našich dotazů.

Vlastnosti a metody objektu Connection

Základem programovacích rozhraní (API) je vytvoření spojení, což platí i u ADO, pro následující ukázku připojení k databázi prostřednictvím ADO si v přehledné tabulce krátce popíšeme objekt Connection.

Metoda nebo vlastnost Popis
Attributes Označuje jednu nebo více vlastností objektu připojení.
CommandTimeout Označuje, jak dlouho se bude čekat na dokončení příkazu, implicitně 30 sekund.
ConnectionString Propojovací řetězec poskytuje všechny připojovací údaje k databázi.
ConnectionTimeout Limit, po němž se v případě nevytvoření připojení generuje chyba.
CursorLocation Určuje, zda se sada záznamů načte u klienta nebo na straně serveru.
DefaultDatabase Z této vlastnosti se načítá jméno databáze, není-li určeno pomocí ConnectionString.
Open() Na základě údajů v ConnectionString otevře připojení k databázi.
Provider Název poskytovatele dat, u MySQL ODBC OLE DB.
State Určuje aktuální stav připojení.
Version Zobrazuje aktuálně používanou verzi objektu ADO.

Postup připojení k databázi MySQL pomocí VBScriptu a objektů ADO

1. Deklarujeme si proměnnou, jenž bude nositelem objektu Connection

Dim mConn

2. Uložíme si do proměnné instanci objektu Connection

Set mConn = Server.CreateObject("ADODB.Connection")

3. Nastavíme objektu Connection vlastnosti

mConn.CommandTimeout = 60
mConn.ConnectionTimeout = 60
mConn.CursorLocation = 3

4. Sestavíme propojovací řetězec dle následujících informací:, na pořadí jejich užití nezáleží

Server: název nebo IP
db: název databáze
driver: název ovladače ODBC, jenž se má užít
uid: uživatelské jméno
pwd: uživatelské heslo

mConn.ConnectionString="server= 127.0.0.1;db=Diskuse;"&_"driver=MySQL;uid=root;pwd=heslo"

Pokud používáme DSN, postačí nám jeho jméno:

MConn.ConnectionString("DSN=Diskuse")

5. Otevřeme připojení

mConn.Open

Vlastnosti a metody objektu Command

Dalším členem sady ADO je objekt Command. Slouží k vykonání SQL dotazů, úpravám struktur databází a vykonává i pro jednotlivé specifické příkazy databáze (např. MySQL). Opět se nejprve podíváme na jeho vlastnosti a metody.

Metoda nebo vlastnost Popis
ActiveConnection Nastavuje aktivní připojení pro všechny příkazy, lze propojit s otevřeným objektem Connection.
CommandText Řetězec neboli výraz příkazu, lze užít příkaz SQL,
CommandTimeout Stanoví časový limit čekání na vykonání příkazu.
CommandType Určuje typ příkazu: příkazový řetězec (1), tabulka (2).
Execute() Spouští příkazy CommandText.
Prepared Booleovská hodnota (True,False) určuje, zda se uloží kopie příkazu do paměti.
State Určuje, zda je připojení Command aktivní či zavřené.

Práce s objektem Command

1. Deklarujeme proměnnou, na níž budeme odkazovat coby na objekt Command

Dim mCmd

2. Do proměnné mCmd uložíme novou instanci metody CreateObject objektu Server.

Set mCmd = Server.CreateObject("ADODB.Command")

3. Přiřadíme objektu Command připojení.

mCmd.ActiveConnection = mConn

4. Nastavíme typ, text a časový limit příkazu.

mCmd.CommandType= 1
mCmd.CommandText= "SELECT * FROM Prispevky"
mCmd.CommandTimeout= 25

5. Podle druhu příkazu lze jeho vykonání vyvolat i metodou Execute (pokud provádíme změnu v záznamech).

mCmd.CommandText= "DELETE FROM Prispevky"
mCmd.Execute

Vlastnosti a metody objektu Recordset

Pro zobrazení výsledků dotazu se používá právě tento objekt, nejprve si klasicky zobrazme přehled jeho vlastností a metod.

Metoda nebo vlastnost Popis
AddNew() Přidá nový záznam do aktualizované sady záznamů.
BOF, EOF Vrací True nebo False podle toho, zda jsme na začátku či konci sady záznamů.
Clone() Vytvoří duplikát aktuální sady záznamů.
Close() Zavře aktuální sadu záznamů.
CursorType Určí typ kurzoru používaného v sadě záznamů.
Fields Obsahuje informace o každém poli v sadě záznamů.
Find(kritéria, skok, směr, start) Prohledává sadu záznamů dle kritérií.
LockType Určuje způsob zamykání záznamů v sadě.
Move() Přesune ukazatel na určený záznam výsledné sady.
MoveNext() Přesune ukazatel na další záznam výsledné sady.
MoveFirst() Přesune ukazatel na počátek sady záznamů.
MoveLast() Přesune ukazatel na konec sady záznamů.
MovePrevious() Přesune ukazatel na předchozí záznam výsledné sady.
MaxRecords Určuje maximální počet záznamů, který lze do sady záznamů vložit.
Open(Source, ActiveConnection. CursorType, LockType) Otevře sadu záznamů podle stanovených podmínek.
RecordCount Určuje počet záznamů v aktuální sadě záznamů.
Sort Určuje sadě záznamů, která pole má seřadit a v jakém pořadí, vzestupném nebo sestupném.
Source Určuje zdroj dat,což může být objekt Command, SQL příkaz či název tabulky.
Save(cíl, Format) Uloží sadu záznamů na určené místo v určeném formátu, v binární podobě či XML.
State Určuje, zda je sada záznamů otevřená nebo zavřená.
Status Číslo, jenž určuje status právě probíhající operace v aktuálním záznamu.
Update Doplněk metody AddNew, po jeho zadání se do databáze uloží veškeré záznamy přidané pomocí AddNew.

Práce s objektem Recordset

1. Deklarujeme si zástupnou proměnnou pro objekt Recordset.

Dim rsPole

2. Přiřadíme instanci objektu Recordset naší proměnné.

Set rsPole = Server.CreateObject("ADODB.Recordset")

3. Otevřeme objekt Recordset, nejčastěji pomocí aktivně připojeného objektu Command spolu s prázdným argumentem pro připojení, typem sady záznamů a způsobem zamykání záznamů.

RsPole.Open mCmd,1,1

V praxi se používají 4 argumenty pro otevření sady záznamů, Source (zdroj), ActiveConnection (aktivní připojení), CursorType (typ kurzoru) a LockType (zamykání záznamů). Prvním z nich je argument Source, kterým bývá nejčastěji objekt Command, ale je možno použít i příkaz SQL či název tabulky, s níž budeme pracovat. Pokud nepoužijeme objekt Command, musíme určovat i nepovinný argument metody Open, ActiveConnection. Třetí v řadě argumentů metody Open je CursorType, který definuje, jaké akce budou se sadou záznamů prováděny a jak budou ve výsledné sadě tyto záznamy zobrazeny dle následujících typů:

Keyset - Záznamy, které byly do databáze přidány až po otevření této sady, nebudou zobrazeny. Sady záznamů s tímto typem kurzoru dovolují pohyb dopředu i dozadu a zobrazené záznamy můžeme také odstraňovat či rozšiřovat.
Dynamic - Umožňuje pohyb dopředu i dozadu, změna nebo přidání záznamů do databáze se v této sadě zobrazí i v případě, že byla provedena až po jejím zobrazení.
Static - Není dovoleno ho upravovat, záznamy, přidané do databáze až po otevření této sady nebudou zobrazeny.
Lock - Ovladači ODBC lze zamykat záznamy následujícími způsoby:
           Read only - Lze pouze prohlížet.
           Pessimistic locking - Zamykání tabulky v průběhu úprav.
           Optimistic locking - Zamykání před metodou Update.

Dokončení diskusního fóra

Nyní nám již nic nebrání v dopracování na úvodu načrtnutého skriptu pro zobrazení dat z diskuse přidáním stránky, jenž bude sloužit pro přidání záznamu a adekvátního skriptu na ni navazujícího.

<html>
<script>
var c;
c = 0;
</script>
<body>
<form method="POST" action="pridej.asp" name="form">
<center>
<table width="450">
<tr><td colspan=2 align=center><b>Přispívání do diskuse u Růžového pantofle</b></td></tr>
<tr><td colspan=2 align=center><small>Prosím, nepište mi sem žádné sprosťárny, ať to nemusím zbytečně mazat, díky!!!</small></td></tr>
<tr><td align=left>Autor</td><td align=right>Jméno příspěvku</td></tr>
<tr><td align=left><input name="Autor"></td><td align=right><input name="Jmeno"></td></tr>
<tr><td colspan=2 align=center>< BR><textarea name="Prispevek"cols=40rows=5onfocus="javascript:if(c==0){c=1;form.Prispevek.value=``;}">TADY napiš co a jak:)</textarea>
</td></tr>
<tr><td colspan=2 align=center><input type=submit value="Přispěj"></td></tr>
</table>
</center>
</form>
</body>
</html>

Jedinou zajímavostí na tomto dokumentu byla javascriptová pasáž, která nám po 1. aktivování textového pole příspěvku smaže naše upozornění o tom, že je záhodno do ní psát příspěvky. Přesuňme se nyní ke skriptu pridej.asp, který odeslané data metodou POST převezme, zpracuje a vloží do naší databáze.

<%Language=VBScript%>
<head>
<title>Díky!!</title>
</head>
<%
` deklarace proměnných
Dim Conn
Dim Cmd
Dim Retezec

` vytvoření objektu ADO
Set Conn = Server.CreateObject("ADODB.Connection")
Set Cmd = Server.CreateObject("ADODB.Command")

` parametry připojení
Conn.CommandTimeout = 30
Conn.ConnectionString = "server=101.101.101.101;db=Diskuse;" &_
"uid=root;pwd=heslo;driver=MySQL"
Conn.Open

` sestavení řetězce SQL
Retezec = "INSERT INTO SeznamPrispevku"
Retezec = Retezec & "(ID, Autor, Jmeno, Prispevek)"
Retezec = Retezec & "VALUES(NULL, " &_
Request("Autor") & ", "
Retezec = Retezec & Request("Jmeno") & ", "
Retezec = Retezec & Request("Prispevek") & ")"

` sestavení příkazu
Cmd.ActiveConnection = mConn
Cmd.CommandTimeout = 60
Cmd.CommandType = 1

` přidání příkazu k objektu Command
Cmd.CommandText = Retezec

` vykonání dotazu
Cmd.Execute

`uzavření spojení
Conn.Close
%>

<body bgcolor=black text=white>
<center>
Dalším člověkem, který tu přispěl do diskuse, je <% Response.Write Request("Autor")%><br>
Díky za příspěvek, moc se mi líbí:-).
</center>
</body>

V našem posledním ASP skriptu v rámci tohoto seriálu si povšimněme hlavně fáze sestavování SQL dotazu, kde využíváme vestavěného objektu Request. Na konci celého skriptu poté ještě vypíšeme jméno uživatele, jenž přispěl do naší diskuse, pomocí objektu Response. Jak vidíte, tvořit stránky ASP společně s VBScriptem, ODBC a MySQL není žádný velký problém.

V příštím díle tohoto seriálu se podíváme na jazyk Perl a sami uvidíte, že rozhraní DBI taky není k zahození.

Diskuze (4) Další článek: Konec nadvlády nVidii a ATi, přichází SiS Xabre

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,