Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- $messages_per_page = 5; #Параметр, определяющий число отображаемых на странице сообщений
- #Цикл инициализации основных переменных
- foreach (array('username', 'password', 'login_action', 'login_error', 'message_action', 'message_error', 'message', 'current_page', 'delete_message') as $variable_name) {
- $$variable_name = isset($_REQUEST[$variable_name])
- ? $_REQUEST[$variable_name]
- : '';
- }
- $password = md5($password); #Сразу взять хэш от пароля
- #Если текущая страница пользователя еще не установлена, то установить ее первой страницей
- if (!isset($_COOKIE['current_page']))
- set_cookie_now('current_page', 1);
- #Если была указана текущая страница, то установать ее
- if ($current_page !== '')
- set_cookie_now('current_page', $current_page);
- #Если была нажата кнопка, связанная с логином
- if ($login_action !== '') {
- #Если пользователь нажал кнопку "Выйти", то установить соответствующий флаг равным false и удалить имя пользователя из COOKIE
- if ($login_action == 'Выйти') {
- $is_logged = false;
- unset_cookie_now('username');
- }
- #Иначе выполнить авторизацию
- else
- $login_error = log_user_in($username, $password, $login_action === 'Зарегестрироваться');
- }
- $is_logged = isset($_COOKIE['username']); #Флаг, отражающий, вошел пользователь на сайт или нет
- #Если была нажата кнопка отправки сообщения
- if ($message_action == 'Отправить') {
- #Если пользователь авторизировался, забрать его имя из COOKIE
- if ($is_logged)
- $username = $_COOKIE['username'];
- #Если имя пользователя или сообщение пустые, то вывести ошибку
- if ($username == '' || $message == '')
- $message_error = 'Вы должны ввести свое имя и текст сообщения!';
- #Если все данные корректны
- if ($message_error === '') {
- #Загрузить сообщения и взять последнее
- $messages = load_from_file('messages.txt');
- $last_message = end($messages);
- #Если последнего сообщения нет (еще никто не отправлял сообщений)
- #То установать номер предыдущего сообщения равным нулю
- #Иначе взять номер предыдущего сообщения
- $last_message_number = $last_message === false
- ? 0
- : $last_message[0];
- #Сформировать новое сообщение как массив вида: номер сообщения, имя пользователя, дата, текст сообщения, адрес отправителя, а затем сохранить его
- $new_message = array($last_message_number + 1, $username, date('j M o H:i:s'), $message, $_SERVER['REMOTE_ADDR']);
- save_to_file('messages.txt', $new_message);
- }
- }
- #Если была нажата кнопка удаления сообщения
- if ($delete_message !== '') {
- $messages = load_from_file('messages.txt'); #Загрузить все сообщения
- #Пройтись по всем сообщениям
- foreach ($messages as $key=>$message) {
- #Если номер удаляемого сообщения совпадает с номером текущего сообщения, то удалить это сообщение и выйти из цикла
- if ($message[0] === $delete_message) {
- unset($messages[$key]);
- break;
- }
- }
- #Удалить файл с сообщениями, если он был
- if (is_file('messages.txt'))
- unlink('messages.txt');
- #Сохранить каждое сообщение
- foreach ($messages as $message)
- save_to_file('messages.txt', $message);
- }
- print create_header()
- .create_login_form($is_logged, $login_error)
- .create_message_box($is_logged, $message_error)
- .create_message_viewer($messages_per_page, $_COOKIE['current_page'], $is_logged);
- /**
- * Авторизация пользователя
- * @param string $__username - имя пользователя
- * @param string $__password - md5 хэш пароля пользователя
- * @param bool $__is_sign_up - осуществляет ли пользователь регистрацию
- * @return string - описание случившейся ошибки
- */
- function log_user_in($__username, $__password, $__is_sign_up) {
- #Если имя пользователя или пароль не были введены
- if ($__username === '' || $__password === md5(''))
- return 'Вы не можете оставлять поля пустыми!';
- #Загрузить пользователей из файла
- $users = load_from_file('users.txt');
- #Инициализировать переменные
- $does_user_exist = false;
- $user_password = '';
- #Пройти по каждому пользователю
- foreach($users as $user) {
- #Если введенное имя пользователя совпадает с именем уже существующего пользователя, то установить флаг существования пользователя, сохранить его пароль и выйти из цикла
- if ($user[0] === $__username) {
- $does_user_exist = true;
- $user_password = $user[1];
- break;
- }
- }
- #Если осуществляется регистрация
- if ($__is_sign_up) {
- #Если пользователь уже существует, то вернуть ошибку
- if ($does_user_exist)
- return 'Пользователь с таким именем уже существует!';
- #Иначе создать нового пользователя как массив вида: имя пользователя, пароль, а затем сохранить его
- $new_user = array($__username, $__password);
- save_to_file('users.txt', $new_user);
- }
- #Если осуществляется вход
- else {
- #Если пользователь не существует или пароль был введен неверно, то вернуть ошибку
- if (!$does_user_exist || $user_password !== $__password)
- return 'Неверное имя пользователя или пароль!';
- }
- #Установить соответствующее куки
- set_cookie_now('username', $__username);
- }
- /**
- * Создает заголовок сайта
- * @return string - заголовок сайта
- */
- function create_header() {
- return '<head>'
- .'<meta http-equiv="content-type" content="text/html; charset=utf-8">'
- .'<link rel="stylesheet" href="style.css"/>'
- .'</head>';
- }
- /**
- * Создает форму авторизации
- * @param bool $__is_logged - флаг, определяющий, авторизирован ли пользователь
- * @paran string $__login_error - ошибка при авторизации пользователя
- * @return string - форма авторизации
- */
- function create_login_form($__is_logged, $__login_error) {
- return $__is_logged
- ? '<form class="auth" action="" method="get">
- Hello, '.$_COOKIE['username'].'!
- <input class="button" type="submit" name="login_action" value="Выйти"/><br>
- </form>'
- : '<form class="auth" action="" method="get">
- <p><input class="username" type="text" name="username" value="" placeholder="имя пользователя"/>
- <input class="password" type="password" name="password" value="" placeholder="пароль"/></p>
- <p><input class="button" type="submit" name="login_action" value="Войти"/>
- <input class="button" type="submit" name="login_action" value="Зарегестрироваться"/></p>'.
- ($__login_error == '' ? '' : '<span class="error">'.$__login_error.'</span>'). #Если была ошибка, то необходимо ее вывести
- '</form>';
- }
- /**
- * Создает форму отправки сообщения
- * @param bool $__is_logged - флаг, определяющий, авторизирован ли пользователь
- * @param string $__message_error - ошибка при отправке сообщения
- * @return string - форма отправки сообщения
- */
- function create_message_box($__is_logged, $__message_error) {
- return '<form class="message_sender" action="" method="get">'
- . ($__is_logged ? '' : '<p><input class="username" type="text" name="username" value="" placeholder="имя пользователя"/> :</p>') #Если пользователь не был авторизирован, то оставить поле ввода, иначе не отображать его
- . '<p><input class="message_box" type="text" name="message" value="" placeholder="сообщение"/>
- <input class="button" type="submit" name="message_action" value="Отправить"/></p>'.
- ($__message_error == '' ? '' : '<span class="error">'.$__message_error.'</span>'). #Если была ошибка, то необходимо ее вывести
- '</form>';
- }
- /**
- * Создает механизм отображения сообщений
- * @param int $__messages_per_page - количество сообщений на страницу
- * @param int $__current_page - текущая страница
- * @param bool $__is_logged - флаг, определяющий, авторизирован ли пользователь
- * @return string - механизм отображения сообщений
- */
- function create_message_viewer($__messages_per_page, $__current_page, $__is_logged) {
- $messages = array_reverse(load_from_file('messages.txt')); #Загрузить массив сообщений и реверсировать его для правильного отображения
- $number_of_pages = ceil(count($messages) / $__messages_per_page); #Получить число страниц как округленный вверх результат деления числа сообщений на количество сообщений на страницу
- #Если текущая страница за пределами числа страниц, установить стандартное значение
- if ($__current_page > $number_of_pages)
- $__current_page = 1;
- $result = ''; #Результат работы функции
- $messages_to_print = array_slice($messages, $__messages_per_page * ($__current_page - 1), $__messages_per_page); #Взять те сообщения, которые будут сейчас отображены на экране
- #Проход по всем отображаемым сообщениям
- foreach ($messages_to_print as $message) {
- $result .= '<p><div class="message">'
- . '<span class=message_header>'
- . '<span class=name><b>'.$message[1].'</b></span>' #Напечатать имя
- . '<span class=extra>'.$message[2].' ' #Напечатать время
- #Если пользователь авторизирован как администратор, то вывести ip адрес и кнопку удаления сообщения, иначе не выводить ничего
- . ($__is_logged && $_COOKIE['username'] === 'admin'
- ? ' '.$message[4]." <a href=\"index.php?delete_message=".$message[0]."\"><img class=delete src=\"delete_icon.ico\" alt=\"\"></a>"
- : '').'</span>'
- . '</span>'
- . '<p class="message_text">'.$message[3].'</p>' #Вывести текст сообщения
- . '</div></p>';
- }
- $result .= '<div class="navigator"><p>'; #Добавить блок навигатора по страницам
- #Если число страниц меньше четырех, то необходимо вывести номера всех страниц подряд
- if ($number_of_pages < 4) {
- #Пройти по каждому индексу страницы
- for ($page_index = 1; $page_index <= $number_of_pages; ++$page_index)
- #Если индекс страницы совпал с номером текущей страницы, то напечатать подчеркнутый текст, иначе создать ссылку на страницу
- $result .= $page_index == $__current_page
- ? ' <u>'.$page_index.'</u> '
- : " <a href=\"index.php?current_page=$page_index\"><b>$page_index</b></a> ";
- }
- #Иначе сделать навигатор красивым и функциональным (со стрелочками)
- else
- #В зависимости от текущей страницы
- switch($__current_page)
- {
- case 1: #Первая страница
- $result .= "<u>$__current_page</u> " #Вывести номер страницы
- . "<a href=\"index.php?current_page=2\"><b>></b></a>" #Сделать стрелку вправо (ссылка на вторую страницу)
- . " ... ... ... " #Декорация
- . "<a href=\"index.php?current_page=$number_of_pages\"><b>$number_of_pages</b></a></p></div>"; #Сделать ссылку на последнюю страницу
- break;
- case $number_of_pages: #Последняя страница
- $result .= "<a href=\"index.php?current_page=1\"><b>1</b></a>" #Сделать ссылку на первую страницу
- . " ... ... ... " #Декорация
- . "<a href=\"index.php?current_page=".($number_of_pages - 1)."\"><b><</b></a> " #Сделать стрелку влево (ссылка на предпоследнюю страницу)
- . "<u>$__current_page</u></p></div>"; #Вывести номер страницы
- break;
- default: #Любая другая страница
- $result .= "<a href=\"index.php?current_page=1\"><b>1</b></a>" #Сделать ссылку на первую страницу
- . " ... " #Декорация
- . "<a href=\"index.php?current_page=".($__current_page - 1)."\"><b><</b></a> " #Сделать стрелку влево (ссылка на предыдущую страницу)
- . " <u>$__current_page</u> " #Вывести номер страницы
- . "<a href=\"index.php?current_page=".($__current_page + 1)."\"><b>></b></a> " #Сделать стрелку вправо (ссылка на следующую страницу)
- . " ... " #Декорация
- . "<a href=\"index.php?current_page=$number_of_pages\"><b>$number_of_pages</b></a></p></div>"; #Сделать ссылку на последнюю страницу
- }
- return $result;
- }
- /**
- * Функция, сохраняющая массив в указанный файл
- * @param type $__filename - файл, в который произвести сохранение
- * @param type $__array - массив, который необходимо сохранить
- */
- function save_to_file($__filename, $__array) {
- $result = ''; #Инициализировать результат
- #Если файла не существует, то создать его и добавить открывающий баян
- if (!is_file($__filename)) {
- touch($__filename);
- $result .= '[:|||:]';
- }
- #Проход по всем элементам массива и добавление к результату соответствующего поля
- foreach($__array as $elem)
- $result .= $elem
- #Если обрабатываем последний элемент массива, то поставить закрывающий баян, иначе разделительный
- .($elem == end($__array)
- ? '[:|||:]'
- : '[:||:]');
- file_put_contents($__filename, $result, FILE_APPEND); #Дописать получившуюся строку в файл
- }
- /**
- * Функция, загружающая из файла массив данных
- * @param string $__filename - файл, из которого необходимо прочитать массив данных
- * @return array - массив данных
- */
- function load_from_file($__filename) {
- #Если указанного файла не существует, то вернуть пустой массив
- if (!is_file($__filename))
- return array();
- #Прочитать данные из файла и разделить по большим баянам
- $data = file_get_contents($__filename);
- $splitted_data = explode('[:|||:]', $data);
- $result = array(); #Инициализировать результат пустым массивом
- #Проход по каждому блоку данных
- foreach ($splitted_data as $data) {
- #Если блок данных не пустой, то разделить его по маленьким баянам и добавить в результат
- if ($data !== '')
- $result[] = explode('[:||:]', $data);
- }
- return $result;
- }
- /**
- * Сохраняет куки на 30 минут и позволяет работать этим значением сразу же
- * @param string $__key - ключ
- * @param mixed $__value - значение
- */
- function set_cookie_now($__key, $__value) {
- setcookie($__key, $__value, time() + 60 * 30);
- $_COOKIE[$__key] = $__value;
- }
- /**
- * Удалить куки прямо сейчас
- * @param string $__key - ключ
- */
- function unset_cookie_now($__key) {
- setcookie($__key, '', 1);
- unset($_COOKIE[$__key]);
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement