Telefonnφ seznam s wapov²m rozhranφm

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).

Obrßzek 3. Karta pro zadßnφ podmφnky pro vyhledßvßnφ

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).

Obrßzek 4. Karta s v²sledkem vyhledßvßnφ

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φ.

Obrßzek 5. P°idßnφ novΘho zßznamu do telefonnφho seznamu

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.

⌐ Ji°φ Kosek 2000-2001