Здравствуйте Гость ( Вход | Регистрация ) | Выслать повторно письмо для активации |
Страницы: (2) [1] 2 ( Перейти к первому непрочитанному сообщению ) |
DelphiST |
Отправлено: Jul 4 2007, 04:20 AM
|
Команда ЭйсВэб Группа: Super moderator Сообщений: 1093 Пользователь №: 796 Регистрация: 23-May 07 |
Итак, в этой статье я расскажу вам, как можно буквально за 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 -------------------- |
DelphiST |
Отправлено: Jul 4 2007, 04:22 AM
|
Команда ЭйсВэб Группа: Super moderator Сообщений: 1093 Пользователь №: 796 Регистрация: 23-May 07 |
http://slil.ru/24589876
Исходник -------------------- |
Splash |
Отправлено: Jul 4 2007, 02:25 PM
|
Команда ЭйсВэб Группа: Super moderator Сообщений: 1167 Пользователь №: 675 Регистрация: 29-April 07 |
Неплохо!... а главное просто
-------------------- Забавные поздравления в стихах и прозе |
DelphiST |
Отправлено: Jul 4 2007, 02:57 PM
|
Команда ЭйсВэб Группа: Super moderator Сообщений: 1093 Пользователь №: 796 Регистрация: 23-May 07 |
Тута дело не в красоте, а в том, как устроена система.....
Спасибо! -------------------- |
Splash |
Отправлено: Jul 4 2007, 03:25 PM
|
Команда ЭйсВэб Группа: Super moderator Сообщений: 1167 Пользователь №: 675 Регистрация: 29-April 07 |
DelphiST дизайн можно всегда свой приделать. Я этим люблю заниматься!
-------------------- Забавные поздравления в стихах и прозе |
Borsuk |
Отправлено: Jul 4 2007, 06:06 PM
|
Генерал Группа: Members Сообщений: 317 Пользователь №: 1017 Регистрация: 30-June 07 |
Я ток одного не понял, чтоб зайти в ету гостевую надо давать ссылку на index.php ? Или куда ?
-------------------- |
Borsuk |
Отправлено: Jul 4 2007, 06:09 PM
|
Генерал Группа: Members Сообщений: 317 Пользователь №: 1017 Регистрация: 30-June 07 |
И еще я не понял откуда берется файл /data/db.php
Его надо самому создать или он генерируется сам =\ А и еще, ето написано на php ? -------------------- |
DelphiST |
Отправлено: Jul 5 2007, 06:09 AM
|
Команда ЭйсВэб Группа: Super moderator Сообщений: 1093 Пользователь №: 796 Регистрация: 23-May 07 |
Борсук, написано на php, файл db.php создай сам, но содеожимое генерирует гостевая.
-------------------- |
Borsuk |
Отправлено: Jul 5 2007, 11:39 PM
|
Генерал Группа: Members Сообщений: 317 Пользователь №: 1017 Регистрация: 30-June 07 |
Создать - то мы создали, а как перейти на него?
Я указываю ссылку на своем сайте на index.php а оно предлогает мне скачать файл index.php Как на сайте указать путь на гостевую что б писать туда сообшения? -------------------- |
DelphiST |
Отправлено: Jul 6 2007, 08:58 AM
|
Команда ЭйсВэб Группа: Super moderator Сообщений: 1093 Пользователь №: 796 Регистрация: 23-May 07 |
Если ты запускал не с сервера, хренос два он у тебя запустится. На сервере тести... (Денвер подойдёт)
-------------------- |
Страницы: (2) [1] 2 |