Гостевая книга на PHP - Web - Shelek
Гостевая книга - один из полезных инструментов Web-мастера, позволяющий узнать мнение о своей работе, то есть о созданном сайте. Сейчас мы рассмотрим как написать гостевую книгу своими собственными руками (только драйвер "прямые_руки.dll" установите :) и поехали ...)

Перейдем к алгоритму нашей гостевой книги. Пользователь открывает гостевую книгу и видит максимальное количество сообщений, которое задается Вами. На этой же странице находится форма для ввода сообщений. А внизу страницы мы сделаем страницы, чтобы пользователь смог просматривать предыдушие сообщения.

После того, как пользователь ввел свои данные, текст сообщения и нажал на кнопку "Отправить", скрипт записывыет эту информацию в начало файла, чтобы другие пользователи смогли видеть сообщения "от последнего".

В файл гостевой книги будем записывать следующую информацию:

* Имя пользователя
* Дату и время (администратор может устанавливать сам, по своему вкусу) отправки сообщения
* Само сообщение
* E-mail пользователя (при желании пользователя)
* ICQ(при желании пользователя)
* Дом. страницу (при желании пользователя)
* IP пользователя (только для администратора)


Итого: 7 полей. После каждого поля стоит спец. символом №01

Так же при добавлении сообщения все поля будут проверятся на теги, чтобы увеличить безопастность нашей гостевой книги.

Ниже приведен листинг формы для добавления сообщений, сохраните его на диске как файл с названием "form.txt":

<script language="JavaScript" type="text/javascript">
function checkForm() {

formErrors = false;

if (document.post.mes.value.length < 2) {
formErrors = "Вы должны ввести текст сообщения";
} else

if (document.post.mes.value.length > 1000) {
var simbols = document.post.mes.value.length;
formErrors = "Вы должны ввести текст сообщения меньше 1000 символов, а у вас " + simbols;
} else

if (document.post.user.value.length > 20) {
var simbols = document.post.user.value.length;
formErrors = "Вы должны ввести ваше имя меньше 20 символов, а у вас " + simbols;
} else

if (document.post.user.value.length < 3) {
var simbols = document.post.user.value.length;
formErrors = "Вы должны ввести ваше имя больше 3 символов";
}

if (formErrors) {
alert(formErrors);
return false;
} else {
bbstyle(-1);
//formObj.preview.disabled = true;
//formObj.submit.disabled = true;
return true;
}
}
</script>
<form action = "index.php?action=addmes" method="post" name="post" onsubmit="return checkForm(this)" enctype="multipart/form-data">
<table cellspacing="0">
<tr><td height="5" style="border-top:1px solid #000000;" colspan="2"><font size="1">&nbsp;</font></td></tr>
<tr>
<td width="250">
<b><font size="2" color="#003333"><font color="DD0000">*</font>Ваше имя:</font></b>
</td>
<td width="298">
<font size="1" face="Verdana">
<input name="user" value="" style="width:298;" maxlength="20"></font><b><font size="2"></input>
</font>
</b>
</td>
<td width="2"></td>
</tr>
<tr>
<td width="250">
<b><font size="2" color="#003333">Элекстронная почта:</font></b>
</td>
<td width="298">
<font size="1" face="Verdana">
<input name="mail" value="" style="width:298;" maxlength="20"></font><b><font size="2"></input>
</font>
</b>
</td>
<td width="2"></td>
</tr>
<tr>
<td width="250">
<b><font size="2" color="#003333">Дом. страница:</font></b>
</td>
<td width="298">
<font size="1" face="Verdana">
<input name="homepage" value="http://" style="width:298;" maxlength="30"></font><b><font size="2"></input>
</font>
</b>
</td>
<td width="2"></td>
</tr>
<tr>
<td width="250">
<b><font size="2" color="#003333">ICQ:</font></b>
</td>
<td width="298">
<font size="1" face="Verdana">
<input name="icq" value="" style="width:298;" maxlength="12"></font><b><font size="2"></input>
</font>
</b>
</td>
<td width="2"></td>
</tr>
<tr>
<td width="550" colspan="3">
<b>
<font size="2" color="#003333"><font color="DD0000">*</font>Текст сообщения: (не больше 1000 символов)<br>
</font></b><font size="1" face="Verdana">
<textarea name="mes" style="width:550;" rows="6"></textarea></font><b><font size="2"><br>
</font>
</b><img alt="" src="image/zero.gif" height="2" width="1"><br>
<button type="submit"><font face="Verdana">Отправить</font></button>
<img alt="" src="image/zero.gif" height="1" width="2">
<button type="reset"><font face="Verdana">Стереть</font></button>
</td>
<td width="2"></td>
</tr>
</table>
</form>

