PHP MySQL. BLOB

Описание: в этой статье вы узнаете, как обрабатывать BLOB-данные с помощью PHP PDO. Мы покажем вам, как вставлять, обновлять и выбирать BLOB-данные в базах данных MySQL.
Иногда по соображениям безопасности вам может потребоваться сохранить большие объекты данных, например изображения, файлы PDF и видео, в базе данных MySQL.
MySQL предоставляет тип BLOB, который может содержать большой объем данных. BLOB обозначает двоичный большой объект данных. Максимальное значение объекта BLOB определяется доступной памятью и размером пакета связи. Вы можете изменить размер коммуникационного пакета, используя переменную max_allowed_packet в MySQL и post_max_size в настройках PHP.
Давайте посмотрим, как PHP PDO обрабатывает тип BLOB в MySQL.
Сначала мы создаем новую таблицу с именем files в примере базы данных для практики.
Таблица files содержит три колонки:
- Столбец id — это первичный ключ , столбец автоинкремента.
- Столбец MIME хранит тип файла MIME.
- Столбец данных с типом данных BLOB, который используется для хранения содержимого файла.
Следующая инструкция CREATE TABLE создает таблицу files:
REATE TABLE files ( id INT AUTO_INCREMENT PRIMARY KEY, mime VARCHAR (255) NOT NULL, data BLOB NOT NULL );
<?php
/** * PHP MySQL. Демонстрация BLOB */ class BobDemo { const DB_HOST = 'localhost'; const DB_NAME = 'classicmodels'; const DB_USER = 'root'; const DB_PASSWORD = ''; /** * Откройте соединение с базой данных */ public function __construct() { // open database connection $conStr = sprintf("mysql:host=%s;dbname=%s;charset=utf8", self::DB_HOST, self::DB_NAME); try { $this->pdo = new PDO($conStr, self::DB_USER, self::DB_PASSWORD); // PHP 5.3.6 //$conn->exec("set names utf8"); } catch (PDOException $e) { echo $e->getMessage(); } } /** * закройте соединение с базой данных */ public function __destruct() { // close the database connection $this->pdo = null; } }
Во-вторых, мы определяем класс, вызываемый BlobDemo с помощью следующего кода:
В методе __construct() мы открываем соединение базы данных с базой данных MySQL , а в методе __destruct() закрываем соединение.
Вставка BLOB-данных в базу данных
PHP PDO предоставляет удобный способ работы с BLOB-данными с использованием потоков и подготовки операторов. Чтобы вставить содержимое файла в столбец BLOB, выполните следующие действия:
- Сначала откройте файл для чтения в двоичном режиме.
- Во-вторых, создайте оператор INSERT.
- В-третьих, свяжите дескриптор файла с подготовленным оператором, используя метод bindParam(), и вызовите метод execute() для выполнения запроса.
Смотрите следующий метод insertBlob():
/** * вставка большого двоичного объекта в таблицу файлов * @param string $filePath * @param string $mime mimetype * @return bool */ public function insertBlob($filePath, $mime) { $blob = fopen($filePath, 'rb'); $sql = "INSERT INTO files(mime,data) VALUES(:mime,:data)"; $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':mime', $mime); $stmt->bindParam(':data', $blob, PDO::PARAM_LOB); return $stmt->execute(); }
Обратите внимание, что команда PDO::PARAM_LOB инструктирует PDO отображать данные в виде потока.
Обновить существующий столбец BLOB
Чтобы обновить столбец BLOB, используйте тот же метод, который описан при вставке данных в столбец BLOB. Смотрите следующий метод updateBlob():
/** * обновите таблицу файлов с помощью нового большого двоичного объекта из указанного файла * by the filepath * @param int $id * @param string $filePath * @param string $mime * @return bool */ function updateBlob($id, $filePath, $mime) { $blob = fopen($filePath, 'rb'); $sql = "UPDATE files SET mime = :mime, data = :data WHERE id = :id;"; $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':mime', $mime); $stmt->bindParam(':data', $blob, PDO::PARAM_LOB); $stmt->bindParam(':id', $id); return $stmt->execute(); }
Запрос данных из столбца BLOB
Следующие шаги описывают, как выбрать данные из столбца BLOB:
- Сначала создайте оператор SELECT .
- Во-вторых, свяжите соответствующий параметр, используя метод bindColumn() объекта PDOStatement.
- В-третьих, выполнить заявление.
Смотрите следующий метод selectBlob():
/** * выберите данные из файлов * @param int $id * @return массив содержит данные типа mime и BLOB */ public function selectBlob($id) { $sql = "SELECT mime, data FROM files WHERE id = :id;"; $stmt = $this->pdo->prepare($sql); $stmt->execute(array(":id" => $id)); $stmt->bindColumn(1, $mime); $stmt->bindColumn(2, $data, PDO::PARAM_LOB); $stmt->fetch(PDO::FETCH_BOUND); return array("mime" => $mime, "data" => $data); }
PHP MySQL BLOB примеры
В следующих примерах мы будем использовать класс BlobDemo для сохранения изображения GIF и файла PDF в столбце BLOB в таблице files.
PHP MySQL BLOB с файлами изображений
Сначала мы вставляем двоичные данные из файла images/php-mysql-blob.gif в столбец BLOB таблицы files следующим образом:
$blobObj = new BlobDemo(); // тестирование вставки gif рисунока $blobObj->insertBlob('images/php-mysql-blob.gif',"image/gif");
Затем мы можем выбрать данные BLOB и отобразить их в виде изображения GIF:
$a = $blobObj->selectBlob(1); header("Content-Type:" . $a['mime']); echo $a['data'];
PHP MySQL BLOB с файлами PDF
Следующий код вставляет содержимое файла pdf/php-mysql-blob.pdf с расширением PDF в столбец BLOB:
$blobObj = new BlobDemo(); // тестирование вставки pdf $blobObj->insertBlob('pdf/php-mysql-blob.pdf',"application/pdf");
Затем мы можем выбрать данные PDF и отобразить их в веб-браузере следующим образом:
$a = $blobObj->selectBlob(2); header("Content-Type:" . $a['mime']); echo $a['data'];
Чтобы заменить файл PDF файлом изображения GIF, используйте метод updateBlob():
$blobObj->updateBlob(2, 'images/php-mysql-blob.gif', "image/gif"); $a = $blobObj->selectBlob(2); header("Content-Type:" . $a['mime']); echo $a['data'];
В этой статье мы показали, как управлять BLOB-данными MySQL, включая вставку, обновление и запрос BLOB-объектов.
Спасибо большое.
mariadb установилась
а потом
$ sudo systemctl status mariadb
System has not been booted with systemd as init system (PID 1). Can’t operate.
Failed to connect to bus: Узел выключен
вполне возможно автоматически не запустился демон, попробуйте:
systemctl start mariadb
root@dcload:~# apt-get install -y mariadb-server
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
libdbi-perl : Depends: perlapi-5.28.1
E: Unable to correct problems, you have held broken packages.
root@dcload:~# sudo apt install mariadb-server
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
libdbi-perl : Depends: perlapi-5.28.1
E: Unable to correct problems, you have held broken packages.
root@dcload:~#