mirror of
https://github.com/php/doc-es.git
synced 2026-04-23 07:08:17 +02:00
2774b03765
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@338394 c90b9560-bf6c-de11-be94-00142212c4b1
138 lines
4.6 KiB
XML
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
|
|
-->
|
|
|