PHP PDO Objetos grandes (LOBs)

PHP PDO 参考手册PHP PDO Manual de referencia

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();
?>

PHP PDO 参考手册PHP PDO Manual de referencia

Otras extensiones