PHP. Разработка модуля комментариев для сайта - Дмитрий Приходько
{
echo $e->getMessage();
echo $e->getLine();
exit('Ошибка поиска прав пользователя');
}
$row = $s->fetch();
if ($row[0] > 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
}
/* Определяем id пользователя */
function userId() {
if (isset($_SESSION['login'])) {
try {
include $_SERVER['DOCUMENT_ROOT'].'/dsn.php';
$sql = 'SELECT id FROM users WHERE login = :login';
$s = $dsn->prepare($sql);
$s->bindValue(':login',$_SESSION['login']);
$s->execute();
$rowid=$s->fetch();
$_SESSION['userid'] = $rowid['id'];
}
catch (PDOException $e) {
echo $e->getMessage();
echo $e->getLine();
exit('Ошибка добавления пользователя');
}
}
}
Файл содержит функции для проверки данных пользователя.
Функция userIsLoggedIn()проверяет наличие и правильность данных переданных формой авторизации, активациию пользователя. В зависимости от результатов проверки этих данных устанавливает или уничтожает значения переменных сессии $_SESSION. Возвращает «true» или «false».
Для активации пользователя используется $activation. Пользователь считается активированным, если $activation = 1. Проверяем запросом к БД для указанного логина.
Функция databaseContainsAuthor() проверяет наличие в БД пользователя с переданной парой логин – пароль. Если пользователь существует возвращает «true» если нет «false».
Функция userHasRole($role)определяет уровень пользователя: «admin» или «user». В качестве параметра передается значение $role. Если $role равна значению «id» таблицы «role» установленному для данного логина при авторизации, то возвращает значение «true» иначе «false».
Функция userId() определяет «id» пользователя. Устанавливает значение переменной сессии $_SESSION['userid'].
9.1.3 Форма авторизации
Форма авторизации «form_login.php» служит для ввода логина и пароля пользователя.
Листинг 14. form_login.php Путь: /news/chat/admin/ form_login.php
<?php include_once $_SERVER['DOCUMENT_ROOT'].'/chat/admin/clean.php'; ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/chat/style.css" />
<title>Авторизация</title>
</head>
<body>
<?php if (isset($loginError)): ?>
<?php htmlout($loginError); ?>
<?php endif; ?>
<form action="" method="post" class="chatform">
<h4 class="formname">Авторизация</h4>
<hr>
<div class="login_input">
<label for="email">Логин:
<input type="text" name="login" id="login" class="inputs">
</label>
</div>
<hr>
<div>
<label for="password">Пароль:
<input type="password" name="password" id="password">
</label>
</div>
<hr>
<div>
<input type="hidden" name="action" value="out">
<input type="submit" value="Отправить">
</div>
</form>
</body>
</html>
В самом начале файла вставляем скрипт «clean.php», который будет чистить получаемые данные ($loginError).
Выводим форму. Заполняем, отправляем данные.
9.1.4 Страница ошибки активации
Страница ошибка активации erroractivation.html. Форма будет вставляться в случае ошибки активации, а именно, если переменная активации не равна 1:
$activation != 1;
проверка ведется в скрипте access.php.
Листинг 15. erroractivation.html Путь: /news/chat/admin/ erroractivation.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/chat/style.css" />
<title>Ошибка активациии</title>
</head>
<body>
<div style="float:none; display:inline-block; ">
<h5 class="ingress" style="text-align:center;">
Вы не активировали аккаунт, <br>
проверьте сообщения в почтовом ящике,<br>
указанном вами при регистрации
</h5>
</div>
<div>
<h5 class="ingress"><a href="/">Вернуться на главную страницу</a></h5>
</div>
</body>
</html>
Здесь вопросов быть не должно. Обычная html страница без кода. Часть стилей CSS заданы непосредственно на странице.
9.1.5 Кнопка выхода из раздела администрирования
Кнопка выхода из раздела администрирования «button_logout.php»
Листинг 16. button_logout.php Путь: /news/chat/admin/ button_logout.php
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" type="text/css" href="/chat/style.css" />
</head>
<div class="logouts">
<form action="/chat/admin/logout.php" method="post" class="logout">
<input type="hidden" name="action" value="logout" />
<input type="hidden" name="goto" value="/admin/" />
<input type="submit" name="action" value="Выйти" />
</form>
</div>
</html>
Кнопка передает данные скрипту logout.php (Листинг 25) который обнуляет соответствующие переменные сессии.
После создания этих фалов пробуем зайти на страницу администрирования
news/chat/admin и посмотреть что получилось.
Рис. 16. Форма авторизации закрывает вход в личный кабинет
Заполняем поля формы и отправляем данные.
Рис. 17. Страница личного кабинета открыта
Если всё прошло нормально открывается страница доступа к личному кабинету в административном разделе. На этой странице имеется кнопка «Выход», ссылки на страницы «Комментарии» и «Пользователи», а также ссылка «Вернуться на главную страницу».
9.1.6 Страница доступ запрещен
Сами понимаете, без такой страницы никуда.
Листинг 17. accessdenied.html.php Путь: news/chat/admin/ accessdenied.html.php
<?php
include_once $_SERVER['DOCUMENT_ROOT'].'/chat/admin/clean.php';
include_once $_SERVER['DOCUMENT_ROOT'].'/chat/admin/button_logout.html';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Access Denied</title>
</head>
<body>
<h1>Доступ запрещен</h1>
<b><i><?php htmlout($error); ?></i></b>
<a href="/">Вернуться на главную страницу</a>
</body>
</html>
Страница будет выводиться, в случае если у пользователя нет прав для доступа к панели управления. Допустим, user захочет войти на страницу, доступную только пользователю с правами admin. «Доступ запрещен» будет выводиться по результатам проверки в файле access.php, на странице index раздела admin вместо основной страницы.
9.2. Статистика комментариев
9.2.1 Страница комментариев
Создаем страницу просмотра статистики комментариев «comment.html.php»
Листинг 18. comment.html.php Путь: news/chat/admin/ comment.html.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/chat/style.css" />
<title>Листинг комментариев</title>
</head>
<body class="chatbody">
<h1 class="user">Статистика комментариев</h1>
<div class="statwrap" id="">
<!– Вставляем блок формы поиска –>
<div class="statone" id="">
<?php include_once $_SERVER['DOCUMENT_ROOT'].'/chat/admin/search.html.php'; ?>
</div><!– END statone –>
<div class="stattwo" id="">
<h5 class="user">Комментарии</h5>
<?php
if (isset($says)) {
foreach ($says as $say) : ?>
<p class="stat">
<?php
echo '<span style="color:cadetblue;">' . ' ' . $say['id'] . ' ' . '</span>';
//убираем смайлы
$patterns = '/(:([^>]+):)/U';
$replace = ' smile* ';
$clean = $say['text'];
$text = preg_replace($patterns, $replace, $clean);
echo $text;
$t = time($say['saydate']);
echo '<span style="color:cadetblue;">' . ' ' . date("d.m.Y", "$t") . '</span>'; ?>
<?php endforeach;
} ?>
</div><!– END stattwo –>
<div class="statthree" id="">
<h5 class="user">Ответы на комментарии</h5>
<?php
if (isset($replys)) {
foreach ($replys as $reply) : ?>
<p class="stat"><?php
echo '<span style="color:cadetblue;">' . ' ' . $reply['replyid'] . ' ' . '<-' . ' ' . '</span>';
//убираем смайлы
$patterns = '/(:([^>]+):)/U';
$replace = ' smile* ';
$clean = $reply['replytext'];
$text = preg_replace($patterns, $replace, $clean);
echo $text;
//время
$t = time($reply['replydate']);
echo '<span style="color:cadetblue;">' . ' ' . date("d.m.Y", "$t") . '</span>'; ?>
<?php endforeach;
} ?>
</div><!– END statthree –>
</div><!– END statwrap –>
<br />
<div class="return"><a href="/chat/admin/">Вернуться</a></div>
</body>
</html>
Страница функционально состоит из трех блоков:
• Блок с данными пользователей и формой поиска.
• Блок, отображающий комментарии.
• Блок, отображающий ответы на комментарии.
Предусмотрена ссылка для возврата на предыдущую страницу «Вернуться».
Содержание блоков формируется в файле comment.php в соответствии с данными отправленными формой поиска search.html.php. По умолчанию отображаются все имеющиеся данные. Комментарии и ответы на них выводятся без картинок.