Как попроще вывести таблицу из БД
Всем привет,
нужно тупо вывести таблицу из БД на страницу, подскажите как попроще это сделать?
Почему такая пхп вставка на странице возвращает Array (код из примера на стороннем ресурсе), как такой запрос вывести ввиде таблицы?
$query = db_query ( «SELECT * FROM WHERE nid IN (1)» );
$output = $query -> fetchAll ();
return $output ;
?>?php
- Drupal8
- Есть вопрос
- Решение проблем
- Блог
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Комментарии
Semantics 31 июля 2018 в 21:21
Потому что эта вставка, действительно, возвращает массив.
В идеале, вам надо этот массив скормить функции темизации.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
К коду прикладывается картинка и на ней все ок, единственное, это код из модуля примера, но сам модуль который целиком доступен для скачивания кладет сайт а в логе ошибка типа:
kint ( $output ) ; метод неизвестен
Предполагаю что это опечатка.
Большая просьба, напишите простенький пример с темизацией.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Вот элемент формы — таблица:
$form[‘status_table’] = array(
‘#theme’ => ‘table’,
‘#header’ => $header,
‘#rows’ => table_rows_data(),
‘#empty’ => t(‘No content available.’),
‘#title’ => ‘Статус’,
‘#prefix’ => ‘
‘,
‘#weight’ => 7,
);
Вот функция, которая возвращает массив строк для построения таблицы:
function _table_rows_data()
$query = db_query(«SELECT * FROM WHERE nid IN (1)»);
$rows_data = $query->fetchAll();
Это как пример. Хотя есть еще куча вариантов.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
С таким sql запросом проще Views использовать
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Илларион 1 августа 2018 в 11:52
да я чот потыкался — не понял как это сделать, хотя видел немного инфы про это, если дадите хорошую ссылочку что почитать буду благодарен.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
sas@drupal.org 1 августа 2018 в 8:26
> Почему такая пхп вставка на странице возвращает Array (код из примера на стороннем ресурсе), как такой запрос вывести ввиде таблицы?
Потому что такой у нее формат ответа — массив объектов, в виде таблиц можно вывести через theme_table
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Илларион 1 августа 2018 в 22:02
$nodes = db_select ( ‘node’ , ‘n’ ) — > fields ( ‘n’ , array ( ‘nid’ , ‘type’ ) ) — > orderBy ( ‘n.nid’ ) — > execute ( ) ;
$header = array ( ‘Nid’ , ‘Type’ ) ;
$rows = array ( ) ;
?php>
foreach ( $nodes as $node ) <
$rows [ ] = array ( $node — > nid , $node — > type ) ;
>
$output = theme ( ‘table’ , array ( ‘header’ = > $header , ‘rows’ = > $rows ) ) ;
return $output ;
а так же на theme_table
Пишет в лог —
Error: Call to undefined function theme() in /home/drupal/public_html/modules/php/php.module(81) : eval()’d code on line 10 #0 /home/drupal/public_html/modules/php/php.module(81): eval()\n#1 /home/drupal/public_html/modules/php/src/Plugin/Filter/Php.php(26): php_eval(‘
Это я все же делаю что то не правильно или пхп фильтр балует?
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Semantics 1 августа 2018 в 22:06
PHP-фильтром правильно не может быть априори.
Давайте лучше учить вьюсы.
Опишите точнее какая вам выборка нужна
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Илларион 1 августа 2018 в 22:12
У меня своя кастомная таблица, в ней есть текстовые поля, цифровые и время, покажите на примере любой типовой таблицы а дальше думаю сам справлюсь (ну пусть будет таблица ноде или юсерс. )
С MySQL запросами — дружу хорошо, тут сложность для меня именно вывести это.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Во-первых, не theme, а \Drupal::service(‘renderer’)->render().
Во-вторых, не помешало бы удосужиться заглянуть в структуру переменной, прежде чем выводить её на экран
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
«подход» с кастомной таблицей вкорне не правилен.
Простейший вариант — создать специальный тип ноды с нужными полями, и работать с ним стандартно. (вывести данные при помощи модуля views и т.п.)
Если кастомная таблица уже с данными (досталась по наследству), импортировать данные в созданную выше ноду.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Илларион 5 августа 2018 в 10:14
таблиц 60 штук) с столбцами от 5 до 20)
вообще не думал что с выводом будут какие то проблемы, самое обидное что сделал типа макет обычными запросами mysql на php страницах, там все работает, придумал костыль — выводить это через фрейм, но ппц как свербит от такой реализации
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
gun_dose 5 августа 2018 в 11:45
Что конкретно у вас работает? Прямо вот так сразу через принт выводили результат запроса? Крайне сомнительно.
Выложите тот код, который работает в ваших макетах, а мы расскажем, как это воткнуть в друпал.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Грубо говоря, в Drupal 8 нет понятия «таблица БД».
Есть понятие Entity (сущность) , т.е. некий объект данных, поля которого в привычном понимании — поля таблицы БД, а методы — функции каких либо манипуляций с этим объектом, как стандартные (save и т.п.), так и определенные разработчиком.
Для хранения и обработки данных можно использовать:
1.Стандартные сущности Друпал (node, taxonomy term, user и т.п.).
2.Можно добавлять кастомные сущности с необходимым набором полей (таблицы в БД для этих сущностей друпал создаст сам).
3.Можно добавить кастомные сущности для имеющихся «самопальных» таблиц .
4.Можно добавлять кастомные сущности, данные которых вообще могут храниться где угодно: в файлах, отдаваться на запросы к внешним сервисам и т.п.
т.е. непосредственно работа с БД производиться на более низком уровне, а у разработчика есть весь нужные высокоуровневый инструментарий для работы с данными:
— создать сущность
— загрузить сущность
— сохранить сущность
— сделать выборку сущностей по определенным критериям
— и т.п.
Но как я понял, Вам пока будет достаточно просто блоков.
— Разместить кастомный блок в нужном месте нужной страницы
— Сделать выборку данных из БД
— Сформировать html-вывод
— Вывести результат в блок.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
gun_dose 5 августа 2018 в 15:04
Если так судить, то и в 7 друпале типа тоже не было таблиц. На самом же деле всё не так. Таблицы есть. Есть механизм запросов к этим таблицам, значит сущности по определению не обязательны, а яаляются лишь правилом хорошего тона. Но и то не всегда. Для сущности должны быть определены механизмы CRUD-операций. Это не в друпале, а вообще в принципе в программировании, безотносительно языков, фреймворков и т.п. И в этом контексте вовсе необязательно, чтобы строки любой таблицы были сущностями. Всё зависит исключительно о того, какие данные лежат в таблице, откуда они там берутся, как часто обновляются и т.д. Допустим, есть таблица почтовых индексов какой-то страны, такие данные импортируются из стороннего источника и не нуждаются в регулярном обновлении, делать под это дело сущности — вредительство, т.к. если надо отобразить список индексов, то с точки зрения потребляемых ресурсов выгоднее оперировать простым массивом из строк и чисел, чем создавать в памяти сотни и тысячи объектов сущностей.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Orion76 5 августа 2018 в 17:52
Если необходимо отобразить список индексов, который меняется пару раз в год , то его надо доставать из кэша..
А если над этими данными соорудить кучку самопальных велосипедов в виде форм-страниц отображения данных, связей этих данных с другими сущностями, вывода этих данных во вьюсах с самопальными фильтрами и т.п. вещами, которые уже давно реализованы в Drupal для стандартных сущностей, то вот это самое и будет настоящим вредительством-)
А поддерживающий впоследствии весь этот зоопарк разработчик с первой зарплаты наймет киллера-)
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
gun_dose 5 августа 2018 в 17:58
Когда я приводил пример с почтовыми индексами, я не думал, что всё может быть так запущено)))
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Илларион 5 августа 2018 в 17:45
Задача стояла достаточно сложная, нужны были ссылки — переходы между «таблицами», некоторые таблицы бд требовалось сливать в одну, слишком большой пример нужно показывать.
НО
Я справился. грубо говоря — инклудом, закинул в папочку отдельную php файлики свои и через пхп фильтр дергаю их.
Благодарю всех за участие!
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
Orion76 5 августа 2018 в 18:00
Всё, что хорошо кончается — хорошо-)
Но Вы всетаки подтяните теорию «сборки» вэб-приложений на drupal и Drupal API.
Больше чем уверен, большинство ваших «трудных задач» решаются в пару-тройку десятков кликов-)
А как утверждают некоторые уважаемые люди: лучший код тот, который не пришлось писать.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Реакции
#5 — Выборка данных из БД. Where, Order, Limit
Для выборки данных из БД используется оператор Select. При его использовании вы можете указать какие поля необходимо выбрать. При выборе вы можеет установить условие (where), сортировку (Order) и ограничение по выборке (Limit).
Видеоурок
Команда Select
Для вывода записей из таблицы необходимо использовать команду Select . В команде указываются какие поля выбираются из таблицы, а также указывается из какой таблицы идет выборка.
-- Выбор всех записей SELECT * FROM table; -- Выбор всех записей, но лишь некоторые поля SELECT id, title FROM table; -- Выбор лишь некоторых записей SELECT * FROM table WHERE id > 6 AND id < 8;
Выборка по параметру
Для выборки лишь некоторых записей используется оператор Where . В нем указывается условие и лишь подходящие под это условие элементы будут выбраны.
SELECT * FROM table WHERE name = 'Alex'; SELECT * FROM table WHERE name = 'Alex' AND id > 88;
Сортировка
Сортировка данных происходит через команду Order By . В ней вы указываете по какому полю идет сортировка и в каком порядке она будет.
SELECT * FROM table ORDER BY id; -- Сортировка по убыванию SELECT * FROM table ORDER BY id DESC; -- Сортировка вместе с оператором Where SELECT * FROM table WHERE id > 9 ORDER BY id DESC;
Лимит по выбору
Вывод записей можно лимитировать. Для этого используйте команду Limit .
-- Вывод лишь одной записи SELECT * FROM table ORDER BY id LIMIT 1; -- Вывод 5 последних записей SELECT * FROM table ORDER BY id LIMIT 5; -- Пропуск первых 7 записей и вывод последующих 8 SELECT * FROM table ORDER BY id DESC LIMIT 7, 8;
Задание к уроку
Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
Использование типа данных MySQL BLOB для хранения изображений с PHP в Ubuntu 18.04

Большие двоичные объекты ( BLOB ) — это тип данных MySQL для хранения двоичных данных, таких как изображения, мультимедийные файлы и файлы PDF.
При создании приложений, для которых требуются тесно связанные базы данных, где изображения нужно синхронизировать с другими данными (например, портал сотрудников, база данных студентов или финансовое приложение), будет полезно хранить изображения, например, фотографии паспортов и подписей студентов, в базе данных MySQL вместе с другой связанной информацией.
Для этой цели будет полезен тип данных MySQL BLOB . Такой подход к программированию устраняет необходимость создания отдельной файловой системы для хранения изображений. Такая схема также обеспечивает централизацию базы данных, делая ее более портативной и безопасной за счет изоляции данных от файловой системы. Создавать резервные копии также будет проще, поскольку для этого достаточно будет создать один файл дампа MySQL, где будут храниться все ваши данные.
В этом обучающем модуле мы используем тип данных MySQL BLOB для сохранения изображений в коде PHP в Ubuntu 18.04.
Предварительные требования
Для выполнения этого обучающего модуля вам потребуется следующее:
- Сервер Ubuntu 18.04, настроенный в соответствии с указаниями руководства Начальная настройка сервера Ubuntu 18.04 и пользователь без прав root с привилегиями sudo .
- Apache, MySQL и PHP, установленные в соответствии с указаниями руководства «Установка комплекта Linux, Apache, MySQL, PHP (LAMP) в Ubuntu 18.04». Для этого обучающего модуля необязательно создавать виртуальные хосты, поэтому вы можете пропустить шаг 4.
Шаг 1 — Создание базы данных
Для начала создайте тестовую базу данных для своего проекта. Для этого подключитесь к серверу через SSH и запустите следующую команду для входа на сервер MySQL с привилегиями root:
Введите пароль пользователя root для вашей базы данных MySQL и нажмите ENTER , чтобы продолжить.
Затем запустите следующую команду для создания базы данных. В этом обучающем модуле мы назовем базу данных test_company :
После создания базы данных вы увидите следующее:
OutputQuery OK, 1 row affected (0.01 sec)
Затем создайте учетную запись test_user на сервере MySQL и обязательно замените PASSWORD на надежный пароль:
Вывод должен выглядеть так:
OutputQuery OK, 0 rows affected (0.01 sec)
Чтобы предоставить пользователю test_user полные права доступа к базе данных test_company , выполните команду:
Вы должны увидеть следующее:
OutputQuery OK, 0 rows affected (0.01 sec)
Очистите таблицу прав доступа, чтобы СУБД MySQL перезагрузила разрешения:
На экран должно быть выведено следующее:
OutputQuery OK, 0 rows affected (0.01 sec)
Мы подготовили базу данных test_company и пользователя test_user . Теперь мы можем перейти к созданию таблицы products для сохранения образцов продуктов. Позднее мы используем эту таблицу для вставки и получения записей, чтобы продемонстрировать работу объектов MySQL BLOB .
Выполните выход из сервера MySQL:
Снова войдите в систему под учетными данными созданного пользователя test_user :
Введите в диалоге пароль пользователя test_user и нажмите ENTER , чтобы продолжить. Переключитесь на базу данных test_company с помощью следующей команды:
После выбора базы данных test_company MySQL выведет на экран следующее:
OutputDatabase changed
Затем создайте таблицу products , запустив команду:
Эта команда создает таблицу с именем products . В таблице имеется четыре столбца:
- product_id : в этом столбце используется тип данных BIGINT , за счет чего обеспечивается поддержка больших списков продуктов, где может содержаться до 2⁶³-1 элементов. Вы пометили столбец как PRIMARY KEY для уникальной идентификации продуктов. Чтобы MySQL обрабатывала генерирование новых идентификаторов для вставленных столбцов, вы использовали ключевое слово AUTO_INCREMENT .
- product_name : в этом столбце хранятся названия продуктов. Мы использовали тип данных VARCHAR , поскольку это поле обычно обрабатывает не более 50 бувенно-числовых символов. Предел в 50 символов — это гипотетическое значение, используемое для целей этого обучающего модуля.
- price : для демонстрационных целей мы добавили в таблицу products столбец price для хранения информации о розничной цене продуктов. Поскольку некоторые продукты могут иметь значения с плавающей запятой (например, 23.69, 45.36, 102.99), мы использовали тип данных DOUBLE .
- product_image : в этом столбце данные типа BLOB используются для хранения двоичных данных изображений продуктов.
Мы использовали для таблицы InnoDB , СИСТЕМУ ХРАНЕНИЯ , поддерживающую широкий набор функций, включая транзакции MySQL. После выполнения этой команды для создания таблицы products вы увидите на экране следующее:
OutputQuery OK, 0 rows affected (0.03 sec)
Выполните выход с сервера MySQL:
Вы увидите следующее
OutputBye
Теперь таблица products готова для хранения записей, в том числе изображений продуктов, и на следующем шаге мы заполним ее продуктами.
Шаг 2 — Создание скриптов PHP для подключения к базе данных и ее заполнения
На этом шаге мы создадим скрипт PHP для подключения к базе данных MySQL, созданной нами на шаге 1. Этот скрипт подготовит три образца продуктов и вставит их в таблицу products .
Для создания кода PHP откройте новый файл в текстовом редакторе:
Введите в файл следующую информацию и замените PASSWORD паролем пользователя test_user , созданным на шаге 1:
/var/www/html/config.php
define('DB_NAME', 'test_company'); define('DB_USER', 'test_user'); define('DB_PASSWORD', 'PASSWORD'); define('DB_HOST', 'localhost'); $pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Сохраните и закройте файл.
В этом файле мы использовали четыре константы PHP для подключения к базе данных MySQL, созданной на шаге 1:
- DB_NAME : эта константа хранит название базы данных test_company .
- DB_USER : эта переменная хранит имя пользователя test_user .
- DB_PASSWORD : эта константа хранит ПАРОЛЬ MySQL для учетной записи test_user .
- DB_HOST : сервер, где располагается база данных. В данном случае мы используем сервер localhost .
Следующая строка в вашем файле инициирует объект данных PHP (PDO) и выполняет подключение к базе данных MySQL:
. $pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD); .
Ближе к концу файла мы зададим пару атрибутов PDO:
- ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION : этот атрибут предписывает PDO выдать исключение, которое можно зарегистрировать для целей отладки.
- ATTR_EMULATE_PREPARES, false : эта опция повышает безопасности, предписывая СУБД MySQL выполнять подготовку вместо PDO.
Мы добавим файл /var/www/html/config.php в два скрипта PHP для вставки и получения записей, которые мы сейчас создадим.
Вначале создайте скрипт PHP /var/www/html/insert_products.php для вставки записей в таблицу products:
Затем добавьте следующую информацию в файл /var/www/html/insert_products.php :
/var/www/html/insert_products.php
require_once 'config.php'; $products = []; $products[] = [ 'product_name' => 'VIRTUAL SERVERS', 'price' => 5, 'product_image' => file_get_contents("https://i.imgur.com/VEIKbp0.png") ]; $products[] = [ 'product_name' => 'MANAGED KUBERNETES', 'price' => 30, 'product_image' => file_get_contents("https://i.imgur.com/cCc9Gw9.png") ]; $products[] = [ 'product_name' => 'MySQL DATABASES', 'price' => 15, 'product_image' => file_get_contents("https://i.imgur.com/UYcHkKD.png" ) ]; $sql = "INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)"; foreach ($products as $product) $stmt = $pdo->prepare($sql); $stmt->execute($product); > echo "Records inserted successfully";
Сохраните и закройте файл.
Вы добавили файл config.php в верхней части файла. Это первый файл, который вы создали для определения переменных базы данных и подключения к базе данных. Также этот файл инициирует объект PDO и сохраняет его в переменной $pdo .
Далее вы создали массив данных о продуктах, которые нужно вставить в базу данных. Помимо значений product_name и price , подготовленных в виде текстовых и числовых значений соответственно, данный скрипт использует встроенную функцию PHP file_get_contents для чтения изображений из внешнего источника и передачи их в виде строк в столбец product_image .
Затем вы подготовили выражение SQL и использовали выражение PHP foreach <. >для вставки каждого продукта в базу данных.
Для выполнения файла /var/www/html/insert_products.php запустите его в окне браузера, используя следующий URL. Замените your-server-IP публичным IP-адресом вашего сервера:
http://your-server-IP/insert_products.php
После выполнения файла вы получите в браузере сообщение, подтверждающее успешную вставку записей в базу данных.

Вы успешно вставили три записи с изображениями продуктов в таблицу products . На следующем шаге мы создадим скрипт PHP для извлечения этих записей и их вывода в браузере.
Шаг 3 — Отображение информации о продуктах из базы данных MySQL
Мы разместили в базе данных информацию о продуктах и их ихображения. Теперь мы создадим еще один скрипт PHP, который будет запрашивать и выводить информацию о продуктах в таблице HTML в браузере.
Для создания файла введите следующее:
Затем введите в файл следующую информацию:
/var/www/html/display_products.php
html> title>Using BLOB and MySQLtitle> body> require_once 'config.php'; $sql = "SELECT * FROM products"; $stmt = $pdo->prepare($sql); $stmt->execute(); ?> table border = '1' align = 'center'> caption>Products Databasecaption> tr> th>Product Idth> th>Product Nameth> th>Priceth> th>Product Imageth> tr> while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) echo ''; echo '' . $row['product_id'] . ' '; echo '' . $row['product_name'] . ' '; echo '' . $row['price'] . ' '; echo '' . '
' . ' '; echo ' '; > ?> table> body> html>
Сохраните изменения в файле и закройте его.
Здесь мы опять использовали файл config.php для подключения к базе данных. Затем мы подготовили и выполнили команду SQL, используя PDO для извлечения всех элементов из таблицы products с помощью команды SELECT * FROM products .
Затем мы создали таблицу HTML и заполнили ее данными о продуктах, используя выражение PHP while() <. >. Строка $row = $stmt->fetch(PDO::FETCH_ASSOC) отправляет запрос в базу данных и сохраняет результат в переменной $row как многомерный массив, который затем отображается как столбец таблицы HTML с использованием синтаксиса $row['column_name'] .
Изображения из столбца product_image заключены в теги . Мы использовали атрибуты width и height для уменьшения ширины и высоты изображений, чтобы они поместились в столбце таблицы HTML.
Чтобы конвертировать данные, хранящиеся в объекте типа BLOB , обратно в изображения, мы использовали встроенную функцию PHP base64_encode и следующий синтаксис схемы URI данных:
data:media_type;base64, base_64_encoded_data
В данном случае image/png — это значение параметра media_type (тип файла), а закодированная строка Base64 из столбца product_image — это данные base_64_encoded_data .
Выполните в браузере файл display_products.php , введя следующий адрес:
http://your-server-IP/display_products.php
Запустив в браузере файл display_products.php , вы увидите таблицу HTML со списком продуктов и связанных с ними изображений.

Это подтверждает, что скрипт PHP для извлечения изображений из базы данных MySQL работает ожидаемым образом.
Заключение
В этом обучающем модуле мы использовали тип данных MySQL BLOB для хранения и вывода изображений в коде PHP в Ubuntu 18.04. Мы увидели основные преимущества хранения изображений в базе данных по сравнению с их хранением в файловой системе. В число этих преимуществ входят портативность, безопасность и удобство резервного копирования. Эта технология будет вам полезна, если вы создаете приложение, для которого требуется хранить информацию и изображения вместе, например, студенческий портал или базу данных сотрудников.
Дополнительную информацию о поддерживаемых типах данных в MySQL можно найти в руководстве по типам данных MySQL. Если вас интересуют дополнительные материалы по MySQL и PHP, пройдите следующие обучающие модули:
- Применение постраничного ввода данных в MySQL с PHP в Ubuntu 18.04
- Использование расширения PDO PHP для выполнения транзакций MySQL на PHP в Ubuntu 18.04
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
База данных фото с помощью HTML, PHP и MySQL
Хранение изображений в базе данных вместе с другой информацией удобно, когда в вашем приложении заявлена сильная привязка к БД. Так, синхронизировать изображения с другими данными нужно, если вы разрабатываете программу для контрольно-пропускной системы — вместе с личными данными нужно хранить ещё и фотографию для того, чтобы идентифицировать личность.
Для хранения такого контента предусмотрен специальный тип данных MySQL — BLOB. Он вмещает в себя большие двоичные данные: изображения, PDF или прочие мультимедиа-файлы.
Альтернатива использованию BLOB-типа — хранение изображений внутри файловой системы. Но в таком случае мы делаем приложение менее портативным и безопасным — появляется как минимум два тесно связанных модуля: файловая система и база данных. Кроме того, при создании резервных копий не нужно будет делать снимки каталогов системы, достаточно сохранять дампы таблиц MySQL.
В этой статье мы будем разбираться с базой данных фото на примере стека LAMP — Linux, Apache2, MySQL, PHP. Серверы с такой конфигурацией вы можете заказать на timeweb.cloud . Для работы с сервером вам понадобится пользователь с привилегиями sudo. О том, как настроить эти привилегии, читайте в статье нашего блога «Редактирование файла sudoers» .
Рассмотрим все этапы работы на примере приложения контрольно-пропускной системы вуза.
Создание базы данных
Для начала создадим базу данных для нового проекта. Можно сделать это через консоль или любой интерфейс СУБД, например, phpminiadmin. Мы воспользуемся первым вариантом.
Подключаемся к серверу через ssh и входим на сервер MySQL с привилегиями суперпользователя:
sudo mysql -u root -p
Затем запустим команду для создания базы данных. Назовём её control_access :
mysql> CREATE DATABASE control_access;
После создания увидим фразу: Query OK, 1 row affected (0.01 sec). Это значит, что база данных успешно создана, можем приступать к работе с таблицами.
Но перед этим для безопасности нужно создать отдельного пользователя, который будет работать только с этой базой. Для удобства назовём его также, как и базу данных:
mysql> CREATE USER 'control_access'@'localhost' IDENTIFIED BY 'Pas$w0rd!';
где passw0rd — ваш надёжный пароль. Теперь предоставим ему права на все операции с базой данных control_access:
mysql> GRANT ALL PRIVILEGES ON control_access.* TO 'control_access'@'localhost';
После этого нужно очистить таблицу прав доступа, чтобы MySQL применила изменения:
mysql> FLUSH PRIVILEGES;
Теперь и правда можно приступить к созданию таблиц. В нашем случае ограничимся таблицей students, в ней будем хранить информацию о студентах, их фото и права доступа. На её примере также реализуем хранение картинок в базе данных mysql.
Зайдём в MySQL из-под вновь созданного пользователя control_access:
mysql -u control_access -p
Переключаемся на ожноимённую базу данных:
mysql> USE 'control_access';
… и создаём таблицу students:
CREATE TABLE `students` (
id INT PRIMARY KEY COMMENT "Идентификатор студента",
name VARCHAR(200) NOT NULL COMMENT "ФИО студента",
access_rights ENUM ('full', 'extended', 'basic', 'denied') DEFAULT 'basic' COMMENT "Права доступа",
userpic BLOB COMMENT "Фото студента",
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT "Дата регистрации") ENGINE = InnoDB;
- id — первичный ключ таблицы, цифровой идентификатор студентов. При добавлении новых записей MySQL будет самостоятельно генерировать идентификаторы в порядке возрастания, потому что мы использовали ключевое слово AUTO_INCREMENT
- name — ФИО студента. Используем тип данных VARCHAR с ограничением 200, потому что нам не понадобится больше 200 символов для ФИО.
- access_rights — права доступа. Тип ENUM предполагает, что будет выбрано одно значение из перечня.
- userpic — фотография студента, тип данных BLOB будет хранить данные в двоичном формате
- created_at — дата создания записи. При добавлении новой записи MySQL автоматически добавит в этот столбец текущую временную метку.
Для хранения данных мы выбрали InnoDB, что позволит нам использовать широкий набор функций, например, транзакции MySQL.
Создание PHP-скриптов для заполнения БД
Таблица students готова к заполнению, теперь можно загружать туда данные. Напишем PHP-скрипт, который будет регистрировать студентов в системе и добавлять данные в `students`.
Сначала создадим конфигурационный файл с подключением к базе данных, назовём его config.php:
Для работы с базой данных используем драйвер PDO. В него передаём параметры подключения — имя базы данных, имя пользователя, пароль и адрес сервера, на котором база располагается.
Теперь создадим скрипт для наполнения нашей таблицы тестовыми данными.
Здесь мы подключились к базе данных, затем вставили в неё нужные данные. В этом скрипте наглядно понятно, как добавить картинку в базу данных sql , — нужно просто поместить её содержимое в соответствующее поле. Для получения содержимого файла мы воспользовались встроенной php-функцией file_get_contents.
Затем каждый из элементов массива в цикле вставили в базу данных с помощью выражения INSERT .
Отображение информации
Мы разместили в базе данных информацию о студентах, теперь нужно вывести данные. Для удобства мы просто отобразим всё, что есть в таблице на отдельной странице view.php.
Здесь мы снова использовали подключение к pdo, внутри файла config.php, затем запросили выборку всех студентов с помощью выражения SELECT * FROM students .
Все полученные данные вывели в таблицу HTML.
Чтобы вывести данные, хранящиеся в объекте BLOB, в браузер, мы закодировали данные в формат base64 с помощью встроенной функции php и использовали следующий синтаксис при указании источника изображения в теге img:
data:;base64, , где — тип данных, в нашем случае image/png, а — данные base64.
Заключение
В статье на учебном примере с контрольно-пропускной системой для студентов мы разобрались, как хранить изображения в базе данных, используя тип данных BLOB, и определили его основное преимущество по сравнению с хранением данных в файловой системе.
Кроме этого мы научились вставлять медиа-файлы в поля типа BLOB в MySQL, а также выводить их в браузер.
