Free

PHP. Разработка модуля комментариев для сайта

Text
Mark as finished
Font:Smaller АаLarger Aa

9.2.2 Форма поиска

Так как не исключена ситуация, что в комментариях нам надо будет, что-нибудь искать, поэтому создадим для страницы комментариев форму поиска «search.html.php»

Листинг 19. search.html.php Путь: news/chat/admin/ search.html.php

<form action="" method="post" class="stat">

<center>

<p>Панель информации:</p>

</center>

<fieldset>

<div>

<label for="author">Пользователь:</label>

<select name="author" id="author">

<option value="">Все пользователи</option>

<?php foreach ($users as $user) : ?>

<option value="<?php htmlout($user['id']); ?>"><?php

htmlout($user['login']); ?></option>

<?php endforeach; ?>

</select>

</div>

<div>

<p>

<label for="category">Раздел:</label>

<select name="category" id="category">

<option value="all">Все разделы</option>

<option value="say">Комментарии</option>

<option value="reply">Ответы</option>

</select>

</p>

</div>

<div class="textsearch">

<label for="text">Содержит текст:</label>

<input type="text" name="text" id="text">

</div>

<div class="textsearch_button">

<input type="hidden" name="action" value="search">

<input type="submit" value="Искать">

</div>

</fieldset><!– END fieldset –>

<fieldset>

<legend>Выборка для: </legend>

<h5 class="user"><?= $legend ?></h4>

</fieldset>

<fieldset>

<legend>Список пользователей:</legend>

<ul style="list-style-type:none;padding:0px;margin:5px;">

<?php foreach ($users as $user): ?>

<li style="border-bottom:1px solid lightgray; margin-bottom:5px;">

<?php

             htmlout($user['id']); echo '. &nbsp ';

htmlout($user['login']);

                  ?>

</li>

<?php endforeach; ?>

</ul>

</fieldset>

</form>

Обычная HTML форма в полях <fieldset> которой, сгруппированы параметры для поиска и фильтрации данных. Поиск ведется по тексту. Результаты можно отфильтровать по логину пользователя и разделу.

Форма сгруппирована из блоков:

• Панель информации – общий контейнер для блоков.

• Пользователи – выпадающий список  <select>  пользователей.

• Раздел – выпадающий список <select> разделов, их всего три «Все разделы», «Комментарии» и «Ответы».

• Поле ввода поискового запроса и кнопка для оправки этого запроса «Искать».

Данные из формы отправляются на обработку в файл comment.php.

9.2.3 Скрипт обработки страницы комментариев

Обработкой данных на странице комментариев будет заниматься файл «comment.php».

Листинг 20. comment.php Путь: news/chat/admin/ comment.php

<?php

error_reporting(E_ALL);

include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';

include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/clean.php';

//Пользователи для панели информации

try {

$result = $dsn->query('SELECT id, login FROM users');

} catch (PDOException $e) {

echo $e->getMessage();

echo $e->getLine();

exit('Ошибка поиска пользователя в базе комментариев');

}

foreach ($result as $row) {

$users[] = array('id' => $row['id'], 'login' => $row['login']);

}

/* Получаем логин пользователя при запросе */

if (isset($_POST['author']) and $_POST['author'] != '') {

try {

$sql = 'SELECT login FROM users WHERE id = :id';

$s = $dsn->prepare($sql);

$s->bindValue(':id', $_POST['author']);

$s->execute();

$legend = $s->fetchColumn(0);

} catch (PDOException $e) {

echo $e->getMessage();

echo $e->getLine();

exit('Ошибка поиска логина в базе комментариев');

}

} else {

$legend = '';

}

/* Start. Работаем с комментариями */

//если выбрано поле "ответы" выходим и ничего не делаем в разделе "комментарии"

if (isset($_POST['category']) and $_POST['category'] == 'reply') {

}

/* иначе формируем запрос к базе */

elseif (isset($_POST['action']) and $_POST['action'] == 'search' or !isset($_POST['action'])) {

include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';

// Базовое выражение SELECT.

$select = 'SELECT say.id, say.userid, say.saytext, say.saydate';

$from = ' FROM say INNER JOIN users ON say.userid = users.id';

$where = ' WHERE TRUE';

$sequence = array();

// Автор выбран

if (isset($_POST['author']) and $_POST['author'] != '') {

$where .= " AND userid = :userid";

$sequence[':userid'] = $_POST['author'];

}

// Была указана какая-то искомая строка

if (isset($_POST['text']) and $_POST['text'] != '') {

$where .= " AND saytext LIKE :saytext";

$sequence[':saytext'] = '%' . $_POST['text'] . '%';

}

try {

$sql = $select . $from . $where;

$s = $dsn->prepare($sql);

$s->execute($sequence);

} catch (PDOException $e) {

echo $e->getMessage();

echo $e->getLine();

exit('Ошибка при извлечении комментариев');

}

foreach ($s as $row) {

$says[] = array('id' => $row['id'], 'userid' => $row['userid'], 'text' => $row['saytext'], 'saydate' => $row['saydate']);

}

}

/* End. Завершаем обработку комментариев */

/* Start. Работаем с ответами на комментарии */

//если выбрано поле "комментарии" выходим и ничего не делаем в разделе "ответы"

if (isset($_POST['category']) and $_POST['category'] == 'say') {

}

/* иначе формируем запрос к базе */ elseif (isset($_POST['action']) and $_POST['action'] == 'search' or !isset($_POST['action'])) {

include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';

// Базовое выражение SELECT.

$select = 'SELECT reply.userid, reply.replytext,reply.replyid, reply.replydate ';

$from = ' FROM reply INNER JOIN users ON reply.userid = users.id ';

$where = ' WHERE TRUE';

$order = ' ORDER BY reply.replyid';

$sequencer = array();

if (isset($_POST['author']) and $_POST['author'] != '') { // Автор выбран

$where .= " AND userid = :userid";

$sequencer[':userid'] = $_POST['author'];

}

if (isset($_POST['text']) and $_POST['text'] != '') { // Была указана какая-то искомая строка

$where .= " AND replytext LIKE :replytext";

$sequencer[':replytext'] = '%' . $_POST['text'] . '%';

}

try {

$sql = $select . $from . $where . $order;

$s = $dsn->prepare($sql);

$s->execute($sequencer);

} catch (PDOException $e) {

echo $e->getMessage();

echo $e->getLine();

exit('Ошибка при извлечении ответов на комментарии');

}

foreach ($s as $row) {

$replys[] = array('replyid' => $row['replyid'], 'userid' => $row['userid'], 'replytext' => $row['replytext'], 'replydate' => $row['replydate']);

}

}

include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/comment.html.php';

Вывод информации производится в соответствии с условиями заданными в форме поиска: по имени пользователя, по разделу, по искомому тексту.

В начале скрипта делаем выборку из БД всех пользователей. Затем получаем из БД логин пользователя, для которого выполняется поиск.

Создаем запрос SELECT, зависящий от указанных в форме условий. Сначала определим строки, объединение которых формирует запрос SELECT в том случае, если не выбран ни один критерий, строки находятся в переменных:

$select, $from и $where.

Если кнопка «Искать» не нажималась, то $_POST['action'] будет отсутствовать и будут, отображены все комментарии и ответы них.

Т.к. базовое выражение SELECT собирается из тех критериев, что выбраны в форме, то в запросе будут операторы FROM и WHERE. Если критерии не заданы (то есть нужно получить все данные из БД), WHERE будет ненужной. Добавлять выражения к несуществующему оператору проблематично, поэтому подставляем такую команду, которая никак не повлияет на результат, если ее опустить. Здесь подойдет выражение WHERE TRUE, которое всегда истинно.

Для добавления новой строки к существующей используется оператор конкатенации (.=). В этом скрипте к оператору WHERE добавляется условие, по которому содержимое поля userid из таблицы say должно совпадать со значением псевдопеременной :userid. Вначале скрипта с помощью метода bindValue установить требуемое общее значение $_POST['author'] нельзя т.к. еще не подготовлен объект параметризированного запроса, из которого этот метод вызывается. Вследствие этого запрос разбросан по вышеперечисленным строкам ($select, $from и $where).

