Урок - Работа с данными больших размеров средствами PDO.

Главная » Курсы » Курс PHP5, PDO - PHP Data Objects » Урок - Работа с данными больших размеров средствами PDO.

Обучающий онлайн курс
PHP5, PDO - PHP Data Objects

Лицензия: Копирование запрещено.

Работа с данными больших размеров средствами PDO

Иногда возникает задача сохранить и/или прочитать данные "большого"(более 4Кб) размера из/в базу данных. Хотя некоторые базы данных могут работать с данными до 32Кб, прежде чем данные оказываются "большими". "Большие" данные могут быть как текстовыми так и в двоичной форме. PDO позволяет работать с данными больших размеров с помощью параметра PDO::PARAM_LOB в методе PDOStatement::bindParam() или PDOStatement::bindColumn().

PDO::PARAM_LOB указывает PDO вернуть данные в виде потока, что дает возможность манипулировать им с помощью "PHP Streams API".

Для примеров нам понадобится следующая структура таблицы:

CREATE TABLE IF NOT EXISTS `images` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image` longblob NOT NULL,
`mime` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Вставка изображений в базу данных:

$stmt = $pdo->prepare('INSERT INTO `images` (`image`, `mime`) values (?, ?)');

$stmt->bindParam(1, $image, PDO::PARAM_LOB);
$stmt->bindParam(2, $type, PDO::PARAM_STR);

// вариант 1
$image = file_get_contents('image.jpg');
$type = 'image/jpeg';
$stmt->execute();

// вариант 2
$image = fopen('image.jpg', 'rb');
$type = 'image/jpeg';
$stmt->execute();

Первой командой подгатавливаем запрос.

Второй и третьей командой назначаем параметрам переменные.

Обратите внимание, что в первом варианте вставки мы передаем в переменную $image содержимое файла. во втором же случае передаем дескриптор файла.

Теперь рассмотрим извлечение изображения из базы данных.

$stmt = $pdo->prepare("SELECT `mime`, `image` FROM `images` WHERE id=?");
$stmt->execute(array(1));
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
$stmt->bindColumn(2, $image, PDO::PARAM_LOB);
$stmt->fetch();

header('Content-Type: '.$type);
header("Content-Length: " . strlen($image));
echo $image;

В первой части - подготавливаем запрос, передаем аргумент "1", назначаем переменные параметрам вывода, получаем данные в назначенные переменные.

С помощью функции header() отправляем заголовки для корректного отображения изображения в браузере.