Generated with Avocode. Generated with Avocode. Generated with Avocode. Group 15 close hat Generated with Avocode. Generated with Avocode. Generated with Avocode. Generated with Avocode. Generated with Avocode. Generated with Avocode. path40

Как создать админку для сайта на PHP с нуля

Узнайте, для чего нужна панель управления сайтом, какие в ней должны быть функции и как ее разработать.

Чтобы управлять сайтом, нужно несколько инструментов:

  • phpmyadmin для работы с базой данных;
  • FTP-клиент, чтобы загружать или удалять файлы;
  • графический редактор, позволяющий сжимать изображения;
  • текстовый редактор, в котором будут оформляться статьи;
  • сервис аналитики для оценки эффективности контента и рекламы и многое другое.

Вместо этого можно создать панель управления сайтом, собрав все инструменты в одном месте.

Как создать админку для сайта на PHP

В первую очередь нужно создать файл admin.php в корне сайта. Пока у него будет такой вид:

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

Этот код будет получать данные методами GET и POST, обрабатывать их, а потом выводить что-либо через переменную $echo. Чтобы поисковики не пытались зайти в админку, нужно запретить ее индексирование в файле robot.txt:

Robot.txt

User-agent: *

Disallow: /admin.php

Теперь можно приступать к написанию функций, запросов и валидаций.

Авторизация

Чтобы ограничить доступ, нужна форма входа в панель управления сайтом:

$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>";

В переменную $echo прописывается HTML-код формы, которая передает данные на эту же страницу. Затем они обрабатываются:

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; //Обнуление переменной, чтобы удалить из вывода
                   форму авторизации

}

}

После отправки формы данные переносятся в супермассив $_SESSION. Затем вызывается функция login(). Она делает запрос в базу данных. Если он проходит удачно, возвращается значение true, если нет — данные из $_SESSION удаляются и возвращается false.

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

Главная страница

Теперь нужно, чтобы кроме лицезрения табличек пользователь мог делать что-то полезное. Для этого методом GET передается название страницы:

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;

}

В переменную $act попадает значение из $_GET['act'], а если его не существует, то просто «home». Дальше с помощью функции switch() прописываются действия для каждой страницы.

На главной странице админки должен быть доступ к управлению всеми компонентами сайта:

  • пользователями;
  • статьями;
  • карточками товаров;
  • комментариями;
  • файлами;
  • изображениями;
  • статистикой;
  • рекламными баннерами и так далее.

Также необходима возможность редактировать общие настройки сайта, чтобы можно было быстро поменять метатеги, изменить параметры капчи, обновить политику конфиденциальности и так далее. Словом, должен быть доступ ко всему функционалу панели управления.

Редактирование

Как вы могли заметить, в таблицах каждая строчка — это ссылка такого вида:

<a href='?act=edit_article&id=$article_array[id]'>$article_array[id] | $article_array[title]</a>

В переменной act передается значение edit_article, а в id — идентификатор статьи. Перейдя по ссылке, администратор должен попасть на страницу редактирования:

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;

Сначала в базу данных отправляется запрос на получение статьи. Затем, если все в порядке, выводится форма редактирования. Если перед этим пользователь отправил измененный текст, то он отправляется на сервер, таблица обновляется, а потом с помощью еще одного запроса выводится актуальная информация.

Добавление записей в базу данных

Чтобы создать функцию добавления пользователя (или любого другого элемента на сайте), нужно парсить форму и ее обработчик:

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;

Сначала проверяется, свободен ли указанный логин. Если да, то в базу вносятся соответствующие данные. Также обратите внимание, что существование переменной regadmin не проверяется, потому что форма ее не отправляет, если оставить чекбокс пустым.

Статистика

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

  • id;
  • date;
  • views;
  • comments.

В них записывается общее количество просмотров и комментариев за каждый день, которое затем выводится на графике. Чтобы это сделать, нужно прописать HTML-код таблицы:

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

В качестве источника картинки указывается PHP-файл со следующим кодом:

<?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);

?>

Сначала создается изображение и рисуются рамка и деления. Затем делается запрос в базу данных, чтобы получить статистику, которая отрисовывается в виде графика. Изображение сохраняется для разового вывода, а потом удаляется. Когда пользователь обратится к статистике в следующий раз, информация будет визуализирована заново.

Дополнительный функционал

То, о чем мы успели поговорить, — лишь часть того, что должно быть в админке. Например, можно реализовать:

  • премодерацию комментариев;
  • удаление записей из базы данных;
  • работу с файлами;
  • продвинутый редактор статей;
  • подробную статистику каждой отдельной страницы и так далее.

Также необходимо научиться тщательно проверять приходящие данные, сделать аутентификацию снова великой безопасной. Все это относится к разным направлениям PHP, которые невозможно охватить в одной статье.

Если вы хотите освоить освоить все направления PHP, запишитесь на курс
«PHP-разработчик с 0 до PRO». Вы получите все необходимые знания и закрепите их на практике — так вы научитесь самостоятельно разрабатывать даже самые сложные приложения, не списывая что-то в интернете.

Курс «PHP-разработчик»
Обширная программа для изучения PHP, состоящая из 4 курсов. Поможет с нуля овладеть популярным языком программирования, устроиться в IT-компанию вашей мечты или стать независимым разработчиком.
  • Живая обратная связь с преподавателями
  • Неограниченный доступ к материалам курса
  • Стажировка в компаниях-партнёрах
  • Дипломный проект от реального заказчика
  • Гарантия трудоустройства в компании-партнёры для выпускников, защитивших дипломные работы
Хочешь получать крутые статьи по программированию?
Подпишись на рассылку Skillbox
Новогодняя распродажа курсов