PHP + TXT alapú vendégkönyv
A következő segédletben egy egyszerű php+txt alapú vendégkönyvet mutatok be, amelyen keresztül kommunikálhatnak a látogatóid egymással. Nincs hozzá szükség mysql adatbázisra. Ez egy egyszerű felépítésű vendégkönyv, bárki könnyedén elkészítheti, kibővítheti! Ebben a segédletben szövegfájlt használunk az adatok tárolására, a következőben ugyan ezt a vendégkönyvet átírjuk mysql adatbázis alá.
Az üzeneteket txt fájlban fogjuk tárolni, soronként. Ilyen formában:
Név|E-mail cím|Dátum|Üzenet\n
Név|E-mail cím|Dátum|Üzenet\n
...
Lássunk hozzá!
Első lépésben hozz létre egy üres fájlt, legyen a neve config.php
$per_page = 5; //Uzenetek egy oldalon
$handler = "gb.txt"; //Tarolo file
Ezt fogjuk majd meghívni a szükséges helyeken. Fontos, hogy nem tettem ?> jelet a file végére, ez azért van, mert a csak php kódot tartalmazó fájlokat ha include-oljuk, azt megtehetjük akkor is, ha még nem szabad outputra írnunk. Ha viszont a fájlban bennemarad akár egy szóköz is, az már output. Így viszont ha nincs lezárva a php tag, a php fordító nem fog szóközt generálni.
Ha ez megvan, nyiss meg egy üres dokumentumot, és másold bele a következőket. Legyen a neve index.php
include("config.php");
include("functions.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<link href="layout.css" type="text/css" rel="stylesheet" />
<script language="JavaScript" type="text/javascript" src="control.js"></script>
<title>Vendégkönyv</title>
</head>
<body>
<?php
if(!empty($_GET['error']))
{
//Ha nem tolt ki minden adatot, akkor az index.php?error=1 oldalra dobja majd
echo "<p class='error'><strong>Hiba:</strong> Minden mező kitöltése kötelező!</p>";
}
?>
<form name="write" method="post" action="post.php">
<table class="write-post">
<caption>Bejegyzés a vendégkönyvbe:</caption>
<tr>
<td>Név:</td>
<td><input type="text" name="name" /></td>
</tr>
<tr>
<td>E-mail cím:</td>
<td><input type="text" name="email" /></td>
</tr>
<tr>
<td>Üzenet:</td>
<td><textarea rows="5" cols="30" name="message" id="message"></textarea></td>
</tr>
<tr class="smiley">
<td colspan="2">
<a onclick="sm('01');"><img src="sm01.gif" alt="sm01" border="0"/></a>
<a onclick="sm('02')"><img src="sm02.gif" alt="sm02" border="0"/></a>
<a onclick="sm('03')"><img src="sm03.gif" alt="sm03" border="0"/></a>
<a onclick="sm('04')"><img src="sm04.gif" alt="sm04" border="0"/></a>
<a onclick="sm('05')"><img src="sm05.gif" alt="sm05" border="0"/></a>
</td>
</tr>
<tr>
<td colspan="2" class="submit"><input type="submit" name="send" value="Küldés" /></td>
</tr>
</table>
</form>
Az első két sor egy php include, később mutatom meg a functions.php tartalmát. Azután következik egy szabványos HTML fejléc definíció, ahol meghívom a stílus lapot, és a smiley beszúrását lehetővé tevő javascript kódot. Utána egy sima HTML form, ahova majd az üzeneteket írjuk be. Ezen a lapon lesz még továbbá az üzeneteknek a listázása, de azt majd később. A form a post.php -re küldi az adatokat, ami majd elvégzi a szövegfájlba írást. A smiley-k beszúrása egy nagyon egyszerű függvénnyel történik, ami a control.js -ben van.
{
var message = document.getElementById("message").value += '[sm'+id+']';
}
Ez kattintásra beszúr egy bbcode-t a szöveg mezőbe, amit majd később a kiíráskor php-vel átalakítunk képpé.
A stíluslap a layout.css, ez szabja meg az oldalunk kinézetét!
font-family:Arial, Helvetica, sans-serif;
font-size:12px;
}
input,textarea{
color:#000099;
background-color:#FFFF99;
}
.error{
color:red;
text-align:center;
}
#pager{
margin-left:auto;
margin-right:auto;
text-align:center;
font-size:14px;
color:#0000FF;
padding:10px;
}
.write-post{
margin-left:auto;
margin-right:auto;
border:1px dashed #990000;
margin-bottom:20px;
}
.message{
margin-left:auto;
margin-right:auto;
width:500px;
margin-bottom:1em;
}
.message_header{
background-color:#3399FF;
}
.message_header td{
padding:2px;
}
.message_id a{
color:#0000FF;
}
.message_body{
background-color:#FFFF99;
color:#000099;
padding:5px;
text-align:justify;
}
.message_id{
width:50px;
}
.message_date{
text-align:right;
}
.message_nick{
width:100px;
text-align:left;
}
.smiley{
text-align:center;
}
.submit{
text-align:center;
}
Következő lépésként hozz létre egy üres szöveges dokumentumot, legyen a neve gb.txt Fontos, hogy ha szerverre teszed a scriptet, adj írási jogokat a gb.txt-nek. (chmod) Ebbe fogja beírni az üzeneteket a post.php
include ("config.php");
include ("functions.php");
if (!empty($_POST['send']))
{
if (!empty($_POST['name']) && !empty($_POST['message']) && !empty($_POST['email']))
{
//Beiras
add_post($_POST['name'],$_POST['email'],$_POST['message'],$handler);
//Vissza a fooldalra
header("location: index.php");
}
else
{
header ("location: index.php?error=1");
}
}
Itt vizsgáljuk, hogy minden mezőt helyesen kitöltöttek-e. Ha nem visszaküldjük őket az index.php?error=1 oldalra. Ha igen, akkor meghívjuk az add_post() függvényt, ami a functions.php-ben van.
{
//Biztonsagi teendok
$name = str_replace("\n","<br />",htmlspecialchars($name));
$email = str_replace("\n","<br />",htmlspecialchars($email));
$message = str_replace("\n","<br />",htmlspecialchars($message));
$date = date("Y-m-d H:i:s");
//Osszeallitom az adat sort
$row = $name."|".$email."|".$date."|".$message."\n";
//Fajl megnyitasa hozzaadasra, hozzaadas, bezaras
$handle = fopen($handler,"a+");
fwrite($handle,$row);
fclose($handle);
}
Most, hogy már képesek vagyunk tárolni az üzeneteinket, nincs más hátra, mint az eddigi üzenetek, valamint a lapozás megjelenítése. Az index.php így folytatódik:
$message_num = get_message_num($handler);
//Lapozás
if (empty($_GET['page'])){
$curr_page = 1;
} else {
$curr_page = $_GET['page'];
}
$page_num = intval(($message_num+($per_page-1))/$per_page);
?>
<?php if ($page_num!=1):?>
<div id="pager">
Lapozás:
<?php for($i=1;$i<=$page_num;$i++):?>
<a href='index.php?page=<?php echo $i;?>'><?php echo $i;?></a>
<?php endfor;?>
</div>
<?php endif;?>
Az első sorban egy változóba teszem, hogy hány db üzenet van a szöveg fájlban. a get_message_num() függvény a functions.php -ben található
Ezután a lapozás rész következik. Megnézem, hogy hány lapra oszlanak szét az üzenetek, majd egy ciklussal végig járom, és kiíratom a megfelelő oldalak linkjeit. Ha ez megvan, ez alá következik az üzenetek kiírása: index.php (folytatás)
$current_dataset = get_current_dataset($curr_page,$per_page,$handler);
$j = 0;
foreach($current_dataset as $row)
{
?>
<table class='message' cellpadding='0' cellspacing='0'>
<tr class='message_header'>
<td class='message_id'># <?php echo $message_num-((($curr_page-1)*$per_page)+$j);?></td>
<td class='message_nick'><?php echo $row[0];?></td>
<td class='message_date'><?php echo $row[2];?></td>
</tr>
<tr>
<td colspan='3' class='message_body'><?php echo print_post($row[3]);?></td>
</tr>
</table>
<?php
++$j;
}
?>
</body>
</html>
Az első sorban használt get_current_dataset() függvény visszaadja az aktuális oldal üzeneteit egy tömbben. Ez a functions.php -ben található. Itt van továbbá a print_post() függvény is, ami a smileyket alakítja át, valamint ezt lehet bővíteni, hogy felismerjen több bbcode-t.
{
$return = array();
$data = file($handler);
$data = array_reverse($data);
$data = array_slice($data,(($curr_page-1)*$per_page),$per_page);
foreach ($data as $row)
{
$row = explode("|",$row);
$return[] = $row;
}
return $return;
}
function print_post($body)
{
//smileyk
$body = preg_replace("/\[sm(\d+)\]/","<img src='sm$1.gif' alt='smiley'/>",$body);
//[b] bbcode
$body = preg_replace("/\[b\](.*)\[\/b\]/","<strong>$1</strong>",$body);
return $body;
}
És ezzel meg is van a php+txt alapú vendégkönyv. Úgy alakítottam ki a kódot, hogy a következő segédletben át tudjam írni könnyedén mysql alapúra, pusztán a functions.php és a config.php átírásával. Ez egy nagyon alap verzió, természetesen sok helyen lehet bővíteni. Itt a megjegyzések között szívesen veszek bármi nemű kiegészítést, bővítést! Sok sikert!
requiem
Várok ide jó ötleteket a bővítéssel kapcsolatban!
Köszönöm a leírást, nagyon hasznos volt, végre egy működő Vendégkönyv
Kezdő vagyok, lenne egy kérdésem!
Ha szeretném, hogy ez a vendégkönyv az oldalamon jelenjen meg, és ugyan azt a stíluslapot használja, hogy csináljam? Mert ha az index.php-ba teszem a <div id="tartalom", meg egyéb dolgokat és hozzáveszem a css fájlt is, az nem úgy jelenik meg, mint kellene. Ha viszont a kiterjesztést -ami gondolom butaság volt- átírtam html-re, akkor a stílus jelent meg helyesen, valamint a vendégkönyv, de a postok már nem voltak láthatóak.
Örülök a leírásnak, köszönöm!
Sajnos csak félig működik, valamit nem jól csináltam: a honlap-menu linkje a “index.php”-ra mutat, de rákattintva a “gb.txt” fájl tartalma nem jelenik meg, csak az üzenetküldő blokk, és itt a “Küldés” gombra kattintva a windows-os fájlletöltés ablakocska (Megnyitás-Mentés-Mégse) jelenik meg… mi lehet a hiba? Hálás volnék a segítségért, előre is köszönöm!
Köszönöm, nagyon jó a leírás, működik. Ám a kitöltendő részeken nálam csupa nagybetűvel ír… Az miért lehet? Utána a hozzászólások a kis és nagybetűk figyelembevételével kerül kiírásra.