Добро пожаловать на 7-й урок курса для начинающих разработчиков под названием «Как гуглить?».
Сегодня мы познакомимся с системами управления контентом. Википедия говорит Content Management System (CMS) информационная система или компьютерная программа, используемая для обеспечения и организации совместного процесса создания, редактирования и управления содержимым.
Простыми словами CMS – это админка для сайта, которая позволяет в удобном виде добавлять, удалять или редактировать информацию на сайте или в веб-приложении. Зачастую, использование админки позволяет вносить изменения специалистам, не обладающим какими-либо техническими навыками.
Наиболее популярные сегодня CMS – это WordPress, 1С-Битрикс, Тильда. Такие системы управления контентом уже из коробки позволяют решить множество задач: управление пользователями и правами доступа, редактирование новостей, редактирование страниц, редактирование товаров, сбор заказов и обратной связи от посетителей сайта.
На этом уроке мы разработаем собственную систему управления сайтом для того, чтобы понять принципы работы CMS.
Переходим в панель управления хостингом нашего сайта и в корневой директории с сайтом создаем папочку «admin» – именно там будут храниться исходные файлы нашей админ-панели.
Создадим с этой папке сразу 2 файла: index.php и login.php
Теперь переходим к редактированию файла login.php – в нем мы разместим шаблон страницы авторизации. Создадим форму авторизации
В форме укажем action = “?”, что будет означать отправку данных в по тому же адресу, где находится сейчас пользователь и метод – POST, чтобы не демонстрировать пароль пользователя в адресной строке браузера (как в случае с GET-запросами)
Теперь переходим к файлу index.php в папке admin и начинаем накидывать систему авторизации.
Перо-наперво нам понадобится функция session_start(), которая позволит нам организовать работу с сессиям. Сессии в PHP – это крайне удобный инструмент. Если мы инициируем сессию на стороне сервера – то пока пользователь находится на нашем сайте мы можем хранить служебную информацию на стороне сервера. Пользователь может переходит по страницам нашего сайта при это мы всегда будем четно знать кто это и что мы о нём знаем.
Эта конструкция позволяет проверить наличие в сессии параметра «admin» и если его нет – показать пользователю страницу авторизации. Обратите внимание на функцию exit – она позволяет остановить выполнение PHP-скрипта и игнорировать весь код, который будет написан далее. Также обратите внимание на функцию isset – она позволяет проверить существует ли искомая переменная.
Теперь, нам где-то нужно произвести проверку на то, что пользователь указал корректную пару логин-пароль. Для этого между session_start() и конструкцией if добавим следующий код
if ((isset($_POST['login'])) AND (isset($_POST['password']))){
if (($_POST["login"] == "admin") AND ($_POST["password"] == "12345")){
$_SESSION["admin"] = 1;
} else {
echo "неверный логин или пароль";
}
}
Здесь мы производим авторизацию пользователя, и, если авторизация пройдена успешно – записываем в сессию пользователя параметр «admin» со значением 1, в противном случае – мы уведомляем пользователя, что указанный логин или пароль не верны.
В итоге у нас получается следующий код
А код, который будет написан ниже – будет доступен к исполнению только для авторизованных пользователей.
Теперь, скопируем из файла news.php, который мы обновили на предыдущем уроке кусок кода, который позволяет выдернуть из базы данных заголовки новостей.
$mysqli = new mysqli("localhost", "u1777138_new", "cX8jI9zN3c", "u1777138_new");
mysqli_query($mysqli, "SET character_set_results='utf8'");
mysqli_query($mysqli, "SET NAMES 'utf8'");
$sql = "SELECT * FROM news";
if($result = $mysqli->query($sql)){
foreach($result as $row){
echo "- " . $row['title'] . "
";
}
}
Немного доработаем ту часть, которая относится к переходу на новость – сделаем так, чтобы мы переходили к странице edit.php, которая находится в директории с админкой: /admin/edit.php, а также добавим перед всеми новостями кнопку “Добавить новость”
echo "- Добавить новость
";
$mysqli = new mysqli("localhost", "u1777138_new", "cX8jI9zN3c", "u1777138_new");
mysqli_query($mysqli, "SET character_set_results='utf8'");
mysqli_query($mysqli, "SET NAMES 'utf8'");
$sql = "SELECT * FROM news";
if($result = $mysqli->query($sql)){
foreach($result as $row){
echo "- " . $row['title'] . "
";
}
}
Теперь, когда администратор сайта нажмёт на ссылку с новостью или нажмет на “Добавить новость” – он будет перенаправлен на страницу /admin/edit.php с GET-параметром “id”, который отвечает за порядковый номер новости (или с параметром равным “0”, который позволит нам понять, что администратор хочет добавить новую публикацию).
Теперь создадим файл edit.php в директории admin в разместим в нём следующий код
Этот код позволит остановить выполнение PHP-скрипта на странице edit.php, в случае, если администратор не был авторизован.
Теперь создадим шаблон формы, который позволит редактировать запись
query("SET character_set_results='utf8'");
$mysqli -> query("SET NAMES 'utf8'");
// Проверяем был ли передан GET-параметр "save"
if (isset($_GET['save'])){
$id = $_POST['id'];
$title = $mysqli -> real_escape_string($_POST['title']);
$text = $mysqli -> real_escape_string($_POST['text']);
if ($_POST['id'] == 0){
$sql = "INSERT INTO `news` (title, text) VALUES ('$title', '$text')";
} else {
$sql = "UPDATE `news` SET `title` = '$title', `text` = '$text' WHERE `id` = $id";
}
$mysqli -> query($sql);
$mysqli -> close();
echo "Информация успешно сохранена. Перейти в панель управления.";
exit;
}
// Проверяем наличие ID записи в GET-параметрах
if (!isset($_GET['id'])){
echo "Не указан идентификатор новости";
exit;
}
// Получаем информацию о новости
if ($_GET['id'] != 0){
$sql = "SELECT * FROM `news` WHERE id = " . $_GET['id'];
if ($result = $mysqli -> query($sql)){
foreach($result as $row){
$title = $row['title'];
$text = $row['text'];
}
}
} else {
$title = "Заголовок новости";
$text = "Текст новости";
}
// Завершаем работу с БД
$mysqli -> close();
?>
Разберемся, что здесь написано. После того, как мы убедились, что пользователь, пытающийся открыть /admin/edit.php обладает правами администратора – мы открываем соединение с базой данных.
После этого, мы проверяем был ли отправлен GET-параметр “save”, который будет добавлен к URL-адресу после отправки формы (которая находится самом низу кода). В случае, если GET-параметр “save” был передан – это значит, что мы имеем POST-данные из формы для создания новой записи или обновления существующей.
Внутри конструкции if мы подготавливаем, полученные из формы данные. Сначала мы используем функцию real_escape_string, которая позволит экранировать специальные символы, если они были в тексте или заголовке новости. Так как при подготовке SQL-запроса в PHP мы просто соединяем строки (соединяем SQL-команду со значением переменных) – может возникнуть ситуация, когда значения переменных поломают наш SQL-запрос. Так например, если заголовок новости содержит кавычки – SQL-запрос отработает некорректно. Допустим наш заголовок новости выглядит так: “АВТОВАЗ” запустил производство обновлённой Приоры – в этом случае, после объединения шаблона SQL-запроса со значением из POST-параметра title – мы получим следующий SQL-запрос.
В случае же, если GET-параметр “save” не передавался – продолжаем выполнения скрипта и проверяем наличие GET-параметра “id”, который нам понадобится для того, чтобы определить хотим ли мы добавить новую новость или отредактировать существующую. Если параметр не задан – выводим ошибку и завершаем выполнение PHP-скрипта.
INSERT INTO `news` (title) VALUES (""АВТОВАЗ" запустил производство обновлённой Приоры");
Такой запрос будет выполнен некорректно и данные не будут сохранены в БД, поэтому, чтобы передать в БД спецсимволы, но не поломать запрос – необходимо использовать для строковых и текстовых значений экранирование, которое реализовано в PHP функцией real_escape_string.
Далее, мы проверяем переданный ID новости. Если он равен нулю – значит мы создаем новую запись в БД, используя SQL-команду INSERT. Если же значение отличное от нуля – обновляем существующую запись в БД с помощью SQL-команды UPDATE.
После выполнения – разрываем соединение с БД, выводим информацию о том, что запись была успешно обновлена / создана и заканчиваем выполнение PHP-скрипта.
Если GET-параметр id задан и он отличается от нуля – получаем информацию о новости из БД и сохраняем эту информацию в отдельные переменные.
Ниже в HTML-форме с помощью сокращенной PHP-функции echo, которая выглядит просто как знак равно идущий после открывающего тега php, выводим заголовок и текст новости в соответствующие поля.
Теперь мы можем без труда редактировать новости и добавлять новые без доступа к исходным файлам сайта и без доступа к базе данных.
Домашнее задание
В качестве домашнего задания, я предлагаю реализовать следующее:
1. Добавьте на страницу редактирования новости ссылку для удаления новости. Точно также как отправкой формы – такая ссылка должна содержать GET-параметр, пусть это будет “delete”:
2. Найдите с помощью Google пример SQL-запроса, который позволяет удалять записи из базы данных и доработайте файл /admin/edit.php таким образом, чтобы при клике на ссылку “удалить новость” – запись была удалена из базы данных
Скачать исходные файлы урока №7