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