Итак, в этой статье я расскажу вам, как можно буквально за 10 минут создать простенькую файловую гостевую на php. Цель статьи не написать гостевую, а рассказать новичкам, как устроены файловые гостевые/форумы. Данная статья посвящается новичкам в php, бегиннеры не найдут здесь ничего нового. Итак, приступаем.
Каждое сообщение в гостевой должно где-то храниться. На сегодняшний день есть два способа хранения данных: в базах данных или в файлах. Структура каждой гостевой проста: когда пользователь вводит сообщение, php-скрипт обрабатывает его и записывает в файл. Пользователь, добавив сообщение, возвращается на главную страницу и видит своё творение, выведенное php-скриптом из файла. Примерно так работает самая примитивная гостевая. Теперь мы попробуем сами создать такую гостевую.
Сначала мы создаём отдельную папку для гостевой, в ней файлы “index.php”, “addmsg.php” и пустую папку “data”.
В index.php пишете такой код:
<html>
<head><title>ГавноГостевая v.1</title></head>
<body>
<form method="post" action="addmsg.php">
Имя: <input type="text" name="login" id="login" size="20"><br>
E-mail: <input type="text" name="email" id="email" size="20"><br>
Сообщение: <textarea name="msg" id="msg"></textarea><br>
<input type="submit" value="Добавить">
</form>
</body>
</html>
Здесь, я думаю, всё понятно: мы создаём форму ввода сообщения
Дальше мы должны написать скрипт, который добавляет сообщение, а потом, который выводит. Пишем в addmsg.php:
<?php
$msg = htmlspecialchars($_POST['msg']); // Заменяем html-теги на безопасные
$login = htmlspecialchars($_POST['login']);
$email = htmlspecialchars($_POST['email']);
if (strlen($login) < 2) exit ("Логин меньше 2 сиволов!");
/* Если логин меньше 2 символов, то останавливаем скрипт*/
if (!eregi("([[:alnum:]._-]+@[[:alnum:]-]+(\\.[[:alnum:]-]+)*(\\?([[:alnum:]?+&%]*)?)?)", $email) and strlen($email)) exit ("Вы знаете что такое e-mail?");
/* Проверка мыла */
if (strlen($msg) < 5) exit ("Сообщение меньше 5 сиволов!");
/* Если сообщение меньше 5 символов, то останавливаем скрипт */?>
Здесь мы проверяем правильность ввода e-mail, длину логина и сообщения. А как теперь записать всё это вместе: Логин, мыльницу и сообщение? Нужно соединить их вместе в одно сообщение. А как сделать, чтобы потом можно было из этого сообщения извлечь всё это? Никак. Нужно, когда мы связываем данные, поставить перед ними разделитель, например “##” или “::”, а при выведении данных по этому разделителю их разбить. Например, возьмём “::” Но и в этом примере допущена ошибка. Данные то мы разделили, а сообщения нет. Тогда мы возьмём ещё один разделитель: разделитель сообщений, например “;;”.
<?php
$msg = str_replace ("\r\n", "<br>", $msg);
if (!is_file("data/db.php")) fopen("data/db.php", "w"); // Проверяем наличие файла
$file = @file_get_contents("data/db.php"); // Читаем данные
$fd = @fopen("data/db.php", "w");
@flock ($fd, LOCK_EX); // Запираем файл
$separator = "::"; // Разделитель данных в сообщении
$separator2 = ";;"; // Разделитель сообщений в файле
$to = $login.$separator.$email.$separator.$msg.$separator2; // Связываем данные
@fwrite ($fd, $to); // Записываем данные
@fwrite ($fd, $file); // Записываем ранние сообщения.
@flock ($fd, LOCK_UN); // Отпираем файл
@fclose ($fd); // Закрываем файл
header ("location: index.php"); // Уходим на главную
?>
В первой строчке мы заменяем символ перевода строки на html-эквалитент <br>.
Во второй мы проверяем наличие базы данных, если её нету, то создаём её.
В третьей строчке мы получаем данные из базы данных, т.е. ранние сообщения
Четвёртая строчка открывает базу данных, т.е. файл, предварительно затерев его.
Функцией flock($fd, LOCK_UN) мы запираем файл, чтобы никто не мог в него ничего записать, например если два пользователя вместе добавят сообщение, то в результате уничтожатся все данные нашей “базы”.
Далее мы обьявляем разделители ($separator и $separator2).
В переменную $to мы помещаем склеенное сообщение, а в следующей строчке мы записываем её в базу. Далее мы записываем ранние сообщения, т.е. сообщения, которые добавили ранее. Потом мы отпираем файл, закрываем его и уходим на главную страницу. Вас не смущали “собаки” перед функциями? Они обозначают, что если будет сбой, не выдать ошибку. У меня нет возможностей здесь предотвратить все ошибки, экспериментируйте сами. Все! Сообщение добавлено в базу.
Теперь его надо вывести. Единственная проблема: если сообщений много, то страница грузится долго. Тогда нужно разбить сообщения на части во время их вывода. И создать страничную навигацию.
Приступаем. В файл “index.php” после тега “</form>” добавьте следующий код: (разберём его позже)
<?php
if ($_GET['start'] < 0 || !$_GET['start']) $_GET['start'] = 0;
$start = $_GET['start'];
if (!is_file("data/db.php")) fopen("data/db.php", "w"); // Проверяем наличие файла
$file = @file_get_contents("data/db.php");
$separator = "::"; // Разделитель данных в сообщении
$separator2 = ";;"; // Разделитель сообщений в файле
$messages = explode ($separator2, $file); // Разбиваем на сообщения
$pnumber = 10; // Сообщений на страницу
$cnmessages = 0;
for ($i = 0; $i < count ($messages); $i++)
{
$tmp = explode ($separator, $messages[$i]);
if (trim($tmp[2]) != "") $cnmessages++;
}
$pages = ceil ($cnmessages / $pnumber);
for ($i = $start; $i < $start + $pnumber; $i++)
{
list ($login, $email, $msg) = explode ($separator, $messages[$i]);
if ($msg != "") echo "<a href=\"mailto:".trim($email)."\">".trim($login)."</a><br>".$msg."<br><br>";
}
echo "Перейти: ";
for ($i = 0; $i < $pages; $i++)
{
echo "<a href=\"index.php?start=".($i * $pnumber)."\">".($i + 1)."</a> ";
}
?>
Всё очень просто: у нас есть переменная $_GET[‘start’], в которой хранится позиция, откуда начинать просмотр сообщений и переменная $pnumber, в которой хранится число, сколько выводить сообщений на страницу. И мы просто в цикле от начала просмотра ($start) до начала просмотра + кол-во сообщений на страницу ($start + $pnumber). А в конце выводятся страницы. Внимательно разберите этот код, в нём очень много полезного для начинающих программимтов.
Вот и написали мы гостевую... Самое главное для вас – понять принцип. Тогда даже форум типа phpBB покажется вам легким. Не останавливайтесь на достигнутом, придумывайте что-то новое.
Написал DelphiST