En algún punto de una aplicación, podría ser necesario almacenar
datos "grandes" en la base de datos. Grande típicamente significa "alrededor de 4kb o
más", aunque algunas bases de datos pueden manejar fácilmente hasta 32kb antes de que
los datos se consideren "grandes". Los LOBs (acrónimo de 'Large Objects') pueden ser de texto o binarios.
PDO permite trabajar con este tipo de datos grandes usando el código del tipo
PDO::PARAM_LOB
en llamadas a PDOStatement::bindParam() o
PDOStatement::bindColumn().
PDO::PARAM_LOB
indica a
PDO que haga corresponder los datos como un flujo, por lo que se pueden manipular usando la
API de flujos de PHP.
Ejemplo #1 Mostrar una imagen desde una base de datos
Este ejemplo vincula un LOB a una variable llamada $lob, y luego lo envía al navegador usando fpassthru(). Ya que el LOB está representado como un flujo, se pueden usar funciones tales como fgets(), fread() y stream_get_contents() para manejarlo.
<?php
$bd = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$sentencia = $bd->prepare("select contenttype, imagedata from images where id=?");
$sentencia->execute(array($_GET['id']));
$sentencia->bindColumn(1, $tipo, PDO::PARAM_STR, 256);
$sentencia->bindColumn(2, $lob, PDO::PARAM_LOB);
$sentencia->fetch(PDO::FETCH_BOUND);
header("Content-Type: $tipo");
fpassthru($lob);
?>
Ejemplo #2 Insertar una imagen en una base de datos
Este ejemplo abre un fichero y pasa el gestor del fichero a PDO para insertarlo como un LOB. PDO hará todo lo posible para enviar el contenido del fichero a la base de datos de la manera más eficiente.
<?php
$bd = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$sentencia = $bd->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
$id = get_new_id(); // alguna función para asignar un nuevo ID
// se asume que se está ejecutando como parte de un formulario de subidas de ficheros
// Se puede encontrar más información en la documentación de PHP
$fp = fopen($_FILES['file']['tmp_name'], 'rb');
$sentencia->bindParam(1, $id);
$sentencia->bindParam(2, $_FILES['file']['type']);
$sentencia->bindParam(3, $fp, PDO::PARAM_LOB);
$bd->beginTransaction();
$sentencia->execute();
$bd->commit();
?>
Ejemplo #3 Insertar una imagen en una base de datos: Oracle
Oracle requiere una sintaxis ligeramente diferente para insertar un LOB desde un fichero. También es esencial que se realice la inserción bajo una transacción, si no, el LOB recién insertado será consignado con una longitud cero como parte de la consigna implícita que ocurre cuando la consulta se ejecuta:
<?php
$bd = new PDO('oci:', 'scott', 'tiger');
$sentencia = $bd->prepare("insert into images (id, contenttype, imagedata) " .
"VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?");
$id = get_new_id(); // alguna función para asignar un nuevo ID
// se asume que se está ejecutando como parte de un formulario de subidas de ficheros
// Se puede encontrar más información en la documentación de PHP
$fp = fopen($_FILES['file']['tmp_name'], 'rb');
$sentencia->bindParam(1, $id);
$sentencia->bindParam(2, $_FILES['file']['type']);
$sentencia->bindParam(3, $fp, PDO::PARAM_LOB);
$sentencia->beginTransaction();
$sentencia->execute();
$sentencia->commit();
?>