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
<? include("includes/db.php"); $echo = "Тут скоро что-то будет"; ?> <!DOCTYPE html> <html> <head> <title>Админка</title> <link rel="stylesheet" href="admin.css"> </head> <body> <div class='wrapper'> <main class='main' id='main'> <?echo $echo;?> </main> </div> </body> </html><p>Этот код получает данные методами<em>GET</em>и <em>POST</em>, обрабатывает их, а потом выводит что-либо через переменную<em>$echo</em>. Чтобы поисковики не пытались зайти в админку, запретите её индексировать в файле<em>robots.txt</em>:</p>
15
<? include("includes/db.php"); $echo = "Тут скоро что-то будет"; ?> <!DOCTYPE html> <html> <head> <title>Админка</title> <link rel="stylesheet" href="admin.css"> </head> <body> <div class='wrapper'> <main class='main' id='main'> <?echo $echo;?> </main> </div> </body> </html><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 = "<div class='table'> <div class='tale-wrapper'> <div class='table-title'>Войти в панель администратора</div> <div class='table-content'> <form method='post' id='login-form' class='login-form'> <input type='text' placeholder='Логин' class='input' name='login' required><br> <input type='password' placeholder='Пароль' class='input' name='password' required><br> <input type='submit' value='Войти' class='button'> </form> </div> </div> </div>";<p>В переменную<em>$echo</em>прописываем<a>HTML</a>-код формы, которая передает данные на эту же страницу. Затем они обрабатываются:</p>
24
$echo = "<div class='table'> <div class='tale-wrapper'> <div class='table-title'>Войти в панель администратора</div> <div class='table-content'> <form method='post' id='login-form' class='login-form'> <input type='text' placeholder='Логин' class='input' name='login' required><br> <input type='password' placeholder='Пароль' class='input' name='password' required><br> <input type='submit' value='Войти' class='button'> </form> </div> </div> </div>";<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']) && isset($_POST['password'])) { $_SESSION['login'] = $_POST['login']; $_SESSION['password'] = $_POST['password']; } if(isset($_SESSION['login']) && 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']) && isset($_POST['password'])) { $_SESSION['login'] = $_POST['login']; $_SESSION['password'] = $_POST['password']; } if(isset($_SESSION['login']) && 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) >= 1) { while($article_array = mysqli_fetch_array($article_result)) { $articles .= "<div class='table-content__list-item'><a href='? act=edit_article&id=$article_array[id]'>$article_array[id] | $article_array[title]</a></div>"; } } else { $articles = "Статей пока нет"; } $users_result = mysqli_query($db,"SELECT * FROM userlist"); if(mysqli_num_rows($users_result) >= 1) { while($users_array = mysqli_fetch_array($users_result)) { $users .= "<div class='table-content__list-item'><a href='? act=edit_user&id=$users_array[id]'>$users_array[id] | $users_array[login]</a></div>"; } } else { $users = "Статей пока нет"; } $echo = "<div class='tables'> <div class='table'> <div class='table-wrapper'> <div class='table-title'>Страницы</div> <div class='table-content'> $articles <a href='?act=add_article' class='table__add-button' id='add_article'>+</a> </div> </div> </div> <div class='table'> <div class='table-wrapper'> <div class='table-title'>Пользователи</div> <div class='table-content'> $users <a href='?act=add_user' class='table__add-button' id='add_user'>+</a> </div> </div> </div> </div>"; 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) >= 1) { while($article_array = mysqli_fetch_array($article_result)) { $articles .= "<div class='table-content__list-item'><a href='? act=edit_article&id=$article_array[id]'>$article_array[id] | $article_array[title]</a></div>"; } } else { $articles = "Статей пока нет"; } $users_result = mysqli_query($db,"SELECT * FROM userlist"); if(mysqli_num_rows($users_result) >= 1) { while($users_array = mysqli_fetch_array($users_result)) { $users .= "<div class='table-content__list-item'><a href='? act=edit_user&id=$users_array[id]'>$users_array[id] | $users_array[login]</a></div>"; } } else { $users = "Статей пока нет"; } $echo = "<div class='tables'> <div class='table'> <div class='table-wrapper'> <div class='table-title'>Страницы</div> <div class='table-content'> $articles <a href='?act=add_article' class='table__add-button' id='add_article'>+</a> </div> </div> </div> <div class='table'> <div class='table-wrapper'> <div class='table-title'>Пользователи</div> <div class='table-content'> $users <a href='?act=add_user' class='table__add-button' id='add_user'>+</a> </div> </div> </div> </div>"; 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
<a href='?act=edit_article&id=$article_array[id]'>$article_array[id] | $article_array[title]</a><p>В переменной<em>act</em>передаётся значение<em>edit_article</em>, а в <em>id</em> - идентификатор статьи. Перейдя по ссылке, администратор попадает на страницу редактирования:</p>
37
<a href='?act=edit_article&id=$article_array[id]'>$article_array[id] | $article_array[title]</a><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']) && isset($_POST['description']) && 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 = "<div class='table'> <div class='table-wrapper'> <div class='table-title'>Редактирование статьи</div> <div class='table-content'> <a href='?act=home'><- Вернуться</a><br> $message <form method='post' class='article-form'> <b>Название:</b> <input type='text' name='title' value='$article[title]'><br> <b>Описание:</b> <textarea name='description'>$article[description]</textarea><br> <b>Текст:</b> <textarea name='text'>$article[text]</textarea></br> <input type='submit' class='button' value='Сохранить'> </form> </div> </div> </div>"; } } 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']) && isset($_POST['description']) && 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 = "<div class='table'> <div class='table-wrapper'> <div class='table-title'>Редактирование статьи</div> <div class='table-content'> <a href='?act=home'><- Вернуться</a><br> $message <form method='post' class='article-form'> <b>Название:</b> <input type='text' name='title' value='$article[title]'><br> <b>Описание:</b> <textarea name='description'>$article[description]</textarea><br> <b>Текст:</b> <textarea name='text'>$article[text]</textarea></br> <input type='submit' class='button' value='Сохранить'> </form> </div> </div> </div>"; } } break;<p>Сначала в базу данных отправляется запрос на получение статьи. Затем, если всё в порядке, выводится форма редактирования. Если перед этим пользователь отправил изменённый текст, то он отправляется на сервер, таблица обновляется, а потом с помощью ещё одного запроса выводится актуальная информация.</p>
39
<p>Чтобы создать функцию добавления пользователя (или любого другого элемента на сайте), парсим форму и её обработчик:</p>
39
<p>Чтобы создать функцию добавления пользователя (или любого другого элемента на сайте), парсим форму и её обработчик:</p>
40
case 'add_user': if(isset($_POST['reglogin']) && 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 = "<div class='table'> <div class='table-wrapper'> <div class='table-title'>Новый пользователь</div> <div class='table-content'> <a href='?act=home'><- Вернуться</a><br> $message <form method='post' class='user-form'> <b>Логин:</b> <input type='text' name='reglogin' required><br> <b>Пароль:</b> <input type='text' name='regpassword' required><br> <b>Админ:</b> <input type='checkbox' name='regadmin'></br> <input type='submit' class='button' value='Добавить'> </form> </div> </div> </div>"; break;<p>Сначала проверяем, свободен ли указанный логин. Если да, то в базу вносятся соответствующие данные. Также обратите внимание, что существование переменной<em>regadmin</em>не проверяется, потому что форма её не отправляет, если оставить чекбокс пустым.</p>
40
case 'add_user': if(isset($_POST['reglogin']) && 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 = "<div class='table'> <div class='table-wrapper'> <div class='table-title'>Новый пользователь</div> <div class='table-content'> <a href='?act=home'><- Вернуться</a><br> $message <form method='post' class='user-form'> <b>Логин:</b> <input type='text' name='reglogin' required><br> <b>Пароль:</b> <input type='text' name='regpassword' required><br> <b>Админ:</b> <input type='checkbox' name='regadmin'></br> <input type='submit' class='button' value='Добавить'> </form> </div> </div> </div>"; 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
<div class='table'> <div class='table-wrapper'> <div class='table-title'>Статистика</div> <div class='table-content'> <img src='stats.php' class='statistics-img'> <br> Красный: просмотры <br> Синий: комментарии <br> 1 шаг - 1 день </div> </div> </div><p>В качестве источника картинки указывается PHP-файл с кодом:</p>
47
<div class='table'> <div class='table-wrapper'> <div class='table-title'>Статистика</div> <div class='table-content'> <img src='stats.php' class='statistics-img'> <br> Красный: просмотры <br> Синий: комментарии <br> 1 шаг - 1 день </div> </div> </div><p>В качестве источника картинки указывается PHP-файл с кодом:</p>
48
<?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 <= 5; $i++) { imageline($canv, 15, $height-$i*35, $width-5, $height-$i*35, $gray); } //Вертикальные линии for($i = 1; $i <= 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); ?><p>Сначала создаются изображение, рамка и деления. Затем идёт запрос в базу данных, чтобы получить статистику, которая отрисовывается в виде графика. Изображение сохраняется для разового вывода, а потом удаляется. Когда пользователь обратится к статистике в следующий раз, информация будет визуализирована заново.</p>
48
<?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 <= 5; $i++) { imageline($canv, 15, $height-$i*35, $width-5, $height-$i*35, $gray); } //Вертикальные линии for($i = 1; $i <= 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); ?><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>