HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#Руководства</a></p>
1 <p><a>#Руководства</a></p>
2 <ul><li>7 мар 2019</li>
2 <ul><li>7 мар 2019</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Узнайте, для чего нужна панель управления сайтом, какие в ней есть функции и как её разработать самостоятельно.</p>
4 </ul><p>Узнайте, для чего нужна панель управления сайтом, какие в ней есть функции и как её разработать самостоятельно.</p>
5 <p> vlada_maestro / shutterstock</p>
5 <p> vlada_maestro / shutterstock</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
7 <p>Инструменты для управления сайтом:</p>
7 <p>Инструменты для управления сайтом:</p>
8 <ul><li>phpmyadmin для работы с базой данных;</li>
8 <ul><li>phpmyadmin для работы с базой данных;</li>
9 <li>FTP-клиент, чтобы загружать или удалять файлы;</li>
9 <li>FTP-клиент, чтобы загружать или удалять файлы;</li>
10 <li>графический редактор, который сжимает изображения;</li>
10 <li>графический редактор, который сжимает изображения;</li>
11 <li>текстовый редактор, в котором оформляются статьи;</li>
11 <li>текстовый редактор, в котором оформляются статьи;</li>
12 <li>сервис аналитики для оценки эффективности контента и рекламы.</li>
12 <li>сервис аналитики для оценки эффективности контента и рекламы.</li>
13 </ul><p>Лучше всего собрать их в одном месте, которое и называется панелью управления сайтом.</p>
13 </ul><p>Лучше всего собрать их в одном месте, которое и называется панелью управления сайтом.</p>
14 <p>В первую очередь создадим файл admin.php в корне сайта. Пока у него будет такой вид:</p>
14 <p>В первую очередь создадим файл admin.php в корне сайта. Пока у него будет такой вид:</p>
15 &lt;? include("includes/db.php"); $echo = "Тут скоро что-то будет"; ?&gt; &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Админка&lt;/title&gt; &lt;link rel="stylesheet" href="admin.css"&gt; &lt;/head&gt; &lt;body&gt; &lt;div class='wrapper'&gt; &lt;main class='main' id='main'&gt; &lt;?echo $echo;?&gt; &lt;/main&gt; &lt;/div&gt; &lt;/body&gt; &lt;/html&gt;<p>Этот код получает данные методами<em>GET</em>и <em>POST</em>, обрабатывает их, а потом выводит что-либо через переменную<em>$echo</em>. Чтобы поисковики не пытались зайти в админку, запретите её индексировать в файле<em>robots.txt</em>:</p>
15 &lt;? include("includes/db.php"); $echo = "Тут скоро что-то будет"; ?&gt; &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Админка&lt;/title&gt; &lt;link rel="stylesheet" href="admin.css"&gt; &lt;/head&gt; &lt;body&gt; &lt;div class='wrapper'&gt; &lt;main class='main' id='main'&gt; &lt;?echo $echo;?&gt; &lt;/main&gt; &lt;/div&gt; &lt;/body&gt; &lt;/html&gt;<p>Этот код получает данные методами<em>GET</em>и <em>POST</em>, обрабатывает их, а потом выводит что-либо через переменную<em>$echo</em>. Чтобы поисковики не пытались зайти в админку, запретите её индексировать в файле<em>robots.txt</em>:</p>
16 Robot.txt User-agent: * Disallow: /admin.php<ul><li>Авторизация.</li>
16 Robot.txt User-agent: * Disallow: /admin.php<ul><li>Авторизация.</li>
17 <li>Главная страница.</li>
17 <li>Главная страница.</li>
18 <li>Инструменты редактирования.</li>
18 <li>Инструменты редактирования.</li>
19 <li>Работа с базой данных.</li>
19 <li>Работа с базой данных.</li>
20 <li>Окно статистики.</li>
20 <li>Окно статистики.</li>
21 </ul><p>Дополнительные возможности управления сайтом относятся к разным направлениям PHP, которые невозможно охватить в одной статье.</p>
21 </ul><p>Дополнительные возможности управления сайтом относятся к разным направлениям PHP, которые невозможно охватить в одной статье.</p>
22 <p>Теперь приступаем к написанию функций, запросов и валидаций.</p>
22 <p>Теперь приступаем к написанию функций, запросов и валидаций.</p>
23 <p>Чтобы ограничить доступ, создадим форму входа в панель управления:</p>
23 <p>Чтобы ограничить доступ, создадим форму входа в панель управления:</p>
24 $echo = "&lt;div class='table'&gt; &lt;div class='tale-wrapper'&gt; &lt;div class='table-title'&gt;Войти в панель администратора&lt;/div&gt; &lt;div class='table-content'&gt; &lt;form method='post' id='login-form' class='login-form'&gt; &lt;input type='text' placeholder='Логин' class='input' name='login' required&gt;&lt;br&gt; &lt;input type='password' placeholder='Пароль' class='input' name='password' required&gt;&lt;br&gt; &lt;input type='submit' value='Войти' class='button'&gt; &lt;/form&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;";<p>В переменную<em>$echo</em>прописываем<a>HTML</a>-код формы, которая передает данные на эту же страницу. Затем они обрабатываются:</p>
24 $echo = "&lt;div class='table'&gt; &lt;div class='tale-wrapper'&gt; &lt;div class='table-title'&gt;Войти в панель администратора&lt;/div&gt; &lt;div class='table-content'&gt; &lt;form method='post' id='login-form' class='login-form'&gt; &lt;input type='text' placeholder='Логин' class='input' name='login' required&gt;&lt;br&gt; &lt;input type='password' placeholder='Пароль' class='input' name='password' required&gt;&lt;br&gt; &lt;input type='submit' value='Войти' class='button'&gt; &lt;/form&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;";<p>В переменную<em>$echo</em>прописываем<a>HTML</a>-код формы, которая передает данные на эту же страницу. Затем они обрабатываются:</p>
25 function login($db,$login,$password) { //Обязательно нужно провести валидацию логина и пароля, чтобы исключить вероятность инъекции //Запрос в базу данных $loginResult = mysqli_query($db,"SELECT * FROM userlist WHERE login='$login' AND password='$password' AND admin='1'"); if(mysqli_num_rows($loginResult) == 1) { //Если есть совпадение, возвращается true return true; } else {//Если такого пользователя не существует, данные стираются, а возвращается false unset($_SESSION['login'],$_SESSION['password']); return false; } } if(isset($_POST['login']) &amp;&amp; isset($_POST['password'])) { $_SESSION['login'] = $_POST['login']; $_SESSION['password'] = $_POST['password']; } if(isset($_SESSION['login']) &amp;&amp; isset($_SESSION['password'])) { if(login($db,$_SESSION['login'],$_SESSION['password'])) {//Попытка авторизации //Тут будут проходить все операции $echo = null; //Обнуление переменной, чтобы удалить из вывода форму авторизации } }<p>После отправки формы данные переносятся в супермассив<em>$_SESSION</em>. Затем вызывается функция<em>login ()</em>. Она делает запрос в базу данных. Если он проходит удачно, возвращается значение<em><strong>true</strong></em>, если нет - данные из <em>$_SESSION</em>удаляются и возвращается<em><strong>false</strong></em>.</p>
25 function login($db,$login,$password) { //Обязательно нужно провести валидацию логина и пароля, чтобы исключить вероятность инъекции //Запрос в базу данных $loginResult = mysqli_query($db,"SELECT * FROM userlist WHERE login='$login' AND password='$password' AND admin='1'"); if(mysqli_num_rows($loginResult) == 1) { //Если есть совпадение, возвращается true return true; } else {//Если такого пользователя не существует, данные стираются, а возвращается false unset($_SESSION['login'],$_SESSION['password']); return false; } } if(isset($_POST['login']) &amp;&amp; isset($_POST['password'])) { $_SESSION['login'] = $_POST['login']; $_SESSION['password'] = $_POST['password']; } if(isset($_SESSION['login']) &amp;&amp; isset($_SESSION['password'])) { if(login($db,$_SESSION['login'],$_SESSION['password'])) {//Попытка авторизации //Тут будут проходить все операции $echo = null; //Обнуление переменной, чтобы удалить из вывода форму авторизации } }<p>После отправки формы данные переносятся в супермассив<em>$_SESSION</em>. Затем вызывается функция<em>login ()</em>. Она делает запрос в базу данных. Если он проходит удачно, возвращается значение<em><strong>true</strong></em>, если нет - данные из <em>$_SESSION</em>удаляются и возвращается<em><strong>false</strong></em>.</p>
26 <p>Соответствия в запросе ищутся только среди администраторов, но можно давать ограниченный доступ и для других групп пользователей - например, для модераторов, чтобы они проверяли комментарии и статьи, но не имели доступа к глобальным настройкам и удалению записей.</p>
26 <p>Соответствия в запросе ищутся только среди администраторов, но можно давать ограниченный доступ и для других групп пользователей - например, для модераторов, чтобы они проверяли комментарии и статьи, но не имели доступа к глобальным настройкам и удалению записей.</p>
27 <p>Теперь создадим условия, чтобы пользователь делал что-то полезное. Для этого методом<em>GET</em>передаётся название страницы:</p>
27 <p>Теперь создадим условия, чтобы пользователь делал что-то полезное. Для этого методом<em>GET</em>передаётся название страницы:</p>
28 if(isset($_GET['act'])) {$act = $_GET['act'];} else {$act = 'home';} switch($act) { case 'home': $article_result = mysqli_query($db,"SELECT * FROM articles"); if(mysqli_num_rows($article_result) &gt;= 1) { while($article_array = mysqli_fetch_array($article_result)) { $articles .= "&lt;div class='table-content__list-item'&gt;&lt;a href='? act=edit_article&amp;id=$article_array[id]'&gt;$article_array[id] | $article_array[title]&lt;/a&gt;&lt;/div&gt;"; } } else { $articles = "Статей пока нет"; } $users_result = mysqli_query($db,"SELECT * FROM userlist"); if(mysqli_num_rows($users_result) &gt;= 1) { while($users_array = mysqli_fetch_array($users_result)) { $users .= "&lt;div class='table-content__list-item'&gt;&lt;a href='? act=edit_user&amp;id=$users_array[id]'&gt;$users_array[id] | $users_array[login]&lt;/a&gt;&lt;/div&gt;"; } } else { $users = "Статей пока нет"; } $echo = "&lt;div class='tables'&gt; &lt;div class='table'&gt; &lt;div class='table-wrapper'&gt; &lt;div class='table-title'&gt;Страницы&lt;/div&gt; &lt;div class='table-content'&gt; $articles &lt;a href='?act=add_article' class='table__add-button' id='add_article'&gt;+&lt;/a&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class='table'&gt; &lt;div class='table-wrapper'&gt; &lt;div class='table-title'&gt;Пользователи&lt;/div&gt; &lt;div class='table-content'&gt; $users &lt;a href='?act=add_user' class='table__add-button' id='add_user'&gt;+&lt;/a&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;"; break; }<p>В переменную<em>$act</em>попадает значение из<em>$_GET['act'],</em>а если его не существует, то просто<em>home</em>. Дальше с помощью функции<em>switch ()</em>прописываются действия для каждой страницы.</p>
28 if(isset($_GET['act'])) {$act = $_GET['act'];} else {$act = 'home';} switch($act) { case 'home': $article_result = mysqli_query($db,"SELECT * FROM articles"); if(mysqli_num_rows($article_result) &gt;= 1) { while($article_array = mysqli_fetch_array($article_result)) { $articles .= "&lt;div class='table-content__list-item'&gt;&lt;a href='? act=edit_article&amp;id=$article_array[id]'&gt;$article_array[id] | $article_array[title]&lt;/a&gt;&lt;/div&gt;"; } } else { $articles = "Статей пока нет"; } $users_result = mysqli_query($db,"SELECT * FROM userlist"); if(mysqli_num_rows($users_result) &gt;= 1) { while($users_array = mysqli_fetch_array($users_result)) { $users .= "&lt;div class='table-content__list-item'&gt;&lt;a href='? act=edit_user&amp;id=$users_array[id]'&gt;$users_array[id] | $users_array[login]&lt;/a&gt;&lt;/div&gt;"; } } else { $users = "Статей пока нет"; } $echo = "&lt;div class='tables'&gt; &lt;div class='table'&gt; &lt;div class='table-wrapper'&gt; &lt;div class='table-title'&gt;Страницы&lt;/div&gt; &lt;div class='table-content'&gt; $articles &lt;a href='?act=add_article' class='table__add-button' id='add_article'&gt;+&lt;/a&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class='table'&gt; &lt;div class='table-wrapper'&gt; &lt;div class='table-title'&gt;Пользователи&lt;/div&gt; &lt;div class='table-content'&gt; $users &lt;a href='?act=add_user' class='table__add-button' id='add_user'&gt;+&lt;/a&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;"; break; }<p>В переменную<em>$act</em>попадает значение из<em>$_GET['act'],</em>а если его не существует, то просто<em>home</em>. Дальше с помощью функции<em>switch ()</em>прописываются действия для каждой страницы.</p>
29 <p>На главной странице админки размещают все компоненты сайта с возможностью управления:</p>
29 <p>На главной странице админки размещают все компоненты сайта с возможностью управления:</p>
30 <ul><li>пользователями;</li>
30 <ul><li>пользователями;</li>
31 <li>статьями и комментариями;</li>
31 <li>статьями и комментариями;</li>
32 <li>карточками товаров;</li>
32 <li>карточками товаров;</li>
33 <li>файлами и изображениями;</li>
33 <li>файлами и изображениями;</li>
34 <li>статистикой и рекламными блоками.</li>
34 <li>статистикой и рекламными блоками.</li>
35 </ul><p>Должна быть возможность редактировать и общие настройки сайта: поменять метатеги, изменить параметры капчи, обновить политику конфиденциальности и так далее.</p>
35 </ul><p>Должна быть возможность редактировать и общие настройки сайта: поменять метатеги, изменить параметры капчи, обновить политику конфиденциальности и так далее.</p>
36 <p>Как вы могли заметить, в таблицах каждая строчка - это ссылка такого вида:</p>
36 <p>Как вы могли заметить, в таблицах каждая строчка - это ссылка такого вида:</p>
37 &lt;a href='?act=edit_article&amp;id=$article_array[id]'&gt;$article_array[id] | $article_array[title]&lt;/a&gt;<p>В переменной<em>act</em>передаётся значение<em>edit_article</em>, а в <em>id</em> - идентификатор статьи. Перейдя по ссылке, администратор попадает на страницу редактирования:</p>
37 &lt;a href='?act=edit_article&amp;id=$article_array[id]'&gt;$article_array[id] | $article_array[title]&lt;/a&gt;<p>В переменной<em>act</em>передаётся значение<em>edit_article</em>, а в <em>id</em> - идентификатор статьи. Перейдя по ссылке, администратор попадает на страницу редактирования:</p>
38 case 'edit_article': if(isset($_GET['id'])) { $id = $_GET['id']; $result = mysqli_query($db,"SELECT * FROM articles WHERE id='$id'"); if(mysqli_num_rows($result) == 1) { if(isset($_POST['title']) &amp;&amp; isset($_POST['description']) &amp;&amp; isset($_POST['text'])) { //Тут должна быть валидация //Обновление таблицы $update = mysqli_query($db,"UPDATE articles SET title='$_POST[title]', description='$_POST[description]', text='$_POST[text]' WHERE id='$id'"); if($update) { //Если обновление прошло успешно, получаются новые данные $result = mysqli_query($db,"SELECT * FROM articles WHERE id='$id'"); $message = "Успешно обновлено!"; } } $article = mysqli_fetch_array($result);//Получение информации в массив //Форма редактирования $echo = "&lt;div class='table'&gt; &lt;div class='table-wrapper'&gt; &lt;div class='table-title'&gt;Редактирование статьи&lt;/div&gt; &lt;div class='table-content'&gt; &lt;a href='?act=home'&gt;&lt;- Вернуться&lt;/a&gt;&lt;br&gt; $message &lt;form method='post' class='article-form'&gt; &lt;b&gt;Название:&lt;/b&gt; &lt;input type='text' name='title' value='$article[title]'&gt;&lt;br&gt; &lt;b&gt;Описание:&lt;/b&gt; &lt;textarea name='description'&gt;$article[description]&lt;/textarea&gt;&lt;br&gt; &lt;b&gt;Текст:&lt;/b&gt; &lt;textarea name='text'&gt;$article[text]&lt;/textarea&gt;&lt;/br&gt; &lt;input type='submit' class='button' value='Сохранить'&gt; &lt;/form&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;"; } } break;<p>Сначала в базу данных отправляется запрос на получение статьи. Затем, если всё в порядке, выводится форма редактирования. Если перед этим пользователь отправил изменённый текст, то он отправляется на сервер, таблица обновляется, а потом с помощью ещё одного запроса выводится актуальная информация.</p>
38 case 'edit_article': if(isset($_GET['id'])) { $id = $_GET['id']; $result = mysqli_query($db,"SELECT * FROM articles WHERE id='$id'"); if(mysqli_num_rows($result) == 1) { if(isset($_POST['title']) &amp;&amp; isset($_POST['description']) &amp;&amp; isset($_POST['text'])) { //Тут должна быть валидация //Обновление таблицы $update = mysqli_query($db,"UPDATE articles SET title='$_POST[title]', description='$_POST[description]', text='$_POST[text]' WHERE id='$id'"); if($update) { //Если обновление прошло успешно, получаются новые данные $result = mysqli_query($db,"SELECT * FROM articles WHERE id='$id'"); $message = "Успешно обновлено!"; } } $article = mysqli_fetch_array($result);//Получение информации в массив //Форма редактирования $echo = "&lt;div class='table'&gt; &lt;div class='table-wrapper'&gt; &lt;div class='table-title'&gt;Редактирование статьи&lt;/div&gt; &lt;div class='table-content'&gt; &lt;a href='?act=home'&gt;&lt;- Вернуться&lt;/a&gt;&lt;br&gt; $message &lt;form method='post' class='article-form'&gt; &lt;b&gt;Название:&lt;/b&gt; &lt;input type='text' name='title' value='$article[title]'&gt;&lt;br&gt; &lt;b&gt;Описание:&lt;/b&gt; &lt;textarea name='description'&gt;$article[description]&lt;/textarea&gt;&lt;br&gt; &lt;b&gt;Текст:&lt;/b&gt; &lt;textarea name='text'&gt;$article[text]&lt;/textarea&gt;&lt;/br&gt; &lt;input type='submit' class='button' value='Сохранить'&gt; &lt;/form&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;"; } } break;<p>Сначала в базу данных отправляется запрос на получение статьи. Затем, если всё в порядке, выводится форма редактирования. Если перед этим пользователь отправил изменённый текст, то он отправляется на сервер, таблица обновляется, а потом с помощью ещё одного запроса выводится актуальная информация.</p>
39 <p>Чтобы создать функцию добавления пользователя (или любого другого элемента на сайте), парсим форму и её обработчик:</p>
39 <p>Чтобы создать функцию добавления пользователя (или любого другого элемента на сайте), парсим форму и её обработчик:</p>
40 case 'add_user': if(isset($_POST['reglogin']) &amp;&amp; isset($_POST['regpassword'])) { $check = mysqli_query($db,"SELECT * FROM userlist WHERE login='$_POST[reglogin]'"); if(mysqli_num_rows($check) == 0) { $insert = mysqli_query($db,"INSERT INTO userlist (login,password,admin) VALUE ('$_POST[reglogin]','$_POST[regpassword]','$_POST[regadmin]')"); if($insert) { $message = "Пользователь успешно добавлен!"; } else { $message = "Ошибка! ".mysqli_error($db); } } else { $message = "Пользователь с таким логином уже существует!"; } } $echo = "&lt;div class='table'&gt; &lt;div class='table-wrapper'&gt; &lt;div class='table-title'&gt;Новый пользователь&lt;/div&gt; &lt;div class='table-content'&gt; &lt;a href='?act=home'&gt;&lt;- Вернуться&lt;/a&gt;&lt;br&gt; $message &lt;form method='post' class='user-form'&gt; &lt;b&gt;Логин:&lt;/b&gt; &lt;input type='text' name='reglogin' required&gt;&lt;br&gt; &lt;b&gt;Пароль:&lt;/b&gt; &lt;input type='text' name='regpassword' required&gt;&lt;br&gt; &lt;b&gt;Админ:&lt;/b&gt; &lt;input type='checkbox' name='regadmin'&gt;&lt;/br&gt; &lt;input type='submit' class='button' value='Добавить'&gt; &lt;/form&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;"; break;<p>Сначала проверяем, свободен ли указанный логин. Если да, то в базу вносятся соответствующие данные. Также обратите внимание, что существование переменной<em>regadmin</em>не проверяется, потому что форма её не отправляет, если оставить чекбокс пустым.</p>
40 case 'add_user': if(isset($_POST['reglogin']) &amp;&amp; isset($_POST['regpassword'])) { $check = mysqli_query($db,"SELECT * FROM userlist WHERE login='$_POST[reglogin]'"); if(mysqli_num_rows($check) == 0) { $insert = mysqli_query($db,"INSERT INTO userlist (login,password,admin) VALUE ('$_POST[reglogin]','$_POST[regpassword]','$_POST[regadmin]')"); if($insert) { $message = "Пользователь успешно добавлен!"; } else { $message = "Ошибка! ".mysqli_error($db); } } else { $message = "Пользователь с таким логином уже существует!"; } } $echo = "&lt;div class='table'&gt; &lt;div class='table-wrapper'&gt; &lt;div class='table-title'&gt;Новый пользователь&lt;/div&gt; &lt;div class='table-content'&gt; &lt;a href='?act=home'&gt;&lt;- Вернуться&lt;/a&gt;&lt;br&gt; $message &lt;form method='post' class='user-form'&gt; &lt;b&gt;Логин:&lt;/b&gt; &lt;input type='text' name='reglogin' required&gt;&lt;br&gt; &lt;b&gt;Пароль:&lt;/b&gt; &lt;input type='text' name='regpassword' required&gt;&lt;br&gt; &lt;b&gt;Админ:&lt;/b&gt; &lt;input type='checkbox' name='regadmin'&gt;&lt;/br&gt; &lt;input type='submit' class='button' value='Добавить'&gt; &lt;/form&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;"; break;<p>Сначала проверяем, свободен ли указанный логин. Если да, то в базу вносятся соответствующие данные. Также обратите внимание, что существование переменной<em>regadmin</em>не проверяется, потому что форма её не отправляет, если оставить чекбокс пустым.</p>
41 <p>Чтобы смотреть статистику посещений, комментирования и другой активности, создаём в базе данных таблицу с полями:</p>
41 <p>Чтобы смотреть статистику посещений, комментирования и другой активности, создаём в базе данных таблицу с полями:</p>
42 <ul><li>ID;</li>
42 <ul><li>ID;</li>
43 <li>Date;</li>
43 <li>Date;</li>
44 <li>Views;</li>
44 <li>Views;</li>
45 <li>Comments.</li>
45 <li>Comments.</li>
46 </ul><p>В них записывается общее количество просмотров и комментариев за каждый день, которое выводится на графике. Чтобы это сделать, пропишем HTML-код таблицы:</p>
46 </ul><p>В них записывается общее количество просмотров и комментариев за каждый день, которое выводится на графике. Чтобы это сделать, пропишем HTML-код таблицы:</p>
47 &lt;div class='table'&gt; &lt;div class='table-wrapper'&gt; &lt;div class='table-title'&gt;Статистика&lt;/div&gt; &lt;div class='table-content'&gt; &lt;img src='stats.php' class='statistics-img'&gt; &lt;br&gt; Красный: просмотры &lt;br&gt; Синий: комментарии &lt;br&gt; 1 шаг - 1 день &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;<p>В качестве источника картинки указывается PHP-файл с кодом:</p>
47 &lt;div class='table'&gt; &lt;div class='table-wrapper'&gt; &lt;div class='table-title'&gt;Статистика&lt;/div&gt; &lt;div class='table-content'&gt; &lt;img src='stats.php' class='statistics-img'&gt; &lt;br&gt; Красный: просмотры &lt;br&gt; Синий: комментарии &lt;br&gt; 1 шаг - 1 день &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;<p>В качестве источника картинки указывается PHP-файл с кодом:</p>
48 &lt;?include("includes/db.php"); $width = 400; $height = 200; $canv = imagecreatetruecolor($width, $height); //Цвета $white = imagecolorallocate($canv, 255, 255, 255); $gray = imagecolorallocate($canv, 150, 150, 150); $black = imagecolorallocate($canv, 0, 0, 0); $red = imagecolorallocate($canv, 255, 0, 0); $blue = imagecolorallocate($canv, 0, 0, 255); imagefill($canv,0,0,$white); //Рисуется квадрат imagerectangle($canv, 15, 5, $width-5, $height-15, $gray); //Горизонтальные линии for($i = 1; $i &lt;= 5; $i++) { imageline($canv, 15, $height-$i*35, $width-5, $height-$i*35, $gray); } //Вертикальные линии for($i = 1; $i &lt;= 15; $i++) { imageline($canv, 15+($i*30), 5, 15+($i*30), $height-15, $gray); } //Получение статистики из базы данных $stats_result = mysqli_query($db,"SELECT * FROM statistics"); if($stats_result) { $last_y = [0,0]; $x = 15; //Рисуется график while($stats = mysqli_fetch_array($stats_result)) { imageline($canv, $x, ($height-15)-$last_y[0], $x+30, ($height-15)-($stats['views']/10), $red); imageline($canv, $x, ($height-15)-$last_y[1], $x+30, ($height-15)-($stats['comments']/10), $blue); $last_y[0] = $stats['views']/10; $last_y[1] = $stats['comments']/10; $x += 30; } } else {echo mysqli_error($db);} //Вывод изображения header("Content-type: image/png"); imagepng($canv); //Освобождение памяти imagedestroy($canv); ?&gt;<p>Сначала создаются изображение, рамка и деления. Затем идёт запрос в базу данных, чтобы получить статистику, которая отрисовывается в виде графика. Изображение сохраняется для разового вывода, а потом удаляется. Когда пользователь обратится к статистике в следующий раз, информация будет визуализирована заново.</p>
48 &lt;?include("includes/db.php"); $width = 400; $height = 200; $canv = imagecreatetruecolor($width, $height); //Цвета $white = imagecolorallocate($canv, 255, 255, 255); $gray = imagecolorallocate($canv, 150, 150, 150); $black = imagecolorallocate($canv, 0, 0, 0); $red = imagecolorallocate($canv, 255, 0, 0); $blue = imagecolorallocate($canv, 0, 0, 255); imagefill($canv,0,0,$white); //Рисуется квадрат imagerectangle($canv, 15, 5, $width-5, $height-15, $gray); //Горизонтальные линии for($i = 1; $i &lt;= 5; $i++) { imageline($canv, 15, $height-$i*35, $width-5, $height-$i*35, $gray); } //Вертикальные линии for($i = 1; $i &lt;= 15; $i++) { imageline($canv, 15+($i*30), 5, 15+($i*30), $height-15, $gray); } //Получение статистики из базы данных $stats_result = mysqli_query($db,"SELECT * FROM statistics"); if($stats_result) { $last_y = [0,0]; $x = 15; //Рисуется график while($stats = mysqli_fetch_array($stats_result)) { imageline($canv, $x, ($height-15)-$last_y[0], $x+30, ($height-15)-($stats['views']/10), $red); imageline($canv, $x, ($height-15)-$last_y[1], $x+30, ($height-15)-($stats['comments']/10), $blue); $last_y[0] = $stats['views']/10; $last_y[1] = $stats['comments']/10; $x += 30; } } else {echo mysqli_error($db);} //Вывод изображения header("Content-type: image/png"); imagepng($canv); //Освобождение памяти imagedestroy($canv); ?&gt;<p>Сначала создаются изображение, рамка и деления. Затем идёт запрос в базу данных, чтобы получить статистику, которая отрисовывается в виде графика. Изображение сохраняется для разового вывода, а потом удаляется. Когда пользователь обратится к статистике в следующий раз, информация будет визуализирована заново.</p>
49 <p>То, о чём мы успели поговорить, - лишь часть того, что должно быть в админке.</p>
49 <p>То, о чём мы успели поговорить, - лишь часть того, что должно быть в админке.</p>
50 <p>Например, дополнительно можно реализовать:</p>
50 <p>Например, дополнительно можно реализовать:</p>
51 <ul><li>премодерацию комментариев;</li>
51 <ul><li>премодерацию комментариев;</li>
52 <li>удаление записей из базы данных;</li>
52 <li>удаление записей из базы данных;</li>
53 <li>работу с файлами;</li>
53 <li>работу с файлами;</li>
54 <li>продвинутый редактор статей;</li>
54 <li>продвинутый редактор статей;</li>
55 <li>подробную статистику каждой отдельной страницы и так далее.</li>
55 <li>подробную статистику каждой отдельной страницы и так далее.</li>
56 </ul><a>Научитесь: Профессия PHP-разработчик с нуля до PRO Узнать больше</a>
56 </ul><a>Научитесь: Профессия PHP-разработчик с нуля до PRO Узнать больше</a>