В какой-то момент приложению может потребоваться сохранить «большие» данные в базе данных.
«Большой» обычно означает «около 4 КБ или более», хотя некоторые базы данных могут легко обрабатывать до 32 КБ данных, прежде чем данные достигнут «большого размера». Большие объекты могут быть текстовыми или двоичными по своей природе.
Используйте код типа PDO::PARAM_LOB в вызове PDOStatement::bindParam() или PDOStatement::bindColumn()), чтобы разрешить PDO использовать большие типы данных.
PDO::PARAM_LOB сообщает PDO отображать данные в виде потока, чтобы ими можно было манипулировать с помощью PHP Streams API.
В следующем примере LOB привязывается к переменной $lob, а затем используется fpassthru() для отправки его в браузер. Поскольку объект LOB представляет поток, к нему можно использовать такие функции, как fgets(), fread() иstream_get_contents().
<?php$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');$stmt = $db->prepare("выберите тип контента, данные изображения из изображений, где id=?");$stmt- >execute(array($_GET['id']));$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);$stmt->fetch(PDO::FETCH_BOUND);header("Content-Type: $type");fpassthru ($лоб);?>
В следующем примере открывается файл и передается дескриптор файла в PDO для вставки как LOB. PDO позволяет базе данных получать содержимое файла наиболее эффективным способом.
<?php$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');$stmt = $db->prepare("вставить в изображения (id, contenttype, imagedata) значения (?, ?, ?)");$id = get_new_id(); // Вызов функции для присвоения нового идентификатора // Предположим, что загрузка файла обработана // Это можно сделать в PHP Дополнительную информацию можно найти в документации $fp = fopen($_FILES['file']['tmp_name'], 'rb');$stmt->bindParam(1, $id);$stmt->bindParam(2, $ _FILES['file']['type']);$stmt->bindParam(3, $fp, PDO::PARAM_LOB);$db->beginTransaction();$stmt->execute();$db->commit();?>
Oracle немного отличается от вставки объекта из файла. Вставки должны выполняться после транзакции, иначе вновь вставленный LOB будет неявно зафиксирован с нулевой длиной при выполнении запроса:
<?php$db = new PDO('oci:', 'scott', 'tiger');$stmt = $db->prepare("вставить в изображения (id, contenttype, imagedata) " .VALUES (?, ?, EMPTY_BLOB()) ВОЗВРАЩАЕМ данные изображения В ?");$id = get_new_id(); // Вызов функции для присвоения нового идентификатора // Предположим, что мы обрабатываем загрузку файла // Дополнительную информацию можно найти в документации PHP $fp = fopen($_FILES['file']['tmp_name'], 'rb');$stmt->bindParam(1, $id ) ;$stmt->bindParam(2, $_FILES['file']['type']);$stmt->bindParam(3, $fp, PDO::PARAM_LOB);$stmt->beginTransaction();$stmt->execute();$stmt->commit();?>