1
0
mirror of https://github.com/php/doc-es.git synced 2026-04-23 07:08:17 +02:00
Files
archived-doc-es/reference/pdo/lobs.xml
T
Pedro Antonio Gil Rodríguez 2774b03765 Actualización a la última versión
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@338394 c90b9560-bf6c-de11-be94-00142212c4b1
2016-01-02 13:01:17 +00:00

138 lines
4.6 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: a1772e86ca91b72001b0875c73c314574cb7526d Maintainer: seros Status: ready -->
<!-- Reviewed: yes Maintainer: seros -->
<chapter xml:id="pdo.lobs" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Objetos grandes (LOB)</title>
<para>
En algún momento, una aplicación podría necesitar 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 objetos grandes, o LOB (acrónimo en inglés de 'Large OBjects'), pueden ser de texto o binarios.
PDO permite trabajar con este tipo de datos grandes utilizando el código del tipo
<constant>PDO::PARAM_LOB</constant>
en llamadas a <function>PDOStatement::bindParam</function> o
<function>PDOStatement::bindColumn</function>.
<constant>PDO::PARAM_LOB</constant> indica a
PDO que haga corresponder los datos como un flujo, pudiendo manipularlos así utilizando la
<link linkend="ref.stream">API de flujos de PHP</link>.
</para>
<para>
<example>
<title>Mostrar una imagen desde una base de datos</title>
<para>
Este ejemplo vincula un LOB a una variable llamada $lob, y luego lo envía
al navegador usando <function>fpassthru</function>. Ya que el LOB
está representado como un flujo, se pueden emplear funciones tales como
<function>fgets</function>, <function>fread</function> y
<function>stream_get_contents</function> para manejarlo.
</para>
<programlisting role="php">
<![CDATA[
<?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);
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Insertar una imagen en una base de datos</title>
<para>
Este ejemplo abre un fichero y pasa el manejador 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.
</para>
<programlisting role="php">
<![CDATA[
<?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 subida 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();
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Insertar una imagen en una base de datos: Oracle</title>
<para>
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:
</para>
<programlisting role="php">
<![CDATA[
<?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 subida 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();
?>
]]>
</programlisting>
</example>
</para>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->