Ingyenes fórum? Mi ez?
Az SG Ingyenes Fórum egy flexibilis, könnyen kezelhető fórumrendszer, amellyel színesebbé és látogatottabbá teheted a weblapodat. Ha webmester vagy, netalán hobbiból weblapot építesz vagy, regisztrálj SG Ingyenes fórumot, és tedd vele színesebbé, tartalmasabbá, interaktívvá a weblapodat!
Ebben a segédletben leírom egy nagyon egyszerű PHP chat működési elvét. A chatre jellemző, hogy bárki beléphet regisztráció nélkül és üzenetet küldhet. 50 üzenetet lehet egyszerre látni. a chat működéséhez MySQL adatbázisra lesz szükség.
MySQL tábla
A táblánk tárolni fog egy üzenet id-t, nicknevet, üzenetet és a küldés dátumát. Az id elsődleges kulcs lesz.
Ha rendelkezünk phpMyAdminnal, akkor hajtsuk végre a köv. SQL kérést:
CREATE TABLE chat ( id INT NOT NULL AUTO_INCREMENT, nick VARCHAR(20) NOT NULL, msg VARCHAR(200) NOT NULL, date DATETIME NOT NULL, PRIMARY KEY (id) ) TYPE = MYISAM;
De ha valakinek nincsen, ne búslakodjon, hanem írjon egy ilyesmi scriptet:
<?php include "config.inc.php";
mysql_query("CREATE TABLE chat ( id INT NOT NULL AUTO_INCREMENT, nick VARCHAR(20) NOT NULL, msg VARCHAR(200) NOT NULL, date DATETIME NOT NULL, PRIMARY KEY (id) ) TYPE = MYISAM;") or die("Nem lehet létrehozni a táblát!"); ?>
Ezt akár install.php néven is elmenthetjük. A config.inc.php-t később tárgyaljuk.
config.inc.php
Ez egy konfigurációs fájl, amiben csatlakozunk az adatbázishoz, és config.inc.php néven kell lementeni. Íme a forráskód:
<?php mysql_connect ("hosztod","neved","jelszavad") or die ("Nem lehet csatlakozni!"); mysql_select_db("adatbázisod") or die("Nem lehet kiválasztani az adatbázist!"); ?>
Ha bármely műveletet nem sikerülne végrehajtani, a script futása megszakad. Szerintem külön magyarázat nem kell. Hogy miért van ennek egy külön fájl? Hát azért, hogy pl.: nekem a localhoston más a jelszó mint a tárhelyemen, és nem kell folyton átírkálni, hanem elég ha csak a többi fájlt módosítom.
Stíluslap létrehozása
Én egy egyszerű CSS stíluslapra gondoltam, ami a törzset, a form elemeit és a vízszintes vonalat (<HR>) formázza. A chat úgy fog kinézni, mint a már régebben általam megírt vendégkönyv. Elvégre a stíluslap könnyen módosítható, ráadásul most a programozás a cél. Akkor lássuk a kódot:
body { background-color:#000000; color:#FFFFFF; font-family:'Arial'; font-size:12px; text-align:center; scrollbar-base-color:#666666; }
HR { width:100%; }
.input { border-color:#FFFFFF; border-width:1px; background-color:#666666; color:#FFFFFF; font-size:12px; font-family:"Arial"; scrollbar-base-color:#666666; width:400px; }
Belépés és üzenet küldése
Ezt a fájlt chat.php néven kell lementeni. Ezen lépünk be, küldünk üzeneteket. Az üzeneteket egy iframe ablakban látjuk. Belépéskor egy ilyen képet lát az user:

Üzenetküldéskor meg egy ilyet:

A Chappy helyett az user persze a megadott nevét látja. Az üdvözlő szöveg belépéskor is látszik. A beléptetés session alapú, tehát ha bezárják az ablakot, kilép az user. Mivel ez egy chat, az üzenet helye egy sor, el lehet Enter-rel is küldeni, de a küldésgombbal is. Akkor lássuk a scriptet (utána magyarázok):
<?php session_start(); if ($_POST[nick]) { $_SESSION[nick] = $_POST[nick]; //Beléptetés } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> <link rel="stylesheet" href="style.css" type="text/css">
<title>Chat</title> </head>
<body> <h3>Üdvözöllek a chat-en <?=$_SESSION[nick] ?></h3> <?php if ($_SESSION[nick]) { /*Ha blépett*/?> <form action="msg.php" method="post" enctype="application/x-www-form-urlencoded" target="msg" name="msg_send"> Üzenet<br> <input type="text" name="msg" class="input"><br> <input name="send" type="submit" class="input" value="..::Küldés::.."> </form> <?php } else {/*Ha be kell lépni*/?> <form action="chat.php" method="post" enctype="application/x-www-form-urlencoded" name="login"> Nick: <br> <input name="nick" type="text" class="input" maxlength=20><br> <input name="login" type="submit" class="input" value="..::Belépés::.."><br> </form> <?php } ?> <iframe name="msg" style="width:500px; " src="msg.php" height=500></iframe> </body> </html>
Először elindítjuk a minkamenetet, és belépünk. A létezik a $_POST[nick], vagyis az elküldött usernév, akkor a $_SESSION[nick] fogja ezt tovább tárolni. Ha a $_POST[nick] üres karakterlánc, akkor nem lép be. A törzsben feltűni az üdvözlés. a <?=$_SESSION[nick]; ?> azt jelenti, hogy kiíratja az $_SESSION[nick] változót. Nem akartam azt, hogy idegent írjon ki a látogatóknak, de így is értelmes magyar mondat. Ezután ha a $_SESSION[nick] változó nem üres, akkor az üzenetkülsét, ellenben pedig a belépési formot látjuk. Az <iframe> tag neve msg (mert ide küldjük az üzenetet, amit az első form target paraméterében megadtunk), szélessége és magassága egyaránt 500px. Az src paraméterben megadott msg.php az üzenetkiírató fájlt tartalmazza. Ezt a fájlt chat.php néven mentsük el!
Üzenetek megjelenítése
Az látodat egy ilyen képet fog látni (az üzenetek nem ezek lesznek):

Ez a script megjeleníti az utolsó 50 üzenetet, és ha több van, törli a maradékot. Azt is jelzi, ha nincs üzenet. Ha kapott üzenetet, akkor beszúrja azt az adatbázisba. Persze nem lehet HTML tageket küldeni, ezt egy egyszerű scripttel küszöböltem ki. Lássuk a scriptet:
<?php session_start(); include 'config.inc.php'; if ($_POST[msg] && $_SESSION[nick] != "") { //Ha üzenetet küldött $msg = str_replace(array("<",">"),array("<",">"),$_POST[msg]); //HTML tag kiszűrés mysql_query("INSERT INTO chat (id,nick,msg,date) values ('','$_SESSION[nick]','$msg',now())") or die("Nem lehet üzenetet küldeni!"); //Beszúrás }
$sql = mysql_query("SELECT *, date_format( date, '%H:%i') as r_date FROM chat ORDER BY date DESC LIMIT 50") or die("Hiba lekérdezés közben!"); //Megjelenítendő üzik $sql2 = @mysql_query("SELECT id FROM chat ORDER BY date DESC");
if (mysql_num_rows($sql2) > 50) { $id = mysql_result($sql2, 50, 'id'); //Törlés folyamata @mysql_query("DELETE FROM chat WHERE id < '$id'"); }
if (mysql_num_rows($sql) > 0) { //Ha van uzenet $text = "<h4>Üzenetek</h4>"; while ($array = mysql_fetch_array($sql)) { $text .= "<hr><p>[".$array['r_date']."] <b>".$array['nick'].": </b>".$array['msg']."</p>"; //Üzenet hozzáadása a kiírandó változóhoz } } else { $text = "<h4>Nincs még üzenet.</h4>"; //Ha nincs üzenet } ?> <html> <head> <meta http-equiv="refresh" content=4> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> <link rel="stylesheet" href="style.css" type="text/css">
<title>Chat</title> </head>
<body> <?=$text; ?> </body> </html>
Elkezdi a munkamenetet, megvizsgálja, hogy kapott-e üzenetet, és ha emellett az user be van lépve, akkor elküldi az üzenetet. Láthatjuk, hogy az str_replace() függvénynek tömbben adjuk át a cserélentő elemeket, és azt is, hogy mire cserélje.
Ezután két SQL kérést láthatunk. Az első a megjelenítendőket, a második az összeset lekérdezi. Az utóbbinál a @ jel azért van, hogy nem baj, ha hiba történt a lekérdezés közben, mert nem a törlés a fontos. Ezután ha több üzenet van 50-nél, akkor kikéri az 50. id-ját, és az ennél kisebbeket kitörli. Ezután ha van üzenet, a megjelenítendő üzeneteket tömbbe rakja, majd kiírja. A dátumot megformázva láthatjuk, óra:perc alakban. Ezt a scriptet msg.php néven mentsük el!
Ezután kész is a script. De ez nem igazán jó. Van egy buktatója. Bárki beléphet bárki nevével. Ezt a problémát regisztrációval lehet kiküszöbölni. |