Jak skloubit PHP, SQL a WML dohromady nßm demonstruje nßsledujφcφ p°φklad jednoduchΘ wapovΘ aplikace, kterß umo₧nφ prohledßvßnφ telefonnφho seznamu a p°idßvßnφ nov²ch zßznam∙. P°idßnφ nov²ch zßznam∙ bude navφc umo₧n∞no jen osobßm se znalostφ specifickΘho jmΘna a hesla.
P°φklad 2. Vyhledßvßnφ v telefonnφm seznamu û seznam.php
<? Header("Content-Type: text/vnd.wap.wml"); echo '<?xml version="1.0" encoding="iso-8859-2"?>'; ?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.dtd"> <wml> <card title="Telefonnφ seznam" id="vstup"> <p> Zadejte hledanΘ jmΘno:<br/> <input name="jmeno"/><br/> <a href="seznam.php?jmeno=$(jmeno)#vysledek">Hledej</a> </p> <p><a href="novy.php">NovΘ Φφslo</a></p> </card> <? if (IsSet($jmeno)): ?> <card title="Telefonnφ seznam" id="vysledek"> <? MySQL_PConnect("localhost", "jkj", "heslo"); MySQL_Select_DB("jkj"); $vysledek = MySQL_Query("SELECT * FROM Telefony WHERE Jmeno LIKE '%$jmeno%' ORDER BY Jmeno"); echo "<p>PoΦet nalezen²ch zßznam∙: " . MySQL_Num_Rows($vysledek) . "</p>\n"; while ($zaznam = MySQL_Fetch_Array($vysledek)) { echo "<p><b>" . $zaznam['Jmeno'] ."</b>: "; echo "<a href='wtai://wp/mc;" . $zaznam['Telefon'] . "'>" . $zaznam['Telefon'] . "</a><br/>"; echo $zaznam['Email']. "</p>\n"; } ?> <p><a href="#vstup">NovΘ hledßnφ</a></p> </card> <? endif ?> </wml>
SamotnΘ prohledßvßnφ v seznamu umo₧≥uje skript seznam.php. P°i prvnφm volßnφ skript vygeneruje strßnku s jednou kartou, kterß umo₧≥uje zadßnφ hledanΘho jmΘna a spuÜt∞nφ hledßnφ (obrßzek 3).
Zadßnφ podmφnky pro hledßnφ zp∙sobφ zaslßnφ novΘho po₧adavku na webov² server. Ten vygeneruje novou strßnku, kterß krom∞ karty pro zadßnφ v²sledk∙, obsahuje kartu, do kterΘ se vygenerujφ v²sledky hledßnφ v databßzi (obrßzek 4).
Vyu₧φvß se p°itom n∞kolika funkcφ, kterΘ jeÜt∞ neznßme. Funkce MySQL_Num_Rows() vracφ poΦet zßznam∙, kterΘ jsou v²sledkem SQL p°φkazu SELECT. Jako parametr musφme funkci p°edat identifikßtor v²sledku, kter² vracφ funkce MySQL_Query().
Pro sekvenΦnφ zpracovßnφ v²sledku pou₧φvßme funkci MySQL_Fetch_Array(). Ta postupn∞ vracφ jednotlivΘ zßznamy v²sledku. Ka₧d² zßznam je vrßcen jako asociativnφ pole, kterΘ umo₧≥uje nßsledn∞ velice jednoduÜe p°istupovat k jednotliv²m polo₧kßm zßznamu. Po zpracovßnφ vÜech zßznam∙ funkce vracφ false, a cyklus while pro zpracovßnφ v²sledku se ukonΦφ.
Uvnit° cyklu kombinujeme statick² WML k≤d s hodnotami z databßze. Z ka₧dΘho zßznamu vygenerujeme jmΘno, telefonnφ Φφslo (vΦetn∞ odkazu vyu₧φvajφcφho WTAI) a emailovou adresu. Dostaneme WML k≤d s nßsledujφcφ strukturou:
<p><b>Jan Novßk</b>: <a href='wtai://wp/mc;+420212345678'>+420212345678</a><br/> novak@mail.cz</p>
Na kart∞ s vyhledßvßnφm je odkaz, kter² volß dalÜφ skript novy.php. Ten umo₧≥uje vlo₧enφ novΘho zßznamu. Strßnka obsahuje jen n∞kolik vstupnφch polφ a odkaz, kter² tato pole odeÜle dalÜφmu skriptu, jen₧ provede samotnΘ p°idßnφ do databßze.
P°φklad 3. P°idßnφ novΘho zßznamu û novy.php
<? require "./auth.php"; echo '<?xml version="1.0" encoding="iso-8859-2"?>'; ?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="Nov² u₧ivatel"> <do type="prev" label="Zp∞t"> <prev/> </do> <p>JmΘno: <input name="jmeno" type="text" format="*M" emptyok="false"/><br/> Telefon: <input name="telefon" type="text" format="*N" emptyok="false"/><br/> E-mail: <input name="email" type="text" format="*m" emptyok="true"/> </p> <p> <anchor>P°idej <go href="novy-insert.php"> <postfield name="jmeno" value="$(jmeno)"/> <postfield name="telefon" value="$(telefon)"/> <postfield name="email" value="$(email)"/> </go> </anchor> </p> </card> </wml>
Ve v∞tÜin∞ aplikacφ samoz°ejm∞ nechceme, aby data mohl modifikovat kdokoliv. V t∞chto p°φpadech b²vß aplikace ochrßn∞na jmΘnem a heslem, bez jeho₧ znalosti se na chrßn∞nΘ strßnky nedostaneme. Protokol WSP obsahuje obdobu HTTP autentifikace. Mikroprohlφ₧eΦi tedy m∙₧eme zaslat specißlnφ hlaviΦky, kterΘ si vy₧ßdajφ zadßnφ jmΘna a hesla od u₧ivatele.
Pot°ebn² k≤d je ulo₧en ve skriptu auth.php, kter² naΦφtßme na zaΦßtku chrßn∞n²ch strßnek. Skript testuje jmΘno a heslo zaslanΘ u₧ivatelem. Pokud jmΘno nenφ admin a heslo traktor, poÜle skript zp∞t klientovi ₧ßdost o zadßnφ jmΘna a hesla a skript se ukonΦφ (p°φkazem exit). Dorazφ-li sprßvnΘ jmΘno a heslo, skript se neukonΦφ a m∙₧eme generovat WML strßnku obvykl²m zp∙sobem.
P°φklad 4. Ochrßn∞nφ strßnky jmΘnem a heslem û auth.php
<? if (!IsSet($PHP_AUTH_USER) or !($PHP_AUTH_USER=="admin" && $PHP_AUTH_PW=="traktor")): Header("HTTP/1.0 401 Unauthorized"); Header("WWW-Authenticate: Basic realm=\"telseznam\""); Header("Content-Type: text/vnd.wap.wml"); echo '<?xml version="1.0" encoding="iso-8859-2"?>'; ?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.dtd"> <wml> <card title="POZOR!!!"> <p>Pokus o neoprßvn∞n² p°φstup!</p> <p>Pro p°φstup na tyto strßnky pot°ebujete znßt jmΘno a heslo.</p> <p><a href="<?echo "$SCRIPT_NAME?r=" . UniqId("")?>">P°ihlßsit znovu</a></p> </card> </wml> <? exit; endif; Header("Content-Type: text/vnd.wap.wml"); ?>
Pro konkrΘtnφ server si mikroprohlφ₧eΦ jmΘno a heslo pamatuje, tak₧e je pak u₧ivatel nemusφ zadßvat na ka₧dΘ chrßn∞nΘ strßnce, ale jen na ·vodnφ.
JmΘno, telefonnφ Φφslo a e-mail, kterΘ vyplnφ u₧ivatel, jsou odeslßny skriptu novy-insert.php. Ten se postarß o p°idßnφ do databßze. Jen poznamenejme, ₧e hodnoty vstupnφch polφ jsou ve skriptu dostupnΘ v prom∞nn²ch s odpovφdajφcφm nßzvem û m∙₧eme je snadno doplnit do SQL p°φkazu.
P°φklad 5. Vlo₧enφ novΘho zßznamu û novy-insert.php
<? require "./auth.php"; echo '<?xml version="1.0" encoding="iso-8859-2"?>'; ?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="Nov² u₧ivatel"> <do type="prev" label="P°idat dal╣φho"> <prev/> </do> <? MySQL_PConnect("localhost", "jkj", "heslo"); MySQL_Select_DB("jkj"); $vysledek = MySQL_Query("INSERT INTO Telefony (Jmeno, Telefon, Email) VALUES ('$jmeno', '$telefon', '$email')"); if ($vysledek) echo "<p>Nov² zßznam byl ·sp∞╣n∞ p°idßn.</p>"; else echo "<p>P°i p°idßvßnφ zßznamu do╣lo k chyb∞.</p>"; ?> <p><a href="seznam.php">Zp∞t do seznamu</a></p> </card> </wml>
Celou aplikaci si m∙₧ete vyzkouÜet na adrese http://www.yo.cz/pages/jkj/seznam.php.