Ниже приведен листинг файла для вывода сообщений, сохраните его на диске как файл с названием "tamples.txt":

<table cellpadding="0" cellspacing="0" width="100%">
<tr>
<td bgcolor="#E4E4E4" colspan="2" height="20"><font style="font-size: 10pt;">
&nbsp;&nbsp;<a href="mailto:<?echo $email;?>"><b><?echo $nick;?></b></a> - <a href="<?echo $homepage;?>">дом. страница</a>&nbsp;| icq: <?echo $icq;?>&nbsp;| Дата: <?echo $date;?></font>
</td>
</tr>
<tr><td width="5"><img alt="" src="zero.gif" width="5" height="0"></td><td width="100%"><font size="-1"><?echo $text;?></font></td></tr>
</table><br>

Ниже приведен листинг файла для ответа на добавленное сообщение, сохраните его на диске как файл с названием "otvet.txt":

<html>
<head>
<title>Подождите...</title>
<meta http-equiv="refresh" content="2; url=index.php">
<style type="text/css">
html{
overflow-x: auto;
}

body{
background: #FFF;
color: #222;
font-family: Verdana, Tahoma, Arial, Trebuchet MS, Sans-Serif, Georgia, Courier, Times New Roman, Serif;
font-size: 11px;
line-height: 135%;
margin: 0;
padding: 0;
text-align: center;
}
</style>
</head>
<body>
<div>
<br><br><br><br><br><br>
<p>Спасибо...<br>
За ваше сообщение<br>
Нам важно каждое мнение</p>
<p>(<a href="index.php">Или нажмите сюда, если не хотите ждать</a>)</p>
</div>
</body>
</html>

Ниже приведен листинг, сохраните его на диске как файл с названием "index.php":

<?php

Error_Reporting(E_ALL & ~E_NOTICE);

################ Информация для администратора ################
$file_guest = "guest.txt"; // файл гостевой книги
$kol_fields = 7; // количество полей для каждого сообщения
// (nick, date, text, email, icq, homepage, IP)
$max_mes_on_page = 20; // максимальное количество сообщений на страницу
$tamples_file = "tamples.txt"; // файл для вывода сообщений
$addform = "form.txt"; // форма для добавления сообщений
$date_format = "d.m.Y / H:i"; // формат даты
$otvet = "otvet.txt"; // файл для ответа на добавление сообщения
################===============================################

function strtosafe($str) // Защита данных то несанкционированного воздействия
{
$str = nl2br(htmlspecialchars($str)); // заменяем спец. символы на их эквиваленты
$str = str_replace("#", "&#035;", $str);
$str = str_replace('.', "&#046;", $str);

$slashes = chr(92);
$str = str_replace($slashes, "&#092;", $str);

$slashes = chr(39);
$str = str_replace($slashes, "&#39;", $str);
return $str;
}

function file_write($COUNT_FILE, $text) // Перезаписывает файл
{
$f = @fopen($COUNT_FILE, "w+"); // открываем файл

if ( @chmod("$COUNT_FILE", 0777) == false )
@chmod("$COUNT_FILE", 0777); // выставляем права для файла

@fwrite($f,$text); // записываем данные в файл
@fclose($f); // закрываем файл
return 0;
}

function file_read($COUNT_FILE) // Чтение из файла($file_name)
{
clearstatcache(); // очищаем кеш файла
if (is_file($COUNT_FILE))
{
$f = @fopen($COUNT_FILE, "r");

if ( @chmod("$COUNT_FILE", 0777) == false )
@chmod("$COUNT_FILE", 0777);

$conts = @fread($f, @filesize($COUNT_FILE));
@fclose($f);
return $conts;
} else return 0;
}