Инициализируем массив $sequence для сохранения параметризированных переменных, используя их имена в качестве индексов. В массиве будет храниться id пользователя и текст поискового запроса. Содержимое массива:

$sequence (

:userid => "$_POST['author']",

:saytext => "'%'.$_POST['text'].'%'"

);

где "$_POST['author']" = $user['id'].

Чтобы получить значение параметризированной переменной для оператора LIKE, содержимое $_POST['text'] размещено между двумя знаками процента (%). LIKE воспринимает этот знак как групповой символ, поэтому при поиске строки $_POST['text'] в поле text формы search.html.php в расчет будут приниматься также строки, где до и после этого значения находится другой текст.

 

Запускаем. Если все сделано без ошибок, то при запущенном на «Open Server» тестовом сайте при переходе по адресу: news/chat/admin/comment.php видим страницу статистики комментариев (см. рис. 15)


Рис. 18. Вид страницы статистики комментариев


На этом этапе необходимо заняться контроллером 2 и кнопками авторизации, так как опробовать работу страницы в деле пока нельзя в связи с отсутствием комментариев и ответов на них.

10. Контроллер 2

Контроллер 2 будет заниматься контролем авторизации пользователей и их возможностям для работы с комментариями.

Напишем код для входа на страницу личного кабинета и связанных с ней страниц. Контроллер 2 назовем «login_controller.php» и разместим в корне папки «chat», т.е. там же, где и контроллер 1 (createbase_controller.php)

Листинг 21. login_controller.php Путь: news/chat/ login_controller.php

<?php

error_reporting(E_ALL);

/* Проверяем данные пользователя, устанавливаем данные сессии */


include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/access.php';

userIsLoggedIn();

userId();


if (isset($_SESSION['login'])) {

echo '<div class="welcom">Welcome '.$_SESSION['login'].'</div>'; //Выводим "Привет юзер"


/* Вставляем кнопки "Кабинет" и "Выход" */


include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/button_cabinet.html';

include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/button_logout.html';

} else {

include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/input_button_block.html';


if (!empty($_GET['name'])) {

include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/form_login.php';

}

}

В подключаемом файле access.php проверяем данные пользователя и устанавливаем данные сессии.

После проверки данных функциями userIsLoggedIn() и userId()если пользователь авторизован приветствуем его и вставляем кнопки «Кабинет» и «Выход». Если нет, выводим блок кнопок «Вход», «Регистрация», «На главную» и форму авторизации.

Напишем коды кнопок и опробуем его в деле, это можно будет сделать после добавления файлов рассматриваемых в следующем разделе.

11. Кнопки раздела администрирования
11.1 Кнопки вход и регистрация

Кнопки «Вход» «Регистрация» и «На главную» сгруппированы в одном файле «input_button_block.html»


Листинг 22. input_button_block.html Путь: news/chat/admin/ users/ input_button_block.html


<!DOCTYPE html>

<html lang="en">

<head>

<link rel="stylesheet" type="text/css" href="/chat/style.css" />

</head>

<div class="inputbutton">

<div class="ingress">

<a href="?name=door">Вход</a>

</div>


<div class="ingress">

<a href="admin/users/reg.php">Регистрация</a>

</div>

<div class="ingress">

<a href="/">На главную</a>

</div>

</div>

</html>


Назначаем обработчик нажатия кнопки «Вход».

11.2 Обработчик кнопки вход

Для обработки нажатия кнопки вход используем метод GET передавая в нем переменную «door». При нажатии кнопки происходит перезагрузка страницы и если контроллер видит переменную door то вставляет файл form_login.php


Листинг 23. 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="/style.css" />

<title>Авторизация</title>

</head>


<body>

<?php if (isset($loginError)): ?>

<p><?php htmlout($loginError); ?></p>

<?php endif; ?>

<form action="" method="post">

<h4 class="formname">Авторизация</h4>

<hr>

<div>

<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>

В эту форму пользователь вставляет свои логин и пароль и отправляет дальше на проверку.

11.3 Кнопки кабинет и выход

