PHP PDO Objetos grandes (LOBs)
En algún momento, una aplicación puede necesitar almacenar datos "grandes" en la base de datos.
"Grande" generalmente significa "aproximadamente 4kb o más", aunque algunas bases de datos pueden manejar fácilmente hasta 32kb de datos antes de que se consideren "grandes". Los objetos grandes pueden ser, en esencia, texto o binarios.
Usar el código de tipo PDO::PARAM_LOB en las llamadas a PDOStatement::bindParam() o PDOStatement::bindColumn()) permite a PDO usar tipos de datos grandes.
PDO::PARAM_LOB le indica a PDO que asigne los datos como un flujo, para que puedan manipularse utilizando PHP Streams API.
Mostrar una imagen desde la base de datos
El siguiente ejemplo vincula un LOB a la variable $lob y luego lo envía al navegador con fpassthru(). Como un LOB representa un flujo, funciones como fgets(), fread() y stream_get_contents() pueden usarse con él.
<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("select contenttype, imagedata from images where 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($lob);
?>
Insertar una imagen en la base de datos
El siguiente ejemplo abre un archivo y pasa el manejador de archivo a PDO para insertarlo como un LOB. PDO hace que la base de datos obtenga el contenido del archivo de la manera más eficiente posible.
<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
$id = get_new_id(); // 调用某个函数来分配一个新 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();
?>
Insertar una imagen en la base de datos: Oracle
Para insertar un LOB desde un archivo, Oracle es ligeramente diferente. La inserción debe realizarse dentro de una transacción; de lo contrario, al ejecutar la consulta, el LOB recién insertado se confirmará implícitamente con una longitud de 0:
<?php
$db = new PDO('oci:', 'scott', 'tiger');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) " .
"VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?");
$id = get_new_id(); // 调用某个函数来分配一个新 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();
?>
Otras extensiones
PHP PDO Manual de referencia