Free

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

Text
Mark as finished
Font:Smaller АаLarger Aa

2. Нажата ссылка «Добавить нового пользователя»

2.1. Страница перегружается и появляется переменная $_GET['add'].

2.2 Инициализируем переменные добавления пользователя, вставляем форму добавления пользователя form_add_user.php. После заполнения формы проверяются переданные ею данные и устанавливается «аватар» в подключаемом скрипте avatar.php.

2.3 Данные заносятся в БД.

2.4 Проверяются и удаляются не активированные пользователи.

3. Нажата кнопка «Редактировать».

3.1 Появляется $_POST['action'] == 'Редактировать'

3.2. Также вставляется form_add_user.php, но в ней уже заранее установлены данные конкретного пользователя.

3.3 Данные изменяются администратором, проверяются и заносятся в БД.

3.4 Проверяются и удаляются не активированные пользователи.

4. Нажата кнопка «Удалить»

4.1. Появляется $_POST['action'] == 'Удалить', выполняется условие вставки скрипта подготовки удаления delete.php и формы удаления form_delete.php. Если в форме удаления соглашаемся и нажимаем «Да» то $_POST['action'] == 'Да' и запускается код удаления. Удаление происходит из таблицы «users» и связанной с ней таблицей «authorrole».

13. Управление пользователями

Попадаем при переходе по ссылке «Пользователи» на странице «Панель управления». За вывод страницы отвечает файл authors.html.php .

Листинг 28. authors.html.php Путь: news/chat/admin/users/ authors.html.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>

<h2 class="user">Управление пользователями</h2>

<div class="addusers"><a href="?add">Добавить нового пользователя</a></div>

<div class="ourwrapper" id="">

<!– <ul>–>

<?php foreach ($authors as $author) : ?>

<!– <li style="list-style-type: none">–>

<div class="formuser">

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

<div class="wrapuser">

<div class="topuser" id="">

<p class="login_art">

<span class="number"># <?php htmlout($author['id']); ?></span>

<?php htmlout($author['login']); ?>

</p>

</div><!– end topuser –>

<?php

$ava = $author['img'];

echo '<img class="imgava" src="' . $ava . '">' . ' ';

echo '<p>';

htmlout($author['roleid']); //выводим уровень доступа пользователя

echo '</p>' . '<br>';

?>

<input type="hidden" name="id" value="<?php echo $author['id']; ?>">

<input type="submit" name="action" value="Редактировать">

<input type="submit" name="action" value="Удалить" onclick="">

</div><!– end wrapuser –>

</form>

</div><!– end formuser –>

<!–</li>–>

<?php endforeach; ?>

<!–</ul>–>

</div><!– end ourwrapper –>

<p><a href="..">Вернуться</a></p>

</body>

</html>

На этой странице выводится список пользователей и предоставляется возможность их редактирования.

Страница получает массив authors от страницы index.php обрабатывает и выводит на печать.

14. Форма добавления пользователя

Для добавления пользователя служит файл формы «form_add_user.php»

Листинг 29. form_add_user.php Путь: news/chat/admin/users/ form_add_user.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><?php htmlout($pageTitle); ?></title>

</head>

<body>

<h1><?php htmlout($pageTitle); ?></h1>

<form action="?<?php htmlout($action); ?>" method="post" enctype="multipart/form-data">

<fieldset class="usernames">

<div class="username">

<label for="name">Имя: &nbsp &nbsp &nbsp

       <input type="text" name="login"

id="login" value="<?php if (isset($login)){

            htmlout($login);} ?>" >

       </label>

</div> <!– end.username –>

<div class="username">

<label for="email">Email: &nbsp &nbsp

      <input type="email" name="email"

id="email" value="<?php htmlout($email); ?>"></label>

</div><!– end.username –>

<div class="username">

<label for="password">Пароль:&nbsp

      <input type="password"

name="password" id="password"></label>

</div><!– end.username –>

</fieldset><!– end.fieldset usernames–>

<br/>

<fieldset class="ava">

<legend>Загружаем аватар:</legend>

<p>

<label><p>Выберите аватар. Изображение должно быть формата jpg, gif или png:</p>

<p>Загружаем готовые аватары или картинки только квадратной формы</p><br>

       </label>

<input type="FILE" name="fupload">

</p>

</fieldset><!– end.fieldset ava –>

<fieldset class="level">

<legend>Уровень доступа пользователя:</legend>

<?php for ($i = 0; $i < count($roles); $i++): ?>

<div>

<label for="role<?php echo $i; ?>">

                  <input type="checkbox"

name="roles[]" id="role<?php echo $i; ?>"

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

if ($roles[$i]['selected']) {

echo ' checked';

} ?>

             >

             <?php htmlout($roles[$i]['id']); ?></label>:

<?php htmlout($roles[$i]['description']); ?>

<?php endfor; ?>

</fieldset><!– end.fieldset level –>

<div>

<input type="hidden" name="id" value="<?php