Страница опять перегрузилась. Если логин и пароль введены корректно, то выводим кнопки «Кабинет» и «Выход», а заодно напечатаем в контроллере 2 приветствие:«Welcome $user».

Кнопка «Кабинет» файл «button_cabinet.html».


Листинг 24. button_cabinet.html Путь: news/chat/admin/ button_cabinet.html


<!DOCTYPE html>

<html lang="en">

<head>

<link rel="stylesheet" href="/chat/style.css" />

</head>

<div class="cabinets">

<form action="/chat/admin/index.php" method="post" class="cabinet">

<input type="submit" name="action" value="Кабинет" />

</form>

</div>

</html>


Кнопка «Выход» файл «button_logout.html» рассмотрена ранее в Листинге 16.


Обработчик события кнопки «Выйти» файл «logout.php»


Листинг 25. logout.php Путь: news/chat/admin/ logout.php


<?php

if (session_id() == '') {

session_start();

}

/* Проверяем была ли нажата кнопка "Выйти" если 'Да' уничтожаем сессию */

if (isset($_POST['action']) and $_POST['action'] == 'Выйти') {

unset($_SESSION['loggedIn']);

unset($_SESSION['login']);

unset($_SESSION['password']);

}

header("Location: " . $_SERVER["HTTP_REFERER"]);


При нажатии кнопки «Выйти» идет переход на страницу logout.php, где происходит сброс значений сессии, а затем делается редирект обратно на исходную страницу.

Для того чтобы вывести кнопки и формы необходимо в исходный текст стартовой страницы вставить (инклюдить) следующий код

<?php include_once $_SERVER['DOCUMENT_ROOT'].'/chat/login_controller.php'?>


Листинг 26. index.html

Вставка контроллера 2: login_controller.php в файл: news/index.html


<?php include_once $_SERVER['DOCUMENT_ROOT'].'/chat/createbase_controller.php'?>

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>NEWS</title>

</head>

<body>

<?php include_once $_SERVER['DOCUMENT_ROOT'].'/chat/login_controller.php'?>

<p>Значимость этих проблем настолько очевидна, что начало повседневной работы по формированию позиции способствует

подготовке и реализации новых предложений!

<br>

Значимость этих проблем настолько очевидна, что повышение уровня гражданского сознания влечет за собой процесс

внедрения и модернизации модели развития.

<br> Практический опыт показывает, что рамки и место обучения кадров способствует повышению актуальности

соответствующих условий активизации.</p>

</body>

</html>


Код строк вставок контроллера1 и контроллера 2 выделен цветом.

кнопки будут выведены в том месте документа, где вставлен код строки подключения login_controller.php.

Можете поэкспериментировать с местом размещения «инклюда» в документ. Далее приведены скриншоты, иллюстрирующие работу контроллеров 2 и 1.

Начинают появляться выводимые элементы, поэтому понемногу надо задавать им стили css. Дальнейшие скриншоты работы программы будут с использованием стилей, но сама итоговая страница стилей будет приведена в конце книги, чтобы не было лишней путаницы.




Рис. 19. Пользователь не авторизован





Рис. 20. Пользователь авторизовался

12. Страница панель управления

На страницу «Панель управления» попадаем при нажатии кнопки «Кабинет». За вывод страницы отвечает файл index.php в папке «users».


Листинг 27. index.php Путь: news/chat/admin/users/index.php


<?php

error_reporting(E_ALL);


include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/access.php';


/*.........Проверяем полномочия пользователя..............*/


if (!userIsLoggedIn()) {

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/form_login.php';

exit();

}


if (!userHasRole('admin') and !userHasRole('user')) {

exit('Доступ только для Администратора');

}

/*..........Если admin разрешаем все. Start admin..........*/

//Начинаем основной цикл для администратора


