Описание: в этой статье вы узнаете, как обрабатывать 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 содержит три колонки:
Следующая инструкция 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() закрываем соединение.
PHP PDO предоставляет удобный способ работы с BLOB-данными с использованием потоков и подготовки операторов. Чтобы вставить содержимое файла в столбец BLOB, выполните следующие действия:
Смотрите следующий метод 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. Смотрите следующий метод 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:
Смотрите следующий метод 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); }
В следующих примерах мы будем использовать класс BlobDemo для сохранения изображения GIF и файла PDF в столбце BLOB в таблице files.
Сначала мы вставляем двоичные данные из файла 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'];
Следующий код вставляет содержимое файла 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-объектов.