function fewrite($file_name, $text) // Делаем дозапись данных в файл($file_name)
{
if ( @chmod("$file_name", 0777) == false )
@chmod("$file_name", 0777);

$f = @fopen($file_name, "a+");
@flock($f, Lock_EX);
@fwrite($f, $text);
@flock($f, LOCK_UN);
@fclose($f);
return 0;
}

function fswrite($file_name, $text) // Делаем дозапись данных в начало файла($file_name)
{
$file_temp = $file_name . '.tmp'; // Резервный файл

if (is_file($file_temp)) die("Не удалось записать информацию: в прошлый раз работа
скрипта была прервана(сбой в системе).<br> Пожайлуста обратитесь к администратору");

if ( @chmod("$file_name", 0777) == false )
@chmod("$file_name", 0777);

if (copy($file_name, $file_temp))
{
file_write($file_name, $text);
fewrite($file_name, file_read($file_temp));
@unlink($file_temp);
} else return -1; // код ошибки (не удалось произвести копирование)
return 0;
}

$action = $HTTP_GET_VARS["action"]; // действие

if ($action == 'addmes')
{
$nick = strtosafe($_POST['user']);
$date = date($date_format);
$text = strtosafe($_POST['mes']);
$email = strtosafe($_POST['mail']);
$icq = strtosafe($_POST['icq']);
$homepage = strtosafe($_POST['homepage']);
$IP = $_SERVER['REMOTE_ADDR'];

if (!is_file($file_guest)) file_write($file_guest, ""); // если файла гостевой гниги не существет, тогда создаем пустой
fswrite($file_guest, $user ."\x01". $date ."\x01". $text ."\x01". $email ."\x01". $icq ."\x01". $homepage ."\x01". $IP ."\x01"); // записываем информацию

include($otvet); // вставляем ответ для пользователя по окончании добавления
} else {

$page = $HTTP_GET_VARS["page"] - 1; // номер страницы
if ($page < 1) $page = 0;

$cont = file_read($file_guest); // данные из файла
$conts = explode("\x01", $cont); // записываем данные из фала в массив
$all_mes = (count($conts)-1) / 7; // общее количество сообщений

include($addform);

for ($i = ($max_mes_on_page * $page); $i < (($max_mes_on_page * $page) + $max_mes_on_page); $i++)
{
if ($i >= $all_mes) break;

$nick = $conts[$kol_fields*$i];
$date = $conts[$kol_fields*$i + 1];
$text = $conts[$kol_fields*$i + 2];
$email = $conts[$kol_fields*$i + 3];
$icq = $conts[$kol_fields*$i + 4];
$homepage = $conts[$kol_fields*$i + 5];
$ip = $conts[$kol_fields*$i + 6];

include($tamples_file); // заготовка для вывода сообщений
}

echo "Страницы: ";
for ($i = 1; $i < ($all_mes / $max_mes_on_page + 1); $i++) // вывод страниц
echo "<a href=\"index.php?page=". $i ."\">&nbsp;". $i ."&nbsp;</a> ";
}
?>

Я не стану объяснять код, т.к. уже подписал комментарии в нем.

Этот код конечно же несовершенен, поэтому ненадо сильно критиковать. Я специально некоторые функции недоделал или несделал вообще (что бы Вы сами пошевелили своим сером веществом и заставили его думать :) ). Например осталось без внимания то, что здесь нет лимита на показ страниц, т.е. нужно выводить по 10 страниц и две стрелочки: на предыдущие 10 (если таковые имеются) и на следующие. Так же можно добавить ф-цию на проверку e-mail, icq и дом.страницу. Можно и BB-коды присобачить см. подробнее сдесь. Про администрирование я уже и неговорю, сами делайте как хотите

Немного о защите данных:
создайте в дериктории с файлом "index.php" файл ".htaccess", и впищите в него следующую информацию:

<Files "*.txt">
deny from all
</Files>
DirectoryIndex index.php

Это похволит вам скрыть все *.txt файлы и назначить главным файлом в дериктории "index.php"

Вроде все сказал, все хорошо... да потребности у всех разные, кому-то этот скрипт подойдет, а кому-то и нет. Идею я вам дал, остальное делайте сами. Как говорится: "На всех не угодишь".
Information
  • Posted on 27.04.2013 19:14
  • Просмотры: 21365