if (userHasRole('admin')) {


/*.....Подключение нового пользователя.................*/


if (isset($_GET['add'])) {

include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';


$pageTitle = 'Подключение нового пользователя';

$action = 'addform';

$name = '';

$email = '';

$id = '';

$button = 'Добавить пользователя';


// Выводим уровни доступа

try {

$result = $dsn->query('SELECT id, description FROM role');

} catch (pdoException $e) {

$error = 'Ошибка при получении списка ролей.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


foreach ($result as $row) {

$roles[] = array(

'id' => $row['id'],

'description' => $row['description'],

'selected' => false

);

}

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/form_add_user.php';

exit();

}

/*....... 1. Добавление нового пользователя..............*/


if (isset($_GET['addform'])) {

include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/avatar.php';


/*.... 1.1 Проверяем все ли поля формы заполнены.....*/


if (empty($_POST['login']) or empty($_POST['password']) or empty($_POST['email']) or empty($_POST['roles'])) {

       exit("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");

}


if (mb_strlen($_POST['login']) < 3 or mb_strlen($_POST['login']) > 15) { // проверяем длину логина


exit("Логин должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев

}


/*..... 1.2 Проверка корректности email..............*/


if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $_POST['email'])) {

exit("Неверно введен е-mail!");

}


/*.... 1.3 Проверка существования логина..............*/


try {

$logresult = $dsn->query('SELECT login FROM users');

} catch (pdoException $e) {

$error = 'Логин не существует.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


//заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную


if (isset($_POST['login'])) {

$login = $_POST['login'];

if ($login == '') {

unset($login);

$error = 'Логин пустой.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


foreach ($logresult as $row) {

$logins[] = array(

'login' => $row['login']

);


if ($row['login'] == $_POST['login']) {

$error = 'Логин занят.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}

}

}

/*....Сохранение данных пользователя.....*/

//Блок вложен в основной цикл админа


try {

$sql = 'INSERT INTO users SET

 

login = :login,

email = :email,

      activation = :activation,

      date = :date';

$s = $dsn->prepare($sql);

$s->bindValue(':login', $_POST['login']);

$s->bindValue(':email', $_POST['email']);

$s->bindValue(':activation', "1");

$s->bindValue(':date', time());

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка добавления отправленного пользователя.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}

if ($_POST['password'] != '') {

$password = md5($_POST['password'] . 'swl');

$authorid = $dsn->lastInsertId();


try {

$sql = 'UPDATE users SET

password = :password

WHERE id = :id';

$s = $dsn->prepare($sql);

$s->bindValue(':password', $password);

$s->bindValue(':id', $authorid);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка 1 установки пароля.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}

}


try {

$sql = 'UPDATE users SET

img = :img

WHERE id = :id';

$s = $dsn->prepare($sql);

$s->bindValue(':img', $avatar);

$s->bindValue(':id', $authorid);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка 2 установки пароля.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


if (empty($_POST['roles'])) {

$error = 'Вы не отметили полномочия нового пользователя';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


if (isset($_POST['roles'])) {

foreach ($_POST['roles'] as $role) {

try {

$sql = 'INSERT INTO authorrole SET

authorid = :authorid,

roleid = :roleid';

$s = $dsn->prepare($sql);

$s->bindValue(':authorid', $authorid);

$s->bindValue(':roleid', $role);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка при назначении выбранной роли пользователю.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}

}

}

header('Location: .');

exit();

}


/*........Редактирование пользователя...........*/

//Блок вложен в основной цикл админа


if (isset($_POST['action']) and $_POST['action'] == 'Редактировать') {

include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';


try {

$sql = 'SELECT id, login, email, img FROM users WHERE id = :id';

$s = $dsn->prepare($sql);

$s->bindValue(':id', $_POST['id']);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка при получении сведений об авторе.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


$row = $s->fetch();


$pageTitle = 'Редактирование профиля';

$action = 'editform';

$login = $row['login'];

$email = $row['email'];

$id = $row['id'];

$avatar = $row['img'];

$button = 'Отправить';


//Уровень доступа автора


try {

$sql = 'SELECT roleid FROM authorrole WHERE authorid = :id';

$s = $dsn->prepare($sql);

$s->bindValue(':id', $id);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка при получении назначенной роли пользователя.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


$selectedRoles = array();

foreach ($s as $row) {

$selectedRoles[] = $row['roleid'];

}


// Готовим список уровней доступа

try {

$result = $dsn->query('SELECT id, description FROM role');

} catch (pdoException $e) {

$error = 'Ошибка при получении списка ролей.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


foreach ($result as $row) {

$roles[] = array(

'id' => $row['id'],

'description' => $row['description'],

'selected' => in_array($row['id'], $selectedRoles)

);

}


include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/form_add_user.php'; //выводим форму добавления и редактирования пользователя

exit();

}


if (isset($_GET['editform'])) {

include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/avatar.php'; //инициализируем аватар пользователя


/*..... 2.1 Проверяем все ли поля формы заполнены......*/


if (empty($_POST['login']) or empty($_POST['password']) or empty($_POST['email']) or empty($_POST['roles'])) {

exit("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");

}


if (mb_strlen($_POST['login']) < 3 or mb_strlen($_POST['login']) > 15) { // проверяем длину логина

exit("Логин должен состоять не менее чем из 3 символов и не более чем из 15.");

}


/*....... 2.2 Проверка корректности email...............*/


if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $_POST['email'])) {

exit("Неверно введен е-mail!");

}


try {

if (!isset($date)) {

$date = time();

}

$sql = 'UPDATE users SET

login = :login,

email = :email,

      img = :img,

      date = :date

WHERE id = :id';

$s = $dsn->prepare($sql);

$s->bindValue(':id', $_POST['id']);

$s->bindValue(':login', $_POST['login']);

$s->bindValue(':email', $_POST['email']);

$s->bindValue(':date', $date);

$s->bindValue(':img', $avatar);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка при обновлении пользователя.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


if ($_POST['password'] != '') {

$password = md5($_POST['password'] . 'swl');


try {

$sql = 'UPDATE users SET

password = :password

WHERE id = :id';

$s = $dsn->prepare($sql);

$s->bindValue(':password', $password);

$s->bindValue(':id', $_POST['id']);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка установки пароля автора.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}

}


if (empty($_POST['roles'])) {

$error = 'Вы не отметили полномочия нового пользователя';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


try {

$sql = 'DELETE FROM authorrole WHERE authorid = :id';

$s = $dsn->prepare($sql);

$s->bindValue(':id', $_POST['id']);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка удаления устаревших записей роли пользователя.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


if (isset($_POST['roles'])) {

foreach ($_POST['roles'] as $role) {

try {

$sql = 'INSERT INTO authorrole SET

authorid = :authorid,

roleid = :roleid';

$s = $dsn->prepare($sql);

$s->bindValue(':authorid', $_POST['id']);

$s->bindValue(':roleid', $role);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка при назначении выбранной роли автору.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}

}

}


header('Location: .');

exit();

}

/*....Удаление 2.Результат работы формы, вызываемой кодом ниже(Удаление 1)…*/


if (isset($_POST['action']) and $_POST['action'] == 'ДА') {


// Удаляем ассоциации пользователя


include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';


try {

$sql = 'DELETE FROM authorrole WHERE authorid = :id';

$s = $dsn->prepare($sql);

$s->bindValue(':id', $_POST['id']);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка удаления роли пользователя.';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


// Удаляем пользователя


try {

$sql = 'DELETE FROM users WHERE id = :id';

$s = $dsn->prepare($sql);

$s->bindValue(':id', $_POST['id']);

$s->execute();

} catch (pdoException $e) {

$error = 'Ошибка удаления пользователя индекс.';

$e->getMessage();

$e->getLine();

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}

header('Location: .');

exit();

}

/*…Первичный запрос на удаление. Выводит форму выбора ДА или НЕТ. Удаление 1…*/


if (isset($_POST['action']) and $_POST['action'] == 'Удалить') {

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/delete.php';

exit();

}


//Готовим лист с данными пользователей


include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';


try {

$result = $dsn->query('SELECT users.id,users.login, users.img, authorrole.roleid FROM `users` INNER JOIN authorrole ON users.id =authorrole.authorid');

} catch (pdoException $e) {

$error = 'Ошибка при получении пользователей из базы данных!';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/error.html.php';

exit();

}


foreach ($result as $row) {

$authors[] = array('id' => $row['id'], 'login' => $row['login'], 'roleid' => $row['roleid'], 'img' => $row['img']);

}


include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/authors.html.php'; //вставляем листинг авторов

}

//Закончили основной цикл для администратора


/*............. END admin.........................*/


/*............ Start user........................ */


//Работа с простым пользователем


if (userHasRole('user')) {

include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/users/edituser.php';

}

//Закончили работу простым пользователем

/*.............. END user........................ */


/* Удаляем неактивных пользователей.

Удаление происходит из двух таблиц при обновлении страницы */


try {

$sql = "SELECT * FROM users INNER JOIN authorrole ON users.id = authorrole.authorid WHERE users.activation IS NULL OR users.activation !='1' ";

$s = $dsn->query($sql);

$no_active = $s->Fetchall();

} catch (pdoException $e) {

exit('Ошибка при выборке неактивных пользователей');

}


foreach ($no_active as $nouser) {

$r = time() – $nouser["date"];

$id = $nouser['id'];


if ($r > 3600) {

try {

$sql = "DELETE FROM users WHERE id = :id AND activation IS NULL OR users.activation !='1'";

$s = $dsn->prepare($sql);

$s->bindValue(':id', $id);

$s->execute();

} catch (pdoException $e) {

exit('Ошибка при выборке неактивных пользователей0');

}


try {

$sql = "DELETE FROM authorrole WHERE authorid = :id";

$s = $dsn->prepare($sql);


foreach ($no_active as $nouser) {

$authorid = $nouser['id'];

$s->bindValue(':id', $authorid);

$s->execute();

}

} catch (pdoException $e) {

exit('Ошибка при выборке неактивных пользователей');

}

}

}


Файл состоит из трех частей. В первой обрабатываются данные администратора. Во второй части подключается файл edituser.php и в нем обрабатываются данные обычного пользователя. Вторая часть начинается с комментария /* Start user */. В третьей части идет проверка неактивных пользователей и их удаление.

Скрипты, которые обрабатывает файл index.php:


– /chat/admin/access.php';

– /chat/admin/users/authors.html.php;

– /chat/admin/users/edituser.php;

– /chat/admin/users/error.html.php';

– /chat/admin/users/form_add_user.php';

– /chat/admin/users/avatar.php';

– /chat/admin/users/form_add_user.php';

– /chat/admin/users/delete.php';


Обработка данных администратора заключается в следующем:


1. Сквозной вариант без нажатия ссылок и кнопок


1.1 Проверяются полномочия пользователя для захода на страницу, если пользователь не «admin» и не «user» доступ к странице закрывается.

1.2 Если права «admin», то проверяются нажатия ссылок «Добавить нового пользователя», кнопок «Редактировать» и «Удалить».

1.3 Если кнопки не нажимались идем дальше и проверяем пользователя на права «user».

1.4 Если права не «user», переходим к последней, третьей части в которой идет удаление неактивных пользователей.

1.5 Удаление не активных пользователей сделано для тех пользователей, которые активируются самостоятельно, а не добавлены администратором. Принцип удаления таков: если пользователь начал регистрацию на сайте, получил письмо на свою электронную почту и в течении часа не ответил на него, перейдя по указанной в письме активации ссылке, то его данные удаляются из БД. Сам алгоритм определения неактивных пользователей следующий:

Делается SQL запрос к таблице «users» и связанной с ней таблицей «authorrole», в котором выбираются все пользователи, у которых значение activation не равно 1. Полученный массив обрабатывается построчно в цикле foreach по условию:


$r = time() – $nouser["date"];


где:

time() – текущее время;

$nouser["date"]– время регистрации пользователя (соответствует значению «date» таблицы «users»).

За время активации отвечает параметр $r. Если у пользователя $r > 3600 идет удаление значений данного пользователя из таблиц «users» и «authorrole».

Внимание! В файле много sql запросов, если некоторые не очень понятны, можно перейти в phpMyAdmin зайти в базу beseder выбрать вкладку sql и самостоятельно посмотреть, что выдают запросы в коде. при вставке не забудьте заменить переменные их значениями.