Návštěvní kniha bez MySQL
Zde bych chtěl vystavit návod na jednoduchou návštěvní knihu. Je velmi podobná knize umístěné na těchto stránkách. Veškeré informace jsou uchovávány v textovém souboru, takže ji lze zprovoznit i na serveru bez MySQL. Kniha má také jednoduchou administraci, která umožňuje mazání příspěvků a kde se navíc zobrazují i IP adresy autorů příspěvků.
Vkládání příspěvků
Nejprve vytvoříme formulář, který umožní vložení příspěvku (ukázka, zdrojový kód). Na začátku formuláře je požadavek na soubor config.php (zdrojový kód), který obsahuje HTTP a HTML hlavičku. Dále umožňuje blokovat IP adresy, které jsou zadány v poli $ip.
Po zadání a odeslání jsou data z formuláře nejprve zkontrolována JavaScriptem (pokud je v prohlížeči povolen) a poté jsou odeslána na server. Zpracování dat provádí skript insert.php, ten nejprve zkontroluje zadané údaje a pokud jsou v pořádku, tak otevře soubor msg.txt a načte jeho obsah do proměnné $out. Potom k této proměnné přidá text příspěvku a údaje o odesílateli. Nakonec vloží obsah této proměnné zpět do souboru (který byl předtím smazán). Nakonec dojde k přesměrování na skript read.php, jehož úkolem je zobrazení zadaných dat.
<?php
Require_Once ('config.php');
if ($_POST['name'] == "" || $_POST['email'] == "" || $_POST['contrib'] == "")
{
print $head;
print '<h1>Špatně zadané údaje</h1>';
print 'Musite vyplnit všechny údaje.<br>';
print "<a href=\"form.php?name=".$_POST['name']."&email=".$_POST['email']."&contrib="
.$_POST['contrib']."\">Zpět</a>";
print $tail;
exit;
}
elseif (!EReg("^.[^@]{2,20}@{1}.[^@]{2,20}(\..{2,4}$)", $_POST['email']))
{
print $head;
print '<h1>Špatně zadané údaje</h1>';
print 'Emailová adresa není ve správném formátu.<br>';
print "<a href=\"form.php?name=".$_POST['name']."&contrib=".$_POST['contrib']."&email="
.$_POST['email']."\">Zpět</a>";
print $tail;
exit;
}
if (PReg_Match ("/(<.[^>]+)(>)/i", $_POST['contrib']))
{
print $head;
print '<h1>Špatně zadané údaje</h1>';
print 'Nepoužívejte prosím HTML tagy. Vložené URL budou automaticky převedeny na odkaz.<br>';
print "<a href=\"form.php?name=".$_POST['name']."&email=".$_POST['email']."&contrib="
.$_POST['contrib']."\">Zpět</a>";
print $tail;
exit;
}
$filename = 'msg.txt';
$ip = $_SERVER['REMOTE_ADDR'];
if (File_Exists($filename))
{
$fp = FOpen($filename, 'r');
$obsah = FRead ($fp, FileSize($filename));
FClose ($fp);
$out .= $_POST['email']."\n";
$out .= $_POST['name']."\n";
$out .= URLEncode ($_POST['contrib'])."\n";
$out .= Time()."\n";
$out .= $ip."\n";
$out .= $obsah;
$fp = FOpen($filename, "w");
FWrite ($fp, $out);
FClose($fp);
}
else
{
$out .= $_POST['email']."\n";
$out .= $_POST['name']."\n";
$out .= URLEncode ($_POST['contrib'])."\n";
$out .= Time()."\n";
$out .= $ip;
$fp = FOpen($filename, 'w');
FWrite ($fp, $out);
FClose($fp);
}
Header('Location: '.$_SERVER['SERVER_NAME'].'read.php');
exit;
?>
Při zobrazování příspěvků je emailová adresa převedena do antispamové ochrany (zavináč a tečky jsou nahrazeny slovy). To je celkem důležité opatření, protože mnoho lidí se bojí (oprávněně) zadávat do podobných aplikací své emaily.
Zobrazování příspěvků
Zobrazování příspěvků obstarává skript read.php. Nejprve musíme otevřít soubor msg.txt, který obsahuje jednotlivé příspěvky. Potom načteme řádky tohoto souboru do pole $rows pomocí funkce File(). V dalším kroku jsou tyto řádky rozděleny do polí podle toho jestli se jedná o jméno autora, email, text příspěvku, datum nebo IP adresu. Nakonec vytvoříme HTML výstup, který odešleme prohlížeči.
<?php
Require_Once ('config.php');
Require_Once ('txt2html.php');
$filename = "msg.txt";
if (File_Exists($filename))
{
$rows = File($filename);
for ($i=0; $i<Count($rows); $i++)
{
switch ($i%5)
{
case "0":
$rows[$i] = Str_Replace ("@"," (et) ", $rows[$i]); //ZAMENA ZAVINACE
$email[] = Str_Replace ("."," (dot) ", $rows[$i]); //ZAMENA TECKY
break;
case "1":
$name[] = $rows[$i];
break;
case "2":
$text[] = $rows[$i];
break;
case "3":
$cas[] = $rows[$i];
}
}
}
print $head;
?>
<table border="0" width="550" cellpadding="0" cellspacing="0">
<tr><td align="justify" colspan="2"><p class="head">Kniha návštěv</p></td></tr>
<tr><td> </td></tr>
<tr><td>
<a href="form.php" class="normlink">Vložit nový příspěvek</a><br><br><hr>
<?php
for ($i=0; $i<Count($email); $i++)
{
?>
<table border="0" width="550" cellpadding="0" cellspacing="0">
<tr><td width="50"><b>Jméno:</b></td><td width="500" align="left"><?php echo $name[$i]; ?><br></td></tr>
<tr><td><b>E-mail:</b></td><td><?php echo $email[$i]; ?><br></td></tr>
<tr><td><b>Datum:</b></td><td><?php echo StrFTime("%d.%m %Y %H:%M", $cas[$i]); ?></td></tr>
<tr><td colspan="2"> </td></tr>
<tr><td colspan="2" align="justify"><?php echo txt2html(URLDecode($text[$i])); ?><hr><br></td></tr>
</table>
<?php
}
?>
</td></tr></table>
<?php
print $tail;
?>
Administrace
Administrace je velmi jednoduchá - umožňuje pouze mazání příspěvků a také zobrazuje IP adresu, z které byl příspěvek odeslán. Pro vstup do registrace je nutné se zalogovat. Pro přenášení hesla mezi stránkami využívám sessions. Heslo je kódované pomocí šifry MD5.
<?php
include_once ('config.php');
session_start();
$MD5Hash = '07f32cf80744e6bdd6152c4c7623b4f2'; //MD5 hash hesla
if ($_SESSION['login'] == 'administrator')
{
if ($_SESSION['password'] != $MD5Hash)
{
print $head;
print 'Špatné heslo';
print $tail;
exit;
}
}
else
{
if ($_POST['login'] != 'administrator' || MD5($_POST['password']) != $MD5Hash)
{
print $head;
print 'Špatná kombinace loginu a hesla.';
print $tail;
exit;
}
else
{
$_SESSION['login'] = $_POST['login'];
$_SESSION['password'] = MD5($_POST['password']);
Header ('Location: admin-book.php');
}
}
?>
Vstupní formulář je v souboru login.html. Data z tohoto formuláře jsou odeslána skriptu session.php, který nejprve zkontroluje, jestli už nějaká session nebeží a pokud ne, tak ověří správnost loginu a hashe hesla. Pokud je vše v pořádku, dojde k přesměrování na skript admin-book.php.
<?php
@include ('../header1.php');
require_once ('config.php');
require_once ('session.php');
include_once ('txt2html.php');
$filename = "msg.txt";
if (File_Exists($filename))
{
$rows = File($filename);
for ($i=0; $i<Count($rows); $i++)
{
switch ($i%5)
{
case "0":
$email[] = $rows[$i];
break;
case "1":
$name[] = $rows[$i];
break;
case "2":
$text[] = $rows[$i];
break;
case "3":
$cas[] = $rows[$i];
break;
case "4":
$ip[] = $rows[$i];
break;
}
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>Kniha návštěv</title>
<meta http-equiv="language" content="czech">
<meta name="author" content="hugo">
<meta http-equiv="Content-type" content="text/html ;charset=utf-8">
<link rel=stylesheet type="text/css" href="css/style.css">
<script type="text/javascript" language="javascript" src="js/book.js"></script>
</head>
<body>
<h1>Kniha návštěv - administrace</h1>
<strong>Celkový počet příspěvků:
<?php
print Count ($name); //URCI POCET PRISPEVKU Z POCTU PRVKU POLE $name
?>
</strong>
<form name="del" action="del-contrib.php" method="post">
<?php
for ($i=0; $i<Count($email); $i++)
{ ?>
<fieldset>
<legend> Příspěvek č. <?php print $i+1; ?> </legend>
<table border="0" width="550" cellpadding="0" cellspacing="0">
<tr><td colspan="2"> </td></tr>
<tr><td width="50"><input type="checkbox" name="del[]" value="<?php print $cas[$i]; ?>"></td>
<td width="500" align="left">Smazat příspěvek</td></tr>
<tr><td width="50"><b>Jméno:</b></td><td width="500" align="left"><?php echo $name[$i]; ?></td></tr>
<tr><td><b>E-mail:</b></td><td><?php echo $email[$i]; ?></td></tr>
<tr><td><b>Datum:</b></td><td><?php echo StrFTime("%d.%m %Y %H:%M", $cas[$i]); ?></td></tr>
<tr><td><b>IP:</b></td><td><?php echo $ip[$i]."/".GetHostByName(Trim($ip[$i])); ?></td></tr>
<tr><td colspan="2"> </td></tr>
<tr><td colspan="2" align="justify"><?php echo NL2BR(txt2html(URLDecode($text[$i]))); ?><br></td></tr>
</table>
</fieldset>
<?php }
?>
<input type="submit" value="Smazat označené příspěvky">
</form>
</body>
</html>
V administraci jsou zobrazeny příspěvky, stejně jako při čtení, ale navíc je u každého jeden checkbox, pomocí kterého můžeme označit příspěvky určené ke smazání. Tyto příspěvky budou po odeslání formuláře předány skriptu del-contrib.php, který je smaže. Skript je velmi jednoduchý, pouze načte soubor msg.txt po řádcích do pole a poté porovnává datum vložení příspěvku s datem odeslaným jako hodnota checkboxu. Pokud se neshodují, tak je příspěvek uložen zpět do souboru. V opačném případě je smazán.
<?php
require_once ('session.php');
$filename = "msg.txt";
$out = '';
if (Count ($_POST['del']) == 0)
{
Header ('Location: admin-book.php');
}
$content = File ($filename);
for ($i = 3; $i < Count ($content); $i+=5)
{
if (!In_Array (Trim($content[$i]), $_POST['del']))
{
$out .= $content[$i-3];
$out .= $content[$i-2];
$out .= $content[$i-1];
$out .= $content[$i];
$out .= $content[$i+1];
}
}
$fp = FOpen ($filename, 'w');
FWrite ($fp, $out);
FClose ($fp);
Header ('Location: admin-book.php');
?>
Zprovoznění návštěvní knihy
Nedávno mi došel mail s dotazem jak zprovoznit tuto knihu. Celkem mě překvapil, protože sem spíš očekával, že tyto skripty budou sloužit jako odrazový můstek pro vytvoření finální aplikace. Ale dobrá ...
Takže první věc, kterou pro zprovoznění návštěvní knihy potřebujete je server, na které běží PHP. To se dá zjistit z informací od webmastera, příp. můžete zkusit na server nahrát soubor info.php s tímto obsahem:
<?php
PHPInfo();
?>
Pokud se Vám po spuštění tohoto souboru objeví několik tabulek s informacemi o PHP, tak je to dobré. V případě, že uvidíte jen obsah toho souboru, tak máte smůlu a musíte sehnat lepší server (nebo si připlatit).
První úpravy je potřeba udělat v souboru config.php, do pole $ip vložte IP adresy, kterým chcete zabránít v přístupu k návštěvní knize (spammeři a podobné existence). Pokud nechcete zatím blokovat nikoho, tak nechte toto pole prázdné. Další úpravu je potřeba udělat v souboru sessions.php. Do proměnné $MD5Hash je nutné vložit MD5 hash hesla, které chcete používat pro vstup do administrace. Pokud se pohybujete na Linuxu, tak by pro Vás neměl být problém tento řetězec získat, stačí zadat:
md5 -ms VaseHeslo
Ve windowsech je potřeba použít nějakou utilitku, pokud ovšem máte naistalovaný PSPad, tak stačí jen kliknout na Nástroje -> MD5 otisk. Pokud Vám nevadí mít heslo zadané v kódu ve formě plain text, tak můžete ten řádek upravit do této podoby:
$MD5Hash = MD5('VaseHeslo');
Toto ovšem vřele nedoporučuji. Hlavně sem nezadávejte heslo, které používáte jinde, protože hlavně na free-hostingu se na bezpečnost nedá příliš spoléhat.
Pro vygenerování MD5 otisku můžete také využit tento formulář:
To by mělo být snad vše, co je potřeba provést pro zprovoznění této knihy. Pokud by byly nějaké problémy, tak mi pošlete mail a já budu informace průběžně doplňovat.
Závěr
Tato návštěvní kniha je velmi jednoduchá a nevyžaduje MySQL, což umožní její zprovoznění na velkém počtu serverů a taky může být trochu rychlejší (záleží na konkrétním serveru).
Všechny soubory návštěvní knihy si můžete stáhnout na této adrese.
LICENCE
Všechny skripty na tomto webu jsou poskytovány, pokud není uvedeno jinak, bez jakýchkoliv licenčních požadavků a také bez záruk.