Гостевая книга на PHP
Гостевая книга - один из полезных инструментов 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"> </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;"> <a href="mailto:<?echo $email;?>"><b><?echo $nick;?></b></a> - <a href="<?echo $homepage;?>">дом. страница</a> | icq: <?echo $icq;?> | Дата: <?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("#", "#", $str); $str = str_replace('.', ".", $str); $slashes = chr(92); $str = str_replace($slashes, "\", $str); $slashes = chr(39); $str = str_replace($slashes, "'", $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 .""> ". $i ." </a> "; } ?>
Я не стану объяснять код, т.к. уже подписал комментарии в нем. Этот код конечно же несовершенен, поэтому ненадо сильно критиковать. Я специально некоторые функции недоделал или несделал вообще (что бы Вы сами пошевелили своим сером веществом и заставили его думать :) ). Например осталось без внимания то, что здесь нет лимита на показ страниц, т.е. нужно выводить по 10 страниц и две стрелочки: на предыдущие 10 (если таковые имеются) и на следующие. Так же можно добавить ф-цию на проверку e-mail, icq и дом.страницу. Можно и BB-коды присобачить см. подробнее сдесь. Про администрирование я уже и неговорю, сами делайте как хотите Немного о защите данных: создайте в дериктории с файлом "index.php" файл ".htaccess", и впищите в него следующую информацию:<Files "*.txt"> deny from all </Files> DirectoryIndex index.php
Это похволит вам скрыть все *.txt файлы и назначить главным файлом в дериктории "index.php" Вроде все сказал, все хорошо... да потребности у всех разные, кому-то этот скрипт подойдет, а кому-то и нет. Идею я вам дал, остальное делайте сами. Как говорится: "На всех не угодишь".
Рекомендуем почитать