Недавно, мне на почту, через обратную связь, поступило сообщение он нашего постоянного читателя сайта, который упомянул о старых уроках по разработке системы управления сайтом. Так вот, я решил сегодня для Вас записать третью часть данного урока, который возможно некоторым придется по вкусу, так как имеются определенные нюансы.
Для начала, давайте же все-таки вспомним и окунемся в прошлые части, где я начинал свое повествование. И так, в первой части (разработка системы управления сайтом - Часть 1), я разработал вход, а также выход и вывод логина администратора. Во второй части (разработка системы управления сайтом - Часть 2), мы уже подробно с Вами смогли ознакомиться с выводом всех администраторов, а также с такими возможностями, как добавление, удаление и редактирование администраторов. В самом начале второй части, в описании я говорил, что в следующей части мы создадим с Вами роли, которые будут выполнять свою определенную функциональную особенность и создавать возможности для взаимодействия и управления содержимым системы управления сайтом, в сокращении CMS и предоставлять возможность администраторам, менеджерам и пользователям, иметь права доступа, чтобы можно было их использовать на сайте, а также между друг другом. Данная гибкость, позволит нам с легкостью редактировать и настраивать на сайте всевозможные параметры и давать четкое соблюдение прав доступа.
Теперь, перейдем к нюансам, которые меня поставили в тупик и после рассмотрения письма, я наверно задумался дня на два, стоит ли выпускать подобный материал или все же как-нибудь потом, начать с нуля. В чем же все-таки дело? А дело в том, что данный метод структурного программирования на PHP уже давно устарел и пользуется спросом, только в небольших правках и то не везде. Давным давно уже преобладает ООП - объектно-ориентированное программирование, которое полностью себя оправдывает и если уж начинать подобную тематику, то по всей вероятности, лучше с него. Но все же, при уважении к старому читателю, а возможно появятся и новые читатели, я решил продолжить написание подобной тематики, но перед этим, хотел бы от Вас получить комментарии, - "Стоит ли продолжать или лучше перейти на ООП PHP программирование?". Использовать в таком случае, я стану PDO, так как он более практичен и универсален. Кстати, если уже дальше стану продолжать данную тематику, то по всей вероятности, Вы увидите это на видео уроках, так как скоро у нас они появиться и намного будет проще и для Вас быстрее, понять суть и смысл каждого обучающего урока.
Переходим, непосредственно, к разработке новых двух таблиц admin_access - доступы и admin_role - роли. Для чего они нужны? Таблица admin_access - позволяет задавать доступы только менеджерам и пользователям, в плане ограничения возможности захода в систему управления сайтом. Таблица admin_role - позволяет задавать каждому свои роли, которые делятся на администратора, менеджеров и пользователей.
Как Вы уже могли заметить, что я написал администратор, а не администраторы. Да, Да! Именно администратор, потому что он будет управлять абсолютно всем и нет никакой возможности, чтобы его мог кто то удалить или заблокировать, так как, это такая роль, от которой всегда можно оттолкнуться. По поводу таблицы admin_profile, то в ней добавились еще три поля: name - имя, access - доступ, role - роль. Как Вы уже, наверно, могли понять, что данные таблицы связаны друг с другом, но об этом чуть позже. И так, давайте рассмотрим структуру, обзор и дамп каждой таблицы в частности.
-- -- Структура таблицы `admin_profile` -- CREATE TABLE IF NOT EXISTS `admin_profile` ( `id` int(5) NOT NULL AUTO_INCREMENT, `login` varchar(255) NOT NULL, `pass` varchar(255) DEFAULT NULL, `name` varchar(255) NOT NULL, `role` tinyint(1) NOT NULL, `access` tinyint(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; -- -- Дамп данных таблицы `admin_profile` -- INSERT INTO `admin_profile` (`id`, `login`, `pass`, `name`, `role`, `access`) VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Роман', 3, 1), (2, 'manager', '1d0258c2440a8d19e716292b231e3190', 'Михаил', 2, 1), (3, 'users', '9bc65c2abec141778ffaa729489f3e87', 'Александр', 1, 1);
-- -- Структура таблицы `admin_access` -- CREATE TABLE IF NOT EXISTS `admin_access` ( `id` tinyint(1) NOT NULL, `title` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Дамп данных таблицы `admin_access` -- INSERT INTO `admin_access` (`id`, `title`) VALUES (1, 'Да'), (2, 'Нет');
-- -- Структура таблицы `admin_role` -- CREATE TABLE IF NOT EXISTS `admin_role` ( `id` tinyint(1) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; -- -- Дамп данных таблицы `admin_role` -- INSERT INTO `admin_role` (`id`, `title`) VALUES (1, 'Пользователь'), (2, 'Менеджер'), (3, 'Администратор');
Хотел сразу Вас предупредить, что без глобальной директивы в файле .htaccess не обойтись, поэтому давайте пропишем register_globals включенным. Просто от этой директивы, зависит наш вход в CMS, это конечно не безопасно, но что сделаешь, старый код не позволяет по другому и без нее обойтись не получится... А также не забудем указать кодировку UTF-8.
AddDefaultCharset UTF-8 php_flag register_globals on
Я решил не описывать каждый файл отдельно, так как подробности Вы можете посмотреть в старых частях наших уроков, особенно хорошо расписана вложенность файлов во второй части, а также структура CMS в целом. Поэтому, давайте я просто вставлю код всех файлов, чтобы Вам наглядно были видны кое какие изменения и различия.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Система управления сайтом | часть 3</title> <link rel="stylesheet" type="text/css" href="style.css"/> </head> <body> <div class='center'> <br> <table class='width'> <tr> <td valign='top'> <div class="text">
</div> </td> </tr> </table> </div> </body> </html>
<? $db = mysql_connect ("localhost", "root", ""); mysql_select_db ("cms", $db); mysql_set_charset("UTF8", $db); mysql_query("SET NAMES 'UTF8'"); if (!$db) echo mysql_error(); ?>
<? @session_start(); // Запуск сессии if(session_is_registered("register")) { // Определяем, зарегистрирована ли переменная в сессии header("Location: profile.php"); break; // если да, то перенаправляем на файл profile.php } include ("bd.php"); // подключаемся к базе данных include("template/up.php"); ?> <div align="center"> <form name="form" action="profile.php" method="post"> <label>Логин</label><br> <input class="inputlp" type="text" name="login"> <br><br> <label>Пароль</label><br> <input class="inputlp" type="password" name="pass"> <br><br> <input type="submit" id="submit" class="input_button" value="Войти"> </form> </div> <? include("template/down.php"); ?>
<? @session_start(); // Запуск сессии include ("bd.php"); // Подключение к базе данных include ("functions.php"); // Подключаем функциональный файл if(isset($login) && isset($pass)) { $res = profile($login,$pass); if($res == 1) { session_register("register"); } } if(session_is_registered("register")) { include("template/up.php"); myprofille(); include("template/down.php"); } else { include("error.php"); // Вывод ошибки и переброс на index.php } ?>
<? session_start(); // Запуск сессии $old_register = $register; $res = session_unregister("register"); session_destroy(); // Уничтожение сессии и переброс на файл index.php header ("Location: index.php"); ?>
<table> <tr> <td> <a href='profile.php'>Главная</a> | <a href='users.php'>Администраторы</a> | <a href='logout.php'>Выход</a> </td> </tr> </table> <br>
<? include("template/up.php"); ?> Вы ввели не правильный логин или пароль! <a href='index.php'>Назад</a> <? include("template/down.php"); ?>
<? @session_start(); include ("bd.php"); include ("functions.php"); if(session_is_registered("register")) { include("template/up.php"); users(); include("template/down.php"); } else { include("error.php"); // Вывод ошибки и переброс на index.php } ?>
<? @session_start(); include ("bd.php"); include ("functions.php"); if(session_is_registered("register")) { del_user($id); } else { include("error.php"); // Вывод ошибки и переброс на index.php } ?>
<? @session_start(); include ("bd.php"); include ("functions.php"); if(session_is_registered("register")) { include("template/up.php"); add_user(); include("template/down.php"); } else { include("error.php"); // Вывод ошибки и переброс на index.php } ?>
<? @session_start(); include ("bd.php"); include ("functions.php"); if(session_is_registered("register")) { add_user_insert($login, $pass, $pass2, $name, $access, $role); } else { include("error.php"); // Вывод ошибки и переброс на index.php } ?>
<? @session_start(); include ("bd.php"); include ("functions.php"); if(session_is_registered("register")) { include("template/up.php"); edit_user($id, $login, $pass, $name, $access, $role); include("template/down.php"); } else { include("error.php"); // Вывод ошибки и переброс на index.php } ?>
<? @session_start(); include ("bd.php"); include ("functions.php"); if(session_is_registered("register")) { include("template/up.php"); edit_user_update($id, $login, $pass, $name, $access, $role); include("template/down.php"); } else { include("error.php"); // Вывод ошибки и переброс на index.php } ?>
Ну, а теперь, пожалуй самый главный файл, который считается движком и механизмом всей системы управления сайтом в целом.
Я не буду ничего особенного рассказывать, если у Вас возникнут вопросы, оставляйте свои комментарии и я на них отвечу или распишу подробно в следующей части, если по вашим отзывам, она будет актуальна и пользоваться спросом.
<? //Авторизация function profile($login,$pass) { // Выбираем все поля из таблицы admin_profile где login равно $login и pass равен по md5 $pass $sql=mysql_query("select * from admin_profile where login='$login' and pass=md5('$pass') and access=1"); @$res=mysql_num_rows($sql); // Заносим поля идентификатора, ролей и имени в сессию @$res1=mysql_fetch_array($sql); $_SESSION['id'] = $res1['id']; $_SESSION['role'] = $res1['role']; $_SESSION['name'] = $res1['name']; return $res; } function error_page_admin(){ $PHPSESSID = session_id(); echo"Данная страница доступна только для администраторов <meta http-equiv=Refresh content='3; URL=index.php?PHPSESSID=$PHPSESSID'>"; } //Главная страница администратора function myprofille() { // Подключение меню include("menu.php"); // Выбираем из таблицы admin_role все поля где идентификатор равен зашедщему администратору, менеджеру или пользователю $sql_role=mysql_query("select * from admin_role where id='".$_SESSION['role']."'"); $res_role=mysql_fetch_array($sql_role); // Вывод имени echo"<div class='profile'><span class='span_1'>Ваше имя: </span><span>".$_SESSION['name']." (".$res_role['title'].")</span></div>"; } // Добавление доступа function add_access() { echo"<select class='select' name='access'>"; $adm_access = mysql_query("select * from admin_access order by id asc"); @$access = mysql_fetch_array($adm_access); do { echo"<option value='$access[id]'>$access[title]</option>"; } while (@$access=mysql_fetch_array($adm_access)); echo"</select>"; } // Добавление роли function add_role() { echo"<select class='select' name='role'>"; $adm_role = mysql_query("select * from admin_role where id!=3 order by id desc"); @$role = mysql_fetch_array($adm_role); do { echo"<option value='$role[id]'>$role[title]</option>"; } while (@$role=mysql_fetch_array($adm_role)); echo"</select>"; } // Редактирование доступа function edit_access($res2) { $adm_access = mysql_query("select id, title from admin_access"); @$access = mysql_fetch_array($adm_access); echo"<select class='select' name='access'>"; do if ($res2['access'] == $access['id']) { echo"<option value='$access[id]' selected>$access[title]</option>"; } else { echo"<option value='$access[id]'>$access[title]</option>"; } while (@$access = mysql_fetch_array($adm_access)); echo"</select>"; } // Редактирование роли function edit_role($res2) { $adm_role = mysql_query("select id, title from admin_role where id!=3"); @$role = mysql_fetch_array($adm_role); echo"<select class='select' name='role'>"; do if ($res2['role'] == $role['id']) { echo"<option value='$role[id]' selected>$role[title]</option>"; } else { echo"<option value='$role[id]'>$role[title]</option>"; } while (@$role = mysql_fetch_array($adm_role)); echo"</select>"; } //Вывод администраторов, менеджеров и пользователей function users() { // Подключение меню include("menu.php"); ?> <div class='profile'> <? // Закрытие доступа для кнопки добавить, кроме администратора if($_SESSION['role']==3){ ?> <a href='add_user.php'>Добавить нового менеджера/пользователя</a> <? } ?> <br><br> <table cellspacing='0' cellpadding='0' class='table'> <thead> <tr> <th class='td'>ID</th> <th class='td'>Логин</th> <th class='td'>Имя</th> <th class='td'>Роль</th> <th class='td'>Доступ</th> <th class='td'>Удаление</th> <th class='td'>Редактирование</th> </tr> </thead> <? { // Выбираем все поля из таблицы с администраторами, где id равен авторизованному администратору, менеджеру или пользователю // и выводятся по вышему приоритету роли $sql = mysql_query("select admin_profile.id, admin_profile.login, admin_profile.name, (select admin_role.title from admin_role where admin_role.id=admin_profile.role) as role, (select admin_access.title from admin_access where admin_access.id=admin_profile.access) as access from admin_profile order by role asc"); @$res = mysql_fetch_array($sql); do { echo" <tbody> <tr> <td class='td2'>".$res['id']."</td> <td class='td2'>".$res['login']."</td> <td class='td2'>".$res['name']."</td> <td class='td2'>".$res['role']."</td> <td class='td2'>".$res['access']."</td> <td class='td2'>"; // Создаем условие, при котором удалять может только администратор if($_SESSION['id']!=$res['id'] and $_SESSION['role']==3){ echo"<a href='del_user.php?id=$res[id]'>Удалить</a>"; }else{echo"Запрещено!";} echo"</td><td class='td2'>"; // Создаем условие, при котором редактировать все может только администратор, // а менеджер и пользователь, только свои данные. if($_SESSION['id']==$res['id'] or $_SESSION['role']==3){ echo"<a href='edit_user.php?id=$res[id]'>Редактировать</a>"; }else{echo"Запрещено!";} echo"</td> </tr> </tbody>"; } while (@$res = mysql_fetch_array($sql)); } echo"<table></div>"; } //Добавление - файл с формой function add_user() { // Подключение меню include("menu.php"); // Закрытие доступа для кнопки добавить, кроме администратора if($_SESSION['role']==3){ ?> <!--Простая форма для добавления нового администратора с полями логин, пароль и проверка пароля и других. Все данные передаются в файл add_user_insert.php, который будет осуществлять вставку каждого поля.--> <form name="form" method="post" action="add_user_insert.php"> <table><tr><td> <strong>Логин</strong><br> <input class='inputlp' type="text" name="login"> <br><br> <strong>Пароль</strong><br> <input class='inputlp' type="password" name="pass"> <br><br> <strong>Повторите пароль</strong><br> <input class='inputlp' type="password" name="pass2"> <br><br> <strong>Имя</strong><br> <input class='inputlp' type="text" name="name"> <br><br> <strong>Доступ</strong><br> <? add_access(); // Подключаем добавление доступов?> <br><br> <strong>Роль</strong><br> <? add_role(); // Подключаем добавление роли?> <br><br> <input class='input_button' type="submit" id="submit" value="Сохранить"> / <a href='users.php'>Назад</a> </td></tr></table> </form> <? } else { // Вывод ошибки и переброс на index.php error_page_admin(); } } //Добавление - файл обработчик function add_user_insert($login, $pass, $pass2, $name, $access, $role) { // Подключаем шапку, нужны были стили include("template/up.php"); $PHPSESSID = session_id(); // Проверка на глобальные переменные if (isset($_POST['login'])) {$login= $_POST['login'];} if (isset($_POST['pass'])) {$pass= $_POST['pass'];} if (isset($_POST['pass'])) {$pass2= $_POST['pass'];} if (isset($_POST['name'])) {$name= $_POST['name'];} if (isset($_POST['access'])) {$access= $_POST['access'];} if (isset($_POST['role'])) {$role= $_POST['role'];} // Делаем проверку и обрезку полей if (!empty($login) && !empty($pass) && !empty($name) && !empty($access) && !empty($role)) { // Если пароль и повторный пароль совпали, значит переходим к выборке всех полей и заносим их в таблицу с администраторами if ($pass == $pass2) { // Выбираем поле логин из таблицы с администраторами $sql2 = mysql_query("select login from admin_profile"); // Создаем цикл for($i=0; $row2=mysql_fetch_array($sql2); $i++) { // Переводим буквы в нижний регистр $login2 = $row2["login"]; $a = strtolower($login2); $b = strtolower($login); // Создаем сравнение переменных логина if ($a == $b) $pr = 1; } if (!isset($pr)) { // Шифруем пароли по md5 $pass = md5($pass); // Если все правильно заносим, нового администратора в таблицу, если нет выводим ошибочные сообщения $sql=mysql_query("insert into admin_profile (login,pass,name,access,role) values ('$login','$pass','$name','$access','$role')"); echo"<meta http-equiv=Refresh content='0; URL=users.php?PHPSESSID=$PHPSESSID'>"; // Делаем перезагрузку страницы, на станицу всех администраторов } else echo"<p class='error'>Пользователь с данным логином уже существует!</p><br>"; } else echo"<p class='error'>Пароли не совпадают!</p><br>"; } else echo"<p class='error'>Необходимо заполнить все поля!</p><br>"; // Подключаем форму добавления add_user(); } //Редактирование - файл с формой function edit_user($id, $login, $pass, $name, $access, $role) { // Подключение меню include("menu.php"); // Получаем по GET идентификатор администратора, пользователя или менеджера if (isset ($_GET['id'])) {$id=$_GET['id']; } if (!isset($id)) {$id==1;} // Выбираем все поля из таблицы администраторов где id = $id $sql2 = mysql_query("select * from admin_profile where id='$id'"); $res2 = mysql_fetch_array($sql2); ?> <!--Создаем форму со всеми полями. Не забываем про скрытый id и его передачу файлу edit_user_update.php--> <form name='form' action='edit_user_update.php' method='post'> <table class='border_form'><tr><td> <?=$res2["login"]?> <br><br> <? // Создаем условие, при котором, каждый авторизованный администратор, менеджер и пользователь может редактировать // только свои поля, а именно - логин, пароль и имя. if($_SESSION['id'] == $res2['id']){ ?> <strong>Логин</strong><br> <input class='inputlp' type='text' name='login' value='<?=$res2["login"]?>'> <br><br> <strong>Пароль</strong><br> <input class='inputlp' type='password' name='pass'> <br><br> <strong>Имя</strong><br> <input class='inputlp' type="text" name="name" value='<?=$res2["name"]?>'> <br><br> <? } // Создаем условие, при котором, администратор имеет право менять доступы и роли у менеджеров и пользователей, кроме себя. if($_SESSION['role']==3 and $_SESSION['id'] !=$res2['id']){ ?> <strong>Доступ</strong><br> <? edit_access($res2); // Подключаем редактирование доступа ?> <br><br> <strong>Роль</strong><br> <? edit_role($res2); // Подключаем редактирование роли }?> <br><br> <input name='id' type='hidden' value='<?=$res2["id"]?>'> <input class='input_button' type='submit' id='submit' value='Сохранить'> / <a href='users.php'>Назад</a> </td></tr></table> </form> <? } //Редактирование - файл обработчик function edit_user_update($id, $login, $pass, $name, $access, $role) { // Проверка на глобальные переменные if (isset($_POST['login'])) {$login= $_POST['login'];} if (isset($_POST['pass'])) {$pass= $_POST['pass'];} if (isset($_POST['name'])) {$name= $_POST['name'];} if (isset($_POST['access'])) {$access= $_POST['access'];} if (isset($_POST['role'])) {$role= $_POST['role'];} if (isset($_POST['id'])) {$id = $_POST['id'];} // Делаем проверку и обрезку полей if (!empty($login) && !empty($pass) && !empty($name)) { // Заносим сессию страницы в переменную $PHPSESSID = session_id(); // Шифровка поля в md5 $pass=md5($pass); // Заносим поля логина, пароля и имени в таблицу с администраторами, где идентификатор равен идентификатору $sql = mysql_query("update admin_profile set login='$login', pass='$pass', name='$name' WHERE id='$id'"); // Делаем перезагрузку страницы, на станицу всех администраторов echo"<meta http-equiv=Refresh content='0; URL=users.php?PHPSESSID=$PHPSESSID'>"; } // Делаем проверку и обрезку полей elseif(!empty($access) && !empty($role)) { // Заносим сессию страницы в переменную $PHPSESSID = session_id(); // Заносим поля доступа и роли в таблицу с администраторами, где идентификатор равен идентификатору $sql = mysql_query("update admin_profile set access='$access', role='$role' WHERE id='$id'"); // Делаем перезагрузку страницы, на станицу всех администраторов echo"<meta http-equiv=Refresh content='0; URL=users.php?PHPSESSID=$PHPSESSID'>"; } else echo"<p class='error'>Необходимо заполнить все поля!</p><br>"; edit_user($id, $login, $pass, $name, $access, $role); } //Удаление - файл обработчик function del_user($id) { // Создаем условие, при котором администратор может удалять все менеджеров и пользователей, кроме себя. if($_SESSION['role']==3){ $PHPSESSID = session_id(); // Получаем по GET идентификатор пользователя или менеджера if (isset ($_GET['id'])) {$id=$_GET['id']; } if (!isset($id)) {$id==1;} // Удаляем менеджера или пользователя с выбранным идентификатором $sql = mysql_query("delete from admin_profile where id='$id'"); // Делаем перезагрузку страницы, на станицу всех администраторов echo"<meta http-equiv=Refresh content='0; URL=users.php?PHPSESSID=$PHPSESSID'>"; } else { // Вывод ошибки и переброс на index.php error_page_admin(); } } ?>
Ну и к оформлению, добавим немного стилей, которые придадут какое то хоть оформление.
*, html, body { margin:0 auto; padding:0; } .width { width: 700px; margin:0 auto; } .center { margin:0 auto; text-align: center; } .onetable { background: #6eaaff; height: 100px; width: 100%; } .text { padding: 10px; width: 400px; } .input_button { border: none; background: none; color: blue; font-weight: bold; } a { font-weight: bold; text-decoration: none; color: blue; } a:hover { color: red; } .error { padding-left:20px; font-size:15; color:red; } .profile { padding-top: 10px; } .span_1 { font-weight: bold; } .table { border-top: 1px solid blue; border-right: 1px solid blue; border-bottom: 1px solid blue; } .td { border-left: 1px solid blue; padding: 10px; background: #1cdcff; } .td2 { border-left: 1px solid blue; padding: 10px; } .inputlp, .select { border: 1px solid black; }
В общем, вот такой вот урок получился у нас с вами по разработке системы управления сайтом. Старался специально для Вас, надеюсь понравилось! Пишите свои мысли и комментарии, обсудим все детально!