htmlout($id); ?>">

<input type="submit" value="<?php htmlout($button); ?>">

</div>

</form>

<a href="/chat/admin/">Вернуться</a>

</body>

</html>

Форма принимает данные для создания нового пользователя «Имя», «Электронная почта», «Пароль», «Аватар», «Роль пользователя» и передает их обработчику на той же странице index.php форма вставляется при нажатии ссылки «Добавить нового пользователя», которое обновляет страницу и создает переменную $_GET['add'], являющуюся условием вставки формы.

Поскольку в форме будет передаваться картинка аватар, то необходимо указать атрибут формы enctype="multipart/form-data".

15. Форма удаления пользователя

Для удаления выбранного пользователя служит форма «form_delete.php»

Листинг 29. form_delete.php Путь: news/chat/admin/users/ form_delete.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 class="chatbody">

<h1>Удаление</h1>

<ul>

<?php foreach ($authors as $author) : ?>

<li style="list-style-type: none">

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

<div>

<p>Вы действительно хотите удалить этого пользователя?</p>

<hr>

<p>

<input type="hidden" name="id" value="<?php echo $author['id']; ?>">

<input type="submit" name="action" value="ДА">

<input type="submit" name="action" value="НЕТ">

</p>

<?php

$ava = $author['img'];

echo '<img src="' . $ava . ' ">'.'<p>';

htmlout($author['login']);

            echo ' ';

htmlout($author['roleid']);

            echo '<p>';

?>

</div>

</form>

</li>

<?php endforeach; ?>

</ul>

<p><a href="..">Вернуться</a></p>

</body>

</html>

Форма выводит кнопки «Да» и «Нет», по нажатии которых страница обновляется и если была нажата «Да» происходит удаление пользователя.

Логика работы следующая: если нажата кнопка «Удалить» вставляется файл обработчик «delete.php», который делает выборку данных пользователя и вставляет форму подтверждения удаления, если удаление подтверждено, нажата кнопка «Да», то страница перегружается и само удаление происходит уже в файле «index.php».

16. Скрипт подготовки удаления пользователя

Подготовку удаления пользователя выполняет файл «delete.php»

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

<?php

error_reporting(E_ALL);

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

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

/* Делаем выборку данных пользователя из связанных таблиц */

 

try{

$sql = 'SELECT users.id,users.login, users.img, authorrole.roleid FROM `users` INNER JOIN authorrole ON users.id =authorrole.authorid

WHERE users.id = :id';

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

$s->execute(array('id' => $_POST['id']));

$result = $s->Fetchall();

}

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/form_delete.php';

Готовит данные для идентификации удаляемого пользователя и передает их на печать в форме form_delete.php.

Запрос как обычно, в таблицы «users» и «authorrole». Выводит форму «Вы действительно хотите удалить этого пользователя?». Удаление происходит на странице chat/admin/users/index.php в зависимости от ответа, выбранного в форме form_delete.php' (Листинг 29).

17. Вывод аватара

Для вывода аватаров пользователей я воспользовался готовым решением https://ruseller.com/lessons.php?rub_id=37&id=350. За вывод аватаров пользователей отвечает файл «avatar.php».

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

<?php

error_reporting(E_ALL);

/*....................avatar................................*/

if (empty($_FILES['fupload']['name']))

{

//если переменной не существует (пользователь не отправил изображение),то присваиваем ему заранее приготовленную картинку с надписью "нет аватара"

$avatar = 'avatars/noavatar.png'; //картинка в исходниках

}

else {

//иначе – загружаем изображение пользователя

$path = 'avatars/'; //папка, куда будет загружаться начальная картинка и ее сжатая копия

if(preg_match('/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['fupload']['name']))//проверка формата исходного изображения

{

$filename = $_FILES['fupload']['name'];

$source = $_FILES['fupload']['tmp_name'];

$target = $path.$filename;

move_uploaded_file($source, $target);//загрузка оригинала в папку $path

if(preg_match('/[.](GIF)|(gif)$/', $filename)) {

$im = imagecreatefromgif($path.$filename) ; //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия

}

if(preg_match('/[.](PNG)|(png)$/', $filename)) {

$im = imagecreatefrompng($path.$filename) ;//если оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия

}

if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) {

$im = imagecreatefromjpeg($path.$filename); //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия

}

// Создание квадрата 90x90

// dest – результирующее изображение

// w – ширина изображения

// ratio – коэффициент пропорциональности

$w = 90; // квадрат 90x90

$h = 90;

// создаём исходное изображение на основе исходного файла и определяем его размеры

$w_src = imagesx($im); //вычисляем ширину

$h_src = imagesy($im); //вычисляем высоту изображения

if ($w_src !== $h_src) {

exit ('<h4>Стороны изображения для загрузки должны быть равны. Квадрат. Например 256*256.<br>Рекомендую использовать готовые аватары со специализированных сайтов.<br>

Или подготовьте картинку в графическом редакторе</h4><br><i>p.s. грузим аватары, а не картины</i>');

}

// создаём пустую квадратную картинку именно truecolor!, иначе будет 8-битный результат

$dest = imagecreatetruecolor($w,$w);

$white = imagecolorallocate($dest, 255, 255, 255);

imagefill($dest, 0, 0, $white);

imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $h_src);

$date=time(); //вычисляем время в настоящий момент.

imagejpeg($dest, $path.$date.".jpg");//сохраняем изображение формата jpg в нужную папку, именем будет текущее время. Сделано, чтобы у аватаров не было одинаковых имен.

$avatar = $path.$date.'.jpg';//заносим в переменную путь до аватара.

$delfull = $path.$filename;

unlink ($delfull);//удаляем оригинал загруженного изображения, он нам больше не нужен. Задачей было – получить миниатюру.

}

else

{

       //в случае несоответствия формата, выдаем соответствующее сообщение

exit ("Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>"); //останавливаем выполнение сценариев

}

//конец процесса загрузки и присвоения переменной $avatar адреса загруженной авы

}

Скрипт создает и присваивает пользователю аватар из выбранной им картинки и загружает его под уникальным именем в папку avatars. Листинг подробнейший, мне кажется, здесь пояснения не нужны.

18. Работа с обычным пользователем
18.1 Скрипт работы с пользователем

Скрипт аналогичен коду использумому для работы с администратором в индексном файле папки «users» за исключением того, что пользователь видит и может редактировать только свои данные. Кроме того он не может поменять свой логин. За это отвечает свойство Readonly в поле ввода логина.

За обработку данных отвечает файл «edituser.php».

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

<?php

error_reporting(E_ALL);

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

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

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_edit_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'])) {

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

}

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

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

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

}

try {

$sql = 'UPDATE users SET

login = :login,

email = :email,

      img = :img

WHERE id = :id';

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

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

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

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

$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();

}

}

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 {

$sql = 'SELECT users.id,users.login, users.img, authorrole.roleid FROM `users` INNER JOIN authorrole ON users.id =authorrole.authorid

WHERE users.login = :login';

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

$s->execute(array('login' => $_SESSION['login']));

$result = $s->Fetchall();

} 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/list_edit_user.php';

Подключаемся к БД проверяем какие кнопки были нажаты, проверяем данные пользователя, обрабатываем результаты. Формируем запросы и создаем первичные массивы для дальнейшей их обработки в соответствующих формах. Обновляем, удаляем или оставляем без изменений данные пользователя в БД.

18.2 Страница пользователя

Файл страницы пользователя «list_edit_user.php»

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

<?php

include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/clean.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">

<h2>Редактировать профиль</h2>

<ul>

<?php foreach ($authors as $author) : ?>

<li style="list-style-type: none">

 

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

<div class="list_edituser">

<?php

$ava = $author['img'];

echo '<img src="' . $ava . '">';

htmlout($author['login']);

echo " ";

htmlout($author['roleid']);

?>

<input type="hidden" name="id" value="<?php echo $author['id']; ?>">

<input type="submit" name="action" value="Редактировать">

<input type="submit" name="action" value="Удалить">

</div>

</form>

</li>

<?php endforeach; ?>

</ul>

<p><a href=".." class="apreturn">Вернуться</a></p>

</body>

</html>

Выводит страницу содержащую данные пользователя и форму для выбора действий с этими данными: «Редактировать», «Удалить».

18.3 Форма редактирования пользователя

Файл формы «form_edit_user.php».

Листинг 34. form_edit_user.php Путь: news/chat/admin/users/ form_edit_user.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><?php htmlout($pageTitle); ?></title>

</head>

<body class="chatbody">

<h1><?php htmlout($pageTitle); ?></h1>

<p style='font-style:italic'>Здесь вы можете поменять аватар, пароль и email</p>

<form action="?<?php htmlout($action); ?>" method="post" enctype="multipart/form-data" class="chatform">

<div>

<label for="name">Имя: &nbsp &nbsp &nbsp

       <input type="text " READONLY name="login"

id="login" value="<?php if (isset($login)){

            htmlout($login);} ?>">

      </label>

</div>

<br/>

<div>

<label for="email">Email: &nbsp &nbsp

            <input type="email" name="email"

id="email" value="<?php htmlout($email); ?>"></label>

</div>

<br/>

<div>

<label for="password">Пароль: <input type="password"

name="password" id="password"></label>

</div>

<p>

<label>Выберите аватар. Изображение должно быть формата jpg, gif или png:<br></label>

<input type="FILE" name="fupload">

</p>

<div>

<input type="hidden" name="id" value="<?php

htmlout($id); ?>">

<input type="submit" value="<?php htmlout($button); ?>">

</div>

</form>

<a href=".." class="apreturn">Вернуться</a>

</body>

</html>

Выводится форма, в которой пользователь может поменять свои аватар, пароль и email.