Привет народ!
Как
то раз от раза у меня получается писать заметки про PHP. Это такое
дело, на которое вечно не хватает времени. И вот, буквально вчера я
все-таки выделил утром полтора часа и написал простенькую гостевую,
чисто для примера в этой заметке. Да, сегодня я напишу о том, как
написать примитивную гостевую книгу. Без постраничной навигации, без
защиты от спама, с некоторой защитой от XSS и ограничением на
минимальное количество символов. И так…
Сам скрипт включает в себя три файла – guest.php, index.php и data.txt . Файл guest.php – самый главный файл. В нем содержится весь код скрипта. Index.php – это, по сути, html страничка, в которую включается файл guest.php. Сделал это, что бы не засорять особо всякой фигней основной код. Data.txt, как можно было догадаться, является базой. В него записываются сообщения. Поскольку сама база у гостевой вряд ли когда наберется больше сотни килобайт в большинстве случаев (и то надо постараться), то обойдемся одним файлом и функцией file_get_contents.
Начнем разбор с файла guest.php, поскольку в нем содержится весь код, и, соответственно, он самый главный. Код делится конструкцией if-elseif как бы на три части.
Если мы определили, что сообщения в базе есть, то разбиваем переменную на массив сообщений по разделителю |msg|, затем этот массив переворачиваем. Зачем это делать? Дело в том, что сообщения записываются в нашем скрипте в конец файла. В таком случае самые старые сообщения будут вверху, а новые – внизу. В какой гостевой вы такое видели? Гораздо удобнее просматривать вверху новые сообщения!
Если переменная не пустая, то разбиваем так же ее по разделителю |part| на три строки – ник, дата со временем и сообщение. Затем просто выводим html код, в который эти переменные вставляем, куда надо.
Вот такое устройство имеет самый главный файл. Как уже можно было понять, он выводит сообщения тогда, когда его вызвать без всяких GET переменных (типа guest.php), выводит форму отправки сообщения, когда его вызвать таким образом – guest.php?p=post, и записывает сообщение, если его вызвать таким образом – guest.php?p=print.
Посмотрим теперь на index.php:
Вот и все! Как видите, тут ничего особо сложного нет… Всем удачи, всем пока
Сам скрипт включает в себя три файла – guest.php, index.php и data.txt . Файл guest.php – самый главный файл. В нем содержится весь код скрипта. Index.php – это, по сути, html страничка, в которую включается файл guest.php. Сделал это, что бы не засорять особо всякой фигней основной код. Data.txt, как можно было догадаться, является базой. В него записываются сообщения. Поскольку сама база у гостевой вряд ли когда наберется больше сотни килобайт в большинстве случаев (и то надо постараться), то обойдемся одним файлом и функцией file_get_contents.
Начнем разбор с файла guest.php, поскольку в нем содержится весь код, и, соответственно, он самый главный. Код делится конструкцией if-elseif как бы на три части.
<?php
if (!isset($_GET['p']))
{
Тут видим стандартное – начало скрипта и условие. Поскольку на
любой сайт пользователь будет заходить без всяких GET переменных, то
выводим часть кода, выводящую сообщения, когда переменная $_GET['p'] не
объявлена.
if (!isset($_GET['p']))
{
$data=file_get_contents('data.txt');
if ($data!=’’)
{
$data=array_reverse(explode('|msg|',$data));
Считываем базу из файла в переменную. Затем проверяем, есть ли сообщения. Это можно проверить по-разному. Простейшее – if ($data!=’’) . Им и воспользуемся.
if ($data!=’’)
{
$data=array_reverse(explode('|msg|',$data));
Если мы определили, что сообщения в базе есть, то разбиваем переменную на массив сообщений по разделителю |msg|, затем этот массив переворачиваем. Зачем это делать? Дело в том, что сообщения записываются в нашем скрипте в конец файла. В таком случае самые старые сообщения будут вверху, а новые – внизу. В какой гостевой вы такое видели? Гораздо удобнее просматривать вверху новые сообщения!
foreach ($data as $mess)
{
if ($mess=='') continue;
$part=explode('|part|',$mess);
echo '<br/>'.$part[0].'<br/>-
<br/>'.$part[1].'<br/>-<br/>'.$part[2].'<br/>__________<br/>';
}
Теперь нам необходимо вывести сообщения на экран. Для этого
воспользуемся циклом foreach, специально предназначенным для работы с
массивами. Он последовательно выводит каждый элемент массива. В цикле
для начала проверяем, не является ли элемент массива пустым. Такое может
вполне быть. Если у нас, к примеру, есть строка “|msg|Привет всем!”
, то функция explode ее разделит на две части – слева и справа от
разделителя. Левая часть будет пустая. Бороться с таким явлением можно
по разному, но, как по мне, само проще, так как я написал.
{
if ($mess=='') continue;
$part=explode('|part|',$mess);
echo '<br/>'.$part[0].'<br/>-
<br/>'.$part[1].'<br/>-<br/>'.$part[2].'<br/>__________<br/>';
}
Если переменная не пустая, то разбиваем так же ее по разделителю |part| на три строки – ник, дата со временем и сообщение. Затем просто выводим html код, в который эти переменные вставляем, куда надо.
}
else echo 'Пока еще никто ничего не написал :(';
}
Тут выводится сообщение в случае того, если постов в гостевой не окажется, а так же заканчивается первая часть кода.
else echo 'Пока еще никто ничего не написал :(';
}
elseif ($_GET['p']=='post')
{
$time= date("Y-m-d H:i");
echo '<form action='guest.php?p=print' method='post'>
Ваш ник <br/>
<input type='text' name='nn'><br/>
Сообщение<br/>
<textarea name='mess' cols=16 rows=4><br/>
<input type='hidden' name='time' value=''.$time.''>
<input type='submit' value='отправить'>
</form>';
}
В этой части все просто. Формируем время, затем выводим форму отправки сообщения.
{
$time= date("Y-m-d H:i");
echo '<form action='guest.php?p=print' method='post'>
Ваш ник <br/>
<input type='text' name='nn'><br/>
Сообщение<br/>
<textarea name='mess' cols=16 rows=4><br/>
<input type='hidden' name='time' value=''.$time.''>
<input type='submit' value='отправить'>
</form>';
}
elseif ($_GET['p']=='print')
{
if (strlen($_POST['nn'])<3 | | strlen($_POST['msg'])<10)
{
echo 'Какое то из полей слишком маленькое';
exit();
}
if (strlen($_POST['time'])<10)
{
echo 'Ошибка в информации о времени';
exit();
}
Теперь рассмотрим третью часть. Часть, которая отвечает за запись
сообщения. В этом участке проверяем длину сообщений. Если возвращенные
из формы данные меньше определенной длины, то выводим информацию об
ошибке и заканчиваем работу скрипта.
{
if (strlen($_POST['nn'])<3 | | strlen($_POST['msg'])<10)
{
echo 'Какое то из полей слишком маленькое';
exit();
}
if (strlen($_POST['time'])<10)
{
echo 'Ошибка в информации о времени';
exit();
}
$nn=htmlspecialchars(str_replace(array('|msg|','|part'),'',$_POST['nn']));
$mess=htmlspecialchars(str_replace(array('|msg|','|part'),'',$_POST['mess']));
$time=htmlspecialchars(str_replace(array('|msg|','|part'),'',$_POST['time']));
Тут мы фильтруем данные на наличие всяких тегов (тем самым
предотвращая XSS атаки) и убираем разделители, на случай, если кто-то
попытается их впихнуть в форму.
$mess=htmlspecialchars(str_replace(array('|msg|','|part'),'',$_POST['mess']));
$time=htmlspecialchars(str_replace(array('|msg|','|part'),'',$_POST['time']));
if
(!file_put_contents('data.txt','|msg|'.$nn.'|part|'.$time.'|part|'.$mess,FILE_APPEND|LOCK_EX))
echo 'Системная ошибка :(';
}
?>
Это самая последняя часть кода. Тут происходит запись сообщения.
Записываем переменные с нужными нам данными, ставя между ними
разделители. Таким образом, структура в базе будет следующая:
}
?>
|mess|
Ник1
|part|
Дата1
|part|
Сообщение1
|mess|
Ник2
|part|
Дата2
|part|
Сообщение2
…
Параметры FILE_APPEND|LOCK_EX отвечают за то, что бы при
записи данные дописывались в конец файла, и что бы файл был недоступен
для записи в то время, когда в него уже что-то записывается.
Ник1
|part|
Дата1
|part|
Сообщение1
|mess|
Ник2
|part|
Дата2
|part|
Сообщение2
…
Вот такое устройство имеет самый главный файл. Как уже можно было понять, он выводит сообщения тогда, когда его вызвать без всяких GET переменных (типа guest.php), выводит форму отправки сообщения, когда его вызвать таким образом – guest.php?p=post, и записывает сообщение, если его вызвать таким образом – guest.php?p=print.
Посмотрим теперь на index.php:
<html>
<head>
<title>Гостевая</title>
</head>
<body>
<a href='index.html'> << на главную </a> <br/>
<b>Гостевая книга</b> <br/>
<p align='center'>
Сообщения (<b><a href='guest.php?p=post'>Добавить</a></b>)
</p>
<?php
include ('guest.php');
?>
<p align='center'>
(c) bY M_N
</p>
<a href='index.html'> << на главную </a>
</body>
</html>
Как видим, это самый обычный html код. Только обратите внимание
на выделенную часть – мы вписываем php код, который вставляет сюда код с
файла guest.php, тем самым выводя сообщения.
<head>
<title>Гостевая</title>
</head>
<body>
<a href='index.html'> << на главную </a> <br/>
<b>Гостевая книга</b> <br/>
<p align='center'>
Сообщения (<b><a href='guest.php?p=post'>Добавить</a></b>)
</p>
<?php
include ('guest.php');
?>
<p align='center'>
(c) bY M_N
</p>
<a href='index.html'> << на главную </a>
</body>
</html>
Вот и все! Как видите, тут ничего особо сложного нет… Всем удачи, всем пока
Комментариев нет:
Отправить комментарий