В этой статье покажу основы кода, для того чтобы на PHP создать свой первый блог на чистом PHP, там не будет как сделать админку, но будет как сделать самую базу, как будет работать сайт.
Также перед этим посмотрите наш учебник по PHP.
Создаём базу данных для блога:
В качестве базы данных мы используем MySQL, тут не будет показываться как сделать БД и таблицы в ней, просто покажу структуру.
Таблица articles (Статьи):
- id — id статьи;
- title — Заголовок статьи;
- text — Текст статьи;
- id_categories — id темы;
- views — просмотры;
- date — дата создания статьи;
Таблица categories (Категории):
- id — id темы;
- name — Названия темы;
Таблица comments (Комментарии):
- id — id комментария;
- comment — Комментарий;
- id_article — id статьи которому прикреплён комментарий;
- date — Дата комментария;
Как видите БД получилась не большая.
Что касается её настроек, тут всё просто, вам не чего делать особо даже не надо, вот скриншоты с настройками.
Таблица articles (Статьи):
Таблица categories (Категории):
Таблица comments (Комментарии):
На этом настройка БД закончилась.
Также, если вы плохо знаете как работать с PhpMyAdmin, то прочитаете часть учебника: Работа с PhpMyAdmin.
Структура файлов блога:
Так как в статье показывается как сделать первый сайт, то структура будет очень простая, вот:
1 2 3 4 5 6 7 8 9 10 11 12 13 | │ index.php // Главная страница │ post.php // Страница статей │ topic.php // Страница категорий │ ├───script // Папка скриптов │ │ script.js │ ├───style // Папка стилий │ │ style.css │ └───templates // Папка шаблонов и генераторов │ generation.php // Файл с генераторами │ mysqlConnect.php // Папка с |
Это не совсем вся структура, также мы не будем делать CSS и JS, это скорей для вас, чтобы вы знали куда это всё положить вместо этого используем Bootstrap.
Как работает блог:
Пришло время рассказать как будет работать программа, суть работы в том, что вы будите заходить на страницу, например статьи, и специальный генератор, будет брать из БД данные страницы и выводить их.
А в ссылки к статьям будут отсылаться к шаблону с GET параметрам с идентификатором этой статье.
Если вы не знаете как работает форма и что такое GET и POST запросы то зайдите сюда.
Генераторы:
Теперь самое главное, это то какие генераторы у нас будут, чтобы блог на PHP нормально работал, но сначала разберём файл с подключением к БД.
mysqlConnect.php:
Это файл подключает нас базы данных.
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $servername = "127.0.0.1"; $username = "root"; $password = ""; $BDname = "bd_blog"; $mysqli = new mysqli($servername, $username, $password, $BDname); if ($mysqli -> connect_error) { printf("Соединение не удалось: %s\n", $mysqli -> connect_error); exit(); }; |
Тут всё достаточно просто, первые переменную это адрес сервера, имя пользователя, пароль и название БД, потом подключаем класс mysqli и проверяем, что всё правильно подключилось.
generation.php:
Файл generation.php нужен для генерации HTML элементов, точнее именно в этом фале будут браться данные из БД и выводится на страницу.
Каждый генератор не большая функция, которая берёт из БД данные и выводит что нужно, мы разберём каждую по отдельности.
1 | include_once "mysqlConnect.php"; // Подключение к БД |
В начале файла мы просто подключаем файл в котором мы подключались к базе данных, следующие что мы сделаем, это функцию для генерирования меню.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // Функция для генерации меню function generation_head_menu ($mysqli) { // Строим SQL запрос $sql = "SELECT * FROM `topic`"; // Отправляем SQL запрос к БД $resSQL = $mysqli -> query($sql); ?> <header> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="/">Navbar</a> <ul class="navbar-nav mr-auto"> <?php // Создаём список категорий в меню while ($rowTopic = $resSQL -> fetch_assoc()) { // Выводим элемент списка echo '<li class="nav-item"><a class="nav-link" href="./topic.php?id_topic='. $rowTopic["id"] .'">'. $rowTopic['name'].'</a></li>'; } ?> </ul> </nav> </header> <?php } |
То есть, здесь мы берём в SQL запросе все категории которые есть в БД, и кладём их в качестве списка в меню.
В ссылке используется путь до HTML шаблона категории с GET запросом который передают id категории.
Теперь перейдём к созданию вывода статей, в начале сделаем вывод для главной страницы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // Генератор для вывода статей function generation_posts_index ($mysqli) { // SQL запрос для получения всех статей на сайте $sql = "SELECT * FROM `articles`"; // Отправляем SQL запрос $res = $mysqli -> query($sql); // Проверка что есть статьи if ($res -> num_rows > 0) { // Выводим статьи while ($resArticle = $res -> fetch_assoc()) { ?> <div class="card"> <div class="card-body"> <h5 class="card-title" ><a href="post.php?id_article=<?= $resArticle['id'] ?>"><?= $resArticle['title'] ?></a></h5> <p class="card-text"><?= mb_substr($resArticle['text'], 0, 158, 'UTF-8') ?></p> </div> </div> <?php } } else { // Если нет статей то выводим надпись echo "Нет статей"; } } |
Тут уже строим SQL запрос для получения всех статей, которые есть на сайте, отправляем запрос, проверяем есть ли строки в БД, если да, то выводим их все через цикл, если нет, то пишем надпись «Нет статей».
При выводе статей в качестве ссылке на неё используем путь до шаблона с GET запросом который передают id статьи.
Следующий генератор для вывода статей в определённой категории.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // Создаём генератор для вывода статей в категории function generation_posts_topic ($mysqli, $id_topic) { // Строим SQL запрос $sql = "SELECT * FROM `articles` WHERE `id_topic` = $id_topic"; // Отправляем SQL запрос $res = $mysqli -> query($sql); // Проверяем есть ли статьи if ($res -> num_rows > 0) { // Через цикл выводим статьи while ($resArticle = $res -> fetch_assoc()) { ?> <div class="card"> <div class="card-body"> <h5 class="card-title" ><a href="post.php?id_article=<?= $resArticle['id'] ?>"><?= $resArticle['title'] ?></a></h5> <p class="card-text"><?= mb_substr($resArticle['text'], 0, 158, 'UTF-8') ?></p> </div> </div> <?php } } else { // Если нет статей, то выводим надпись echo "В этом раздели статей нету"; } } |
Это точно такая же функция что и для главной страницы, единственное один из параметров это id категории и статьи получаем по её id которой принадлежат.
Теперь перейдём к генераторам для статей.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Функции для генерации статьи function generation_post ($mysqli, $id_article) { // Строим SQL запрос $sql = "SELECT * FROM `articles` WHERE `id` = '$id_article'"; // Отправляем SQL запрос $res = $mysqli -> query($sql); // Проверяем есть ли статья if ($res -> num_rows === 1) { // Получаем и выводим статью $resPost = $res -> fetch_assoc()?> <h1><?= $resPost['title'] ?></h1> <p><?= $resPost['text'] ?></p> <p>Дата публикации: <?= substr($resPost['date'], 0, 11) ?></p> <?php } } |
Тут в качестве параметра предаём id статьи, и точно так же как и в предыдущем получаем по нему её, и поверяем, есть ли у нас что-то, если да, то выводим заголовок и текст.
Последний генератор, это вывод комментариев, вот он.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // Делаем генератор комментариев function generation_comment ($mysqli, $id_article) { // Строим SQL запрос $sql = "SELECT * FROM `comments` WHERE `id_article` = $id_article"; // Отправляем SQL запрос $resSQL = $mysqli -> query($sql); // Проверяем есть ли комментарии if ($resSQL -> num_rows > 0) { // Выводим комментарии while ($resComment = $resSQL -> fetch_assoc()) { ?> <div class="comment"> <p><b><?= $resComment['comment']?></b></p> <p>Оставлен: <?= substr($resComment['date'], 0, 11) ?></p> </div> <hr> <?php } } else { // Если нет комментариев то выводим надпись ?> <p>Комментариев нет</p> <?php } } |
Здесь подобный код, как и в случаи с генератором статей, только берём мы комментарии по идентификатору статьи.
Примечание:
Скорее всего вы заметили, что в каждом генераторе мы используем в качестве параметра $mysqli
, это нужно для работы с базой данных.
Шаблоны HTML:
Последние что стоит разобрать, так это как будут устроены страницы блога на PHP.
index.php:
Это у нас файл для главной страницы, в нём будем использовать генератор меню и вывода всех статей.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php include_once "./templates/generation.php"; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Главная</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> </head> <body> <?php generation_head_menu($mysqli); ?> <div class="container"> <?php generation_posts_index($mysqli); ?> </div> </body> </html> |
Единственное что можно отметить, это то, что мы подключаем файл с генераторами.
topic.php:
Здесь делаем шаблон для категории, так же используем генератор меню и вывода статей категории.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php include_once "./templates/generation.php"; $id_topic = $_REQUEST['id_topic']; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Категория</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> </head> <body> <?php generation_head_menu($mysqli); ?> <div class="posts"> <?php generation_posts_topic($mysqli, $id_topic); ?> </div> </body> </html> |
Тут только одно существенное отличие от предыдущего файла, мы кладём идентификатор темы, который передаются через GET запрос, в переменную и передаём его в качестве параметра в генератор.
post.php:
Осталось создать шаблон для статьи, а то какой блог на PHP без статей, для него нужно использовать функции вывода контента статьи и комментариев, ну и так же меню.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <?php include_once "./templates/generation.php"; $id_article = $_REQUEST["id_article"]; $comment = $_REQUEST["comment"]; function send_comment ($mysqli, $comment, $id_article) { $sql = "INSERT INTO `comments` (`comment`, `id_article`, `date`) VALUES ('$comment', '$id_article', CURRENT_TIMESTAMP)"; $mysqli -> query($sql); echo '<script>location.replace("http://first-my-blog-php/post.php?id_article=' . $id_article . '");</script>'; exit; } if (isset($_REQUEST['doGo']) === true) { send_comment($mysqli, $_REQUEST['comment'], $id_article); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Статья</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> </head> <body> <?php generation_head_menu($mysqli); ?> <div class="container"> <?php generation_post($mysqli, $id_article); ?> </div> <div class="comments container"> <hr> <form action="<?= $_SERVER["SCRIPT_NAME"] ?>"> <textarea name="comment" id="" style="width:800px; height:50px;"></textarea> <input type="hidden" name="id_article" value="<?php echo $id_article ?>"> <input name="doGo" type="submit" value="Отправить"> </form> <p>Комментарии:</p> <hr> <?php generation_comment($mysqli, $id_article); ?> </div> </body> </html> |
Это пожалуй самый интересный файл, в неё в начале мы подключаем файл в котором хранятся генераторы, потом данные GET запроса перемешаем в переменные, и тут вы наверное заметили, что мы сделали переменную $comment
, хотя она вроде и не нужна, но нет, мы тут же будем отправлять комментарии к посту.
Потом создаём функцию send_comment()
, она как раз и будет отправлять комментарии, внутри него создаём SQL запрос для создания комментария в БД, делаем запрос и с помощью JavaScript перемешаем пользователя на эту же страницу, это нужно для того чтобы не добавлялись одни и те же комментарии.
Потом проверяем что нажата кнопка отправить, и если да, то используем функции send_comment()
.
Вывод:
Вот такой блог на PHP получился, это очень простой код, но тут показано как создать самый первый блог, и для самых новичков.
Ещё для главной статьи и для категорий хорошо бы сделать пагинацию, для этого можете прочитать статью по ссылки, ещё можете сделать админ панель, но это уже сами.
Ещё вы можете скачать файлы этого блога.