On-Line Chat v PHP 4.

V posledním díle seriálu se podrobněji podíváme na zbývající dva php skripty a těmi jsou: chatbox.php a chatroom.php. Soubor chatbox.php se bude starat o zobrazení a vyhodnocení formuláře, do nějž bude uživatel psát své příspěvky. Druhý soubor již bude zobrazovat samotné okno chatu s příspěvky patřící aktuálnímu uživateli.

V posledním díle seriálu se podrobněji podíváme na zbývající dva php skripty a těmi jsou: chatbox.php a chatroom.php. Soubor chatbox.php se bude starat o zobrazení a vyhodnocení formuláře, do nějž bude uživatel psát své příspěvky. Druhý soubor již bude zobrazovat samotné okno chatu s příspěvky patřící aktuálnímu uživateli.

chatbox.php

  • Nejprve skript ověří platnost hesla a id uživatele funkcí kontrola().
  • Pokud skriptu přijdou z formuláře odeslaná data, vyhodnotí je. Pokud je zpráva určena konkrétnímu uživateli (je pod zámkem), skript nejdříve zjistí, zda je tento uživatel ještě aktivní. Pokud ano, bude se do tabulky chatroom vkládat i nick příjemce. Pokud takový uživatel nebude nalezen, bude zpráva určena všem chatujícím. Nakonec se do tabulky active k přispívajícímu uživateli uloží aktuální čas.
  • Po tom co skript vyhodnotí případná příchozí data, zobrazí HTML stránku obsahující formulář pro odesílání příspěvků.

Nyní následuje výpis zdrojového kódu skriptu chatbox.php:

<?
require "./obecne.php";
$z = kontrola(); // kontrola hesla
$cas = Time();
$limit = $cas - 600;
if ($send && $kec !=""): // pokud byly odesány data
if ($komu > 0): // pokud je definován příjemce
@$v = mysql_query("SELECT nick FROM active WHERE id = '$komu'");
@$x = mysql_fetch_row($v);
$komunick = $x[0];
else: // pokud není určen příjemce
$komu = 0;
$komunick = "";
endif;
// odstraníme z příspěvku HTML tagy
$kec = HTMLSpecialChars($kec);
// vložíme příspěvek do databáze
@$v = mysql_query("INSERT INTO chatroom
VALUES ('','$id','$z[0]','$komu',
'$komunick','$cas','$kec')");
// aktualizujeme čas poslední odezvy uživatele
@$v = mysql_query("UPDATE active SET cas = '$cas' WHERE id = '$id'");
endif;
// začátek výstupu skriptu
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
?>
<HTML>
<HEAD><TITLE>CHAT</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#0000000">
<FORM ACTION="chatbox.php" METHOD="POST">
<INPUT TYPE=HIDDEN NAME="id" VALUE="<?echo $id?>">
<INPUT TYPE=HIDDEN NAME="pass" VALUE="<?echo $pass?>">
<INPUT TYPE=HIDDEN NAME="send" VALUE="true">
<INPUT TYPE=TEXT NAME="kec" MAXLENGTH=255 SIZE=50>
<SELECT NAME="komu">
<OPTION VALUE="0">Všem</OPTION>
<?
// zobrazíme v SELECTu všechny aktivní uživatele
@$v = mysql_query("SELECT id,nick FROM active WHERE cas > '$limit'");
while ($z = mysql_fetch_row($v))
{
echo "<OPTION VALUE=\"$z[0]\">$z[1]</OPTION>";
}
?>
</SELECT>
<INPUT TYPE=SUBMIT VALUE="ODESLAT">
</FORM>
</BODY></HTML>

chatroom.php

A na závěr si popíšeme funkčnost skriptu chatroom.php, který se stará o zobrazení samotného okna s příspěvky uživatelů – tudíž tím nejpodstatnějším. Skript plní nejdůležitější roli, ale je ve skutečnosti nejjednoduchším z dosud uvedeným.

  • Nejprve se ověří heslo a id uživatele, tak jak tobu bylo v předchozích skriptech.
  • Poté skript vybere z databáze maximálně dvacet posledních zpráv, které jsou:
    1. určeny všem uživatelům
    2. určeny pouze uživateli, který o skript požádal
    3. uživatel žádající o skript je autorem zamčené zprávy

    a pokud takové najde, zobrazí je na výstupní HTML stránce.

Výpis zdrojového kódu souboru chatroom.php:

<?
require "./obecne.php";
$z = kontrola(); // kontrola hesla a id
// výstup HTML stránky
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
?>
<HTML>
<HEAD><TITLE>ChatRoom</TITLE>
<META HTTP-EQUIV="refresh" CONTENT="15; URL=">
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<?
// z databáze vybereme posledních dvacet zpráv,
// tyto zprávy jsou buď veřejné, zamčené a jsou
// pro uživatele, který o skript požádal, nebo
// jsou přímo jeho příspěvkem
@$v = mysql_query("SELECT nick,zprava,pro,proid,nickid
FROM chatroom WHERE nickid = '$id'
OR proid = '0' OR proid = '$id'
ORDER BY cas DESC LIMIT 0,20");
@$p = mysql_num_rows($v);
// pokud nějaké takovéto zprávy existují, zobrazíme je
if ($p > 0):
echo "<TABLE BORDER=0 ALIGN=CENTER WIDTH=100%>";
while ($z = mysql_fetch_row($v))
{
if ($z[3] > 0 && $z[4] == $id)
echo "<TR><TD ALIGN=LEFT><B>Od tebe pro <I>$z[2]:</I></B>
$z[1]</TD></TR>\n";
elseif ($z[3] > 0 && $z[4] != $id)
echo "<TR><TD ALIGN=LEFT><B>Pro tebe od <I>
$z[0]:</I></B> $z[1]</TD></TR>\n";
else
echo "<TR><TD ALIGN=LEFT><B>$z[0]:</B> $z[1]</TD></TR>\n";
}
echo "</TABLE>\n";
endif;
foot();
?>

Závěrem článku upozorňuji na fakt, že článek není příliš vhodný pro uplné začátečníky v jazyce PHP. Článek vyžaduje alespoň jeho základní znalosti, stejně jako základní znalosti jazyka SQL potažmo znalostí MySQL databáze. Článek měl sloužit jako návod jak vytvořit vlastní náročnější webové aplikace, popsat Vám jak vlastně chat funguje, neměl sloužit jako „stavebnice“ konkrétního chatu a to už jen pro to, že je opravdu hodně prostý. Mírnou modifikací zde uváděných skriptů však můžete docílit opravdu kvalitního chatu. Je však třeba přidat podporu neregistrovaných nicků, možnost používat více místností, možnost definice vlastností jednotlivých roomů atd. Vše závisí jen na Vaši fantazii a schopnostech.

Berte prosím tento seriál s nahledem, byl psán před více jak jedenácti lety. Dnes je běžné, že podobné chat aplikace se píší bez ukládání dat v databázi – využívají sdílené paměti.

Navigace v seriálu← On-Line Chat v PHP 3.