Ложное знание опаснее невежества (Б. Шоу).

PHP MySQL. BLOB

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 5,00 из 5)
Загрузка...
23.07.2019
PHP MySQL

Описание: в этой статье вы узнаете, как обрабатывать 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

 

PHP MySQL BLOB с файлами PDF

Следующий код вставляет содержимое файла pdf/php-mysql-blob.pdf с расширением PDF в столбец BLOB:

$blobObj = new BlobDemo();

// тестирование вставки pdf
$blobObj->insertBlob('pdf/php-mysql-blob.pdf',"application/pdf");

 

PHP MySQL. BLOB

 

Затем мы можем выбрать данные PDF и отобразить их в веб-браузере следующим образом:

$a = $blobObj->selectBlob(2);
header("Content-Type:" . $a['mime']);
echo $a['data'];

 

PHP MySQL. BLOB

 

Чтобы заменить файл 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-объектов.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

4 комментариев

Новичок 27.08.2020 от 11:31

Спасибо большое.

андрей 11.04.2021 от 19:43

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: Узел выключен

    AndreyEx 12.04.2021 от 0:08

    вполне возможно автоматически не запустился демон, попробуйте:
    systemctl start mariadb

Denis 09.01.2022 от 15:09

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:~#

Оставить комментарий

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

Загрузка...

Спасибо!

Теперь редакторы в курсе.

Прокрутить страницу до начала