Главная страница статей --> Советы по фотошопу, графике и хитрости в построении php кода

Гостевая книга на PHP

Источник: realcoding.net

Гостевая книга - один из полезных инструментов 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"

Вроде все сказал, все хорошо... да потребности у всех разные, кому-то этот скрипт подойдет, а кому-то и нет. Идею я вам дал, остальное делайте сами. Как говорится: "На всех не угодишь".



Похожие статьи:
- Дядя Гугл — великан
- Делаем выбор: Photoshop 7 или Photoshop CS/CS 2
- Cookies - свежие булочки
- Метатэги
- Использование шаблонов дизайна в ASP.NET
- Прячем счётчики
- Хитрости табличного дизайна. (формируем рамку таблицы)
- Что такое дорвеи? Банят ли за них?
- Использование HTML-таблиц для вывода диаграмм
- И снова отказываемся от модуля CGI?
- Подробно о Robots.txt
- Удаление строки из файла
- Про тэги и метатэги


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.001]