CRUD / Генерация страницы по данным в БД

CRUD – это сокращение, от Create-Read-Update-Delete, то бишь Создавай-Читай-Обновляй-Удаляй. Набор стандартных операций, которые можно выполнять с данными.

В прошлой лабе мы довели систему до состояние, когда у нас четко выделены контролеры и представления, то есть это буквы VC из аббревиатуры MVС. Осталось теперь откуда-то взять модель, то бишь данные.

И так, в laragon помимо php встроен еще mysql, то есть система управления базой данных (скрщн СУБД).

А база данных – это на самом деле просто файлик или папка с файлами, в которой особым образом хранятся данные.

А система управления – это специальная программа, которая умеет в эту самую базу данных лазить и эти данные вытаскивать.

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

Тут мы создадим простую базу данных с одной табличкой, в которую запихаем несколько объектов. Объекты те же с которыми работали раньше. Только там все в файлах писали а тут будем в БД хранить. У меня это Андромеда и Орион.

Но чтобы все наши манипуляции с данными можно было бы выполнять более удобно, то, поставим сначала phpMyAdmin. Этот phpMyAdmin – это просто веб-приложение, написанное на php, из которого можно удобно управлять базой данных.

Установка phpMyAdmin

Идем на сайт https://www.phpmyadmin.net и качаем

сохраняем в папку /etc/apps:

и распаковываем:

затем переименовываем

Теперь можно зайти по адресу http://localhost/phpMyAdmin/ и увидить:

но пока не будем внутрь заходить, так как БД не настроена.

Обновляем MySQL

Сначала разберемся с MySQL, в laragon встроена весьма устаревшая версия с которой phpMyAdmin работать уже не умеет.

С другой стороны если попытаться обновить MySQL то более менее адекватная версия весит примерно 800MB, что конечно перебор.

Поэтому мы воспользуемся альтернативой СУБД mysql, которая называется mariadb. Она полностью совместима с mysql и разрабатывается как полностью бесплатная альтернатива mysql с открытым исходным кодом. Часто включена во всякие linux-дистрибутивы по умолчанию.

В общем, идем сюда https://downloads.mariadb.org и тыкаем download

выбираем zip архив

и сохраняем в папку

распаковываем

затем тормозим laragon

переключаем mysql на mariadb

И все запускаем обратно.

Теперь собственно можно заходить через phpMyAdmin. Идем сюда http://localhost/phpMyAdmin/

и вводим данные для входа (юзер: root, пароль пустой):

и видим такое:

Создаем базу

тыкаем слева Создать БД

пишем название БД (я назову ее outer_space) и выбираем кодировку utf8mb4_unicode_ci, почему ее? Можно прочитать тут: https://ru.stackoverflow.com/questions/757733/

Вот так, и тыкаем создать:

нам сообщат что база создана, теперь добавим в нее табличку

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

в общем, когда все пропишете можно тыкать сохранить и приступить к заполнению:

вводим данные и тыкаем Вперед

получаем такой результат

снова тыкаем Вставить и повторяем процедуру. В принципе нам хватит штук 5:

Подключаемся к базе из index.php

Для общения с базой данных в php встроен специальный класс PDO.

Через него можно подключаться к большинству популярных баз данных и выполнять разные запросы.

Чтобы начать общаться с базой, необходимо создать соединение. Делается это очень просто, идем в index.php и пишем:

<?php
// ...

$controller = new Controller404($twig);

// создаем экземпляр класса и передаем в него параметры подключения
// создание класса автоматом открывает соединение
$pdo = new PDO("mysql:host=localhost;dbname=outer_space;charset=utf8", "root", "");

// дальше не трогаем
if ($url == "/") {
    $controller = new MainController($twig);
} elseif (preg_match("#^/andromeda/image#", $url)) {
// ...

смысл значений такой:

Пробуем открыть главную страницу, если там ничего не поменялось, то значит подключились успешно:

а если подключение не сработает, то увидим какую-то ошибку, и тут надо уже разбираться по ситуации

в общем считаем что у нас все ок.

Передаем pdo в контроллер

Чтобы из контроллера можно было бы обращаться к базе, добавим в BaseController поле $pdo и сеттер для него

<?php

abstract class BaseController {
    public PDO $pdo; // добавил поле

    public function setPDO(PDO $pdo) { // и сеттер для него
        $this->pdo = $pdo;
    }
    // остальное не трогаем
    public function getContext(): array {
        return [];
    }

    abstract public function get();
}

и теперь добавим вызов этого метода перед вызовом get

<?php
// ...

// не трогаем тут
$pdo = new PDO("mysql:host=localhost;dbname=outer_space;charset=utf8", "root", "");

if ($url == "/") {
    // ...
}

if ($controller) {
    $controller->setPDO($pdo); // а тут передаем PDO в контроллер
    $controller->get();
}

Делаем запрос к базе данных

Давайте попробуем вывести данные из нашей таблички на главную страницу. Идем в MainController

<?php
require_once "TwigBaseController.php";

class MainController extends TwigBaseController {
    public $template = "main.twig";
    public $title = "Главная";
    
    
    // добавим метод getContext()
    public function getContext(): array
    {
        $context = parent::getContext();
        
        // подготавливаем запрос SELECT * FROM space_objects
        // вообще звездочку не рекомендуется использовать, но на первый раз пойдет
        $query = $this->pdo->query("SELECT * FROM space_objects");
        
        // стягиваем данные через fetchAll() и сохраняем результат в контекст
        $context['space_objects'] = $query->fetchAll();

        return $context;
    }
}

теперь пойдем в main.php и посмотрим, что оказалось в space_objects. Добавим туда:

{% block content %}
<pre>
{{ dump(space_objects) }} <!-- добавил вывод данных -->
</pre>
<ul class="list-group">
    <!-- ... -->
</ul>
{% endblock %}

правда если теперь запустить страницу, то увидим ошибку

тут дело в том, что в twig есть debug режим, который по умолчанию отключен и доступен только если активировать его вручную. И специальная функция dump доступна только в этом режиме.

Поэтому нам надо его сначала включить. Делается это достаточно просто. Идем в index.php

<?php
// ...

$url = $_SERVER["REQUEST_URI"];

$loader = new \Twig\Loader\FilesystemLoader('../views');
$twig = new \Twig\Environment($loader, [
    "debug" => true // добавляем тут debug режим
]);
$twig->addExtension(new \Twig\Extension\DebugExtension()); // и активируем расширение

обновляем страницу

о! данные пошли! =)

Разбираемся с данными

Вообще если на них посмотреть, то мы увидим:

Давай выведем название первого элемента:

{% extends "__layout.twig" %}

{% block content %}
Название: {{ space_objects[0].title }}

<!-- ... -->

получится так:

но вообще так как мы запросили список объектов то и для вывода имеет смысл выводить все элементы, причем делать через уже знакомый нам for:

{% extends "__layout.twig" %}

{% block content %}

{% for object in space_objects %}
    Название: {{ object.title }} <br>  
{% endfor %}

<!-- ... -->

и тогда получится уже так:

ну думаю идея понятна, теперь можно и задание поделать =)

1

Доработать приложение чтобы список на главной странице формировался на основании данных их БД.

Ссылки пока просто добавить, с пустыми href. Добавить картинку. Переверстать на флексы, чтобы получилось как-то так: