Как хранить массив в mysql
Перейти к содержимому

Как хранить массив в mysql

Получение строки данных в виде массива. Функции mysqli_fetch_array() (или mysql_fetch_array())

Функция mysqli_fetch_array() (mysql_fetch_array()) используется для получения одной строки из результирующего набора, которую она помещает в массив. При этом можно получить как ассоциативный массив, так и массив с числовыми индексами. Кроме того, можно вернуть сразу оба типа массива, передав соответствующий параметр.

Так как функция mysql_fetch_array() сейчас является устаревшей и имеет статус «depricated», то рекомендуется в коде использовать ее модификацию — mysqli_fetch_array(). При этом разницы в использовании практически нет никакой.

Данную функцию можно использовать в «объектно-ориентированном» или «процедурном» стиле. Рассмотрим сначала «объектно-ориентированный» стиль. Допустим у нас имеется база данных «my_dbbase», в которой есть таблица «users». Из нее нам необходимо достать 10 строк (id пользователя и его имя) и вывести эти данные построчно:

В данном примере мы использовали константу MYSQLI_ASSOC, чтобы получить данные в виде ассоциативного массива. Ключом при этом будет является название колонки в таблице. Если же нам нужен обычный массив с числовыми ключами, то можно использовать константу MYSQLI_NUM:

Но в большинстве случаев использование ассоциативного массива все же более оправдано, т.к. код при этом становится более читабельным (мы четко видим, какой элемент мы используем). Единственное, о чем здесь нужно помнить, что если вы делаете выборку из нескольких таблиц одним запросом, то в случае совпадения имен колонок, они будут перетираться. В этом случае целесообразно использовать алиасы для колонок.

Существует и второй способ использования функции mysqli_fetch_array — процедурный:

Каждый раз, когда мы выполняем

, то в $row помещается новая строка из выборки, а указатель в результирующей выборке при этом смещается на следующую строку. Таким образом, мы можем пройтись по всем строкам.

Как хранить изображения в MySQL с помощью BLOB

BLOB (или Binary Large Object, большой двоичный объект) – это тип данных MySQL, который позволяет хранить двоичные данные: изображения, мультимедиа и файлы PDF.

Хранить изображения (такие как фотографии и подписи) в базе данных MySQL вместе с другой информацией удобно в том случае, если вы разрабатываете приложения с сильной привязкой к БД (например, портал поиска работы, база данных студентов или финансовое приложение), и в этой БД изображения должны быть синхронизированы с другими данными.

И тогда на помощь приходит тип данных BLOB. Этот подход устраняет необходимость в создании отдельной файловой системы для хранения изображений, а также централизует базу данных, делая ее более портативной и надежной, поскольку данные изолированы от файловой системы. А еще это упрощает создание резервных копий, поскольку вы можете создать один дамп MySQL, содержащий все ваши данные.

Извлечение данных обрабатывается быстрее, а при создании новых записей вы можете быть уверены, что правила проверки данных и ссылочная целостность четко соблюдены (особенно при использовании транзакций MySQL).

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

Требования

  • Сервер Ubuntu 18.04, предварительно настроенный согласно этим инструкциям.
  • Стек LAMP, установленный на вашем сервере. С установкой вам поможет этот мануал (раздел о виртуальных хостах можно пропустить, здесь мы не будем их использовать).

1: Создание базы данных

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

sudo mysql -u root -p

Введите root-пароль базы данных MySQL и нажмите Enter, чтобы продолжить.

После этого выполните следующую команду, чтобы создать базу данных. В этом руководстве мы назовем ее test_company:

CREATE DATABASE test_company;

После создания БД вы увидите следующее:

Query OK, 1 row affected (0.01 sec)

Теперь нам нужно создать на сервере MySQL учетную запись test_user; не забудьте заменить PASSWORD сложным паролем:

CREATE USER ‘test_user’@’localhost’ IDENTIFIED BY ‘PASSWORD’;

Вы получите следующий результат:

Query OK, 0 rows affected (0.01 sec)

Чтобы предоставить пользователю test_user полные права доступа к базе данных test_company, запустите команду:

GRANT ALL PRIVILEGES ON test_company.* TO ‘test_user’@’localhost’;

Вы должны получить следующий результат:

Query OK, 0 rows affected (0.01 sec)

В завершение нужно сбросить таблицы привилегий, чтобы MySQL перезагрузил права:

На экране должно появиться:

Query OK, 0 rows affected (0.01 sec)

Теперь, когда база данных test_company и пользователь test_user готовы, мы можем перейти к созданию таблицы. Предположим, нам нужна таблица products для хранения списка товаров. Позже мы попробуем вставить и извлечь данные из этой таблицы, чтобы понять, как работает BLOB в MySQL.

Выйдите из оболочки MySQL:

Затем снова войдите в систему, на этот раз – как пользователь test_user:

mysql -u test_user -p

При появлении запроса введите пароль test_user и нажмите Enter, чтобы продолжить. Затем откройте базу данных test_company, набрав команду:

Перейдя в базу данных test_company, MySQL отобразит такой результат:

Затем создайте таблицу products:

CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

Эта команда создаст таблицу по имени products. В таблице будет четыре столбца:

  • product_id: в этом столбце используется тип данных BIGINT, он позволяет вместить большой список продуктов, содержащий 2⁶³-1 элементов. Мы пометили столбец как PRIMARY KEY, чтобы присвоить товарам уникальные идентификаторы. Чтобы MySQL мог обрабатывать создание новых идентификаторов, мы использовали ключевое слово AUTO_INCREMENT.
  • product_name: этот столбец содержит названия товаров. Здесь мы использовали тип данных VARCHAR, так как это поле обычно обрабатывает буквенно-цифровые значения длиной до 50 символов; ограничение в 50 символов – это всего лишь гипотетическое значение, используемое для целей этого руководства.
  • price: этот столбец содержит розничные цены наших товаров. Поскольку цена на некоторые товары может выражаться числом с плавающей точкой (например, 23.69, 45.36, 102.99), мы указали здесь тип данных DOUBLE.
  • product_image: в этом столбце мы указали тип данных BLOB, поскольку он предназначен для хранения двоичных данных – изображений товаров.

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

Query OK, 0 rows affected (0.03 sec)

Выйдите из сервера MySQL:

Вы получите сообщение:

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

2: Создание PHP-скрипта для заполнения базы данных

На этом этапе мы создадим сценарий PHP, который будет подключаться к базе данных MySQL, созданной в первом разделе руководства. Сценарий подготовит три записи о товарах и вставит их в таблицу products.

Чтобы создать PHP-скрипт, откройте новый файл в текстовом редакторе:

sudo nano /var/www/html/config.php

Затем вставьте в него следующую информацию (замените PASSWORD паролем test_user, который вы создали в разделе 1):

<?php

$pdo = new PDO(«mysql:host=» . DB_HOST . «; dbname https://i.imgur.com/VEIKbp0.png»)

‘product_name’ => ‘MANAGED KUBERNETES’,

‘product_name’ => ‘MySQL DATABASES’,

$sql = «INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)»;

foreach ($products as $product) <

echo «Records inserted successfully»;

Сохраните и закройте файл.

Этот файл нужен для определения переменных базы данных и подключения к ней. Файл также инициирует объект PDO и сохраняет его в переменной $pdo. Мы ссылаемся на файл config.php вверху.

Затем мы создали массив данных о товарах, которые нужно вставить в БД. Помимо product_name и price, которые заданы в виде строк и числовых значений соответственно, сценарий использует встроенную функцию PHP file_get_contents для чтения изображений из внешнего источника и передачи их в виде строк в столбец product_image.

После этого мы подготовили оператор SQL и использовали оператор PHP foreach <…>для вставки каждого продукта в базу данных.

Запустите /var/www/html/insert_products.php в окне браузера, используя следующий URL-адрес (не забудьте заменить your-server-IP внешним IP-адресом сервера):

На экране вы увидите сообщение об успешном выполнении файла – следовательно, записи были вставлены в базу данных.

Records inserted successfully

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

3: Извлечение и визуализация данных из БД MySQL

Имея ​в базе данных информацию и изображения товаров, вы можете написать второй сценарий PHP, который будет запрашивать и отображать данные в таблице HTML в браузере.

Чтобы создать файл, введите:

sudo nano /var/www/html/display_products.php

Затем вставьте в файл следующее:

<title>Using BLOB and MySQL</title>

<?php

$sql = «SELECT * FROM products»;

<table border = ‘1’ align = ‘center’> <caption>Products Database</caption>

<?php

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) <

‘<img src = «data:image/png;base64,’ . base64_encode($row[‘product_image’]) . ‘» width = «50px» height = «50px»/>’

Сохраните изменения в файле и закройте его.

Мы снова сослались на файл config.php для подключения к базе данных. Затем мы с помощью PDO создали и выполнили оператор SQL для извлечения всех элементов из таблицы; это делается при помощи команды SELECT * FROM products.

Затем мы создали таблицу HTML и заполнили ее данными о товарах с помощью PHP-оператора while() <…>. Строка $row = $stmt->fetch(PDO::FETCH_ASSOC) запрашивает БД и сохраняет результат в переменной $row в виде многомерного массива, который затем отображается в столбце таблицы HTML с помощью $row[‘column_name’].

Изображения из столбца product_image заключены в теги <img src = “”>. Мы задали атрибуты ширины и высоты, чтобы уменьшить размер изображений (иначе бы они не поместились в столбце таблицы HTML).

Чтобы преобразовать данные, содержащиеся в типе BLOB, обратно в изображения, мы использовали встроенную PHP функцию base64_encode и следующий синтаксис для схемы Data URI:

В этом случае image/png – это media_type, а строка в кодировке Base64 из столбца product_image – это base_64_encoded_data.

Запустите файл display_products.php в веб-браузере:

После запуска файла display_products.php вы увидите в браузере HTML-таблицу со списком товаров и их изображениями.

Это значит, что наш сценарий PHP правильно извлекает и визуализирует изображения и другие данные MySQL.

Заключение

В этом руководстве вы научились использовать тип данных BLOB для хранения и отображения картинок с помощью PHP. Вы также на практике увидели основные преимущества хранения изображений в базе данных (по сравнению с их хранением в файловой системе). Среди главных преимуществ: портативность, безопасность и простота резервного копирования. Если вы создаете приложение, которое требует, чтобы данные и связанные с ними изображения хранились вместе, то эта технология может быть очень вам полезна.

За дополнительной информацией о поддерживаемых типах данных в MySQL обращайтесь сюда. Если вам нужны дополнительные инструкции о связке MySQL и PHP, ознакомьтесь со следующими руководствами:

Форум Херсона. Форум Херсонской молодежи, флейм, фотографии Херсона, политика в Херсоне, сетевой форум, сети Херсона

На данный момент Вы находитесь на форуме как Гость и имеете очень ограниченные возможности и права. Что бы писать или отвечать в темах, загружать картинки, файлы на форуме Вам нужно зарегистрироваться, что совершенно бесплатно. Регистрация очень быстрая, не откладывайте эту процедуру!

Активные темы (За последние xx минут)
15 Минут 30 Минут 45 Минут
Активные темы (За последние xx часов)
1 Час 2 Часа 4 Часа
6 Часов 12 Часов 18 Часов
Активные темы (За последние xx дней)
1 День 2 Дня 3 Дня
4 Дня 7 Дней 14 Дней
Темы без ответов

Программирование Все вопросы по написанию программ

К странице.

Вопрос к веб-гуру)

Задача состоит в следующем.
Для хранения данных о товаре будут использованы две таблицы MySQL. Одна — для хранения характеристик товара, другая — для хранения фотографий этого товара.
НО. Фотографий к каждому товару будет неопределенное количество.

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

В первом случае будет огромное количество строк в таблице, во втором — неудобства с обработкой массива.

Какой из вариантов более оптимальный и почему? Может есть ещё какие-то идеи?

Вопрос к веб-гуру)

Задача состоит в следующем.
Для хранения данных о товаре будут использованы две таблицы MySQL. Одна — для хранения характеристик товара, другая — для хранения фотографий этого товара.
НО. Фотографий к каждому товару будет неопределенное количество.

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

В первом случае будет огромное количество строк в таблице, во втором — неудобства с обработкой массива.

Какой из вариантов более оптимальный и почему? Может есть ещё какие-то идеи?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *