Files
archived-doc-pt-br/reference/pdo/lobs.xml
Leonardo Lara Rodrigues 4d3b1c552b fix translations and typos
2025-08-05 08:39:22 -03:00

136 lines
4.5 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: eae19eb5fe0f5bebcbce382ea7a505cedeb5a883 Maintainer: fernandowobeto Status: ready --><!-- CREDITS: fernandowobeto -->
<chapter xml:id="pdo.lobs" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Objetos Grandes (LOBs)</title>
<para>
Em algum momento da aplicação, pode ser necessário armazenar
dados "grandes" em seu banco de dados. Grande geralmente significa "cerca de 4kb ou
mais", embora alguns bancos de dados possam lidar facilmente com até 32kb antes que os dados se tornem
"grandes". Objetos grandes podem ser de natureza textual ou binária. O PDO
permite que se trabalhe com esse tipo de dado grande usando o
código de tipo <constant>PDO::PARAM_LOB</constant>
nas chamadas a <methodname>PDOStatement::bindParam</methodname> ou
<methodname>PDOStatement::bindColumn</methodname>.
<constant>PDO::PARAM_LOB</constant> diz
ao PDO para mapear os dados como um fluxo, para que seja possível manipulá-los usando a
<link linkend="ref.stream">API de Fluxos do PHP</link>.
</para>
<para>
<example>
<title>Exibindo uma imagem de um banco de dados</title>
<para>
Este exemplo vincula o LOB à variável chamada $lob e depois o envia
para o navegador usando <function>fpassthru</function>. Como o LOB
é representado como um fluxo, funções como
<function>fgets</function>, <function>fread</function> e
<function>stream_get_contents</function> podem ser usadas nele.
</para>
<programlisting role="php">
<![CDATA[
<?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);
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Inserindo uma imagem em um banco de dados</title>
<para>
Este exemplo abre um arquivo e passa o identificador do arquivo para o PDO para inserir
como um LOB. O PDO fará o melhor possível para obter o conteúdo do arquivo até
o banco de dados da maneira mais eficiente possível.
</para>
<programlisting role="php">
<![CDATA[
<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
$id = get_new_id(); // uma função para alocar um novo ID
// suponha que estamos executando como parte de um formulário de upload de arquivo
// Mais informações podem ser encontradas na documentação do 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();
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Inserindo uma imagem em um banco de dados: Oracle</title>
<para>
O Oracle requer uma sintaxe ligeiramente diferente para inserir um lob de um
arquivo. Também é essencial que você execute a inserção sob um
transação, caso contrário, seu LOB recém-inserido será comprometido com um
comprimento zero como parte do commit implícito que ocorre quando a consulta
é executada:
</para>
<programlisting role="php">
<![CDATA[
<?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(); // uma função para alocar um novo ID
// suponha que estamos executando como parte de um formulário de upload de arquivo
// Mais informações podem ser encontradas na documentação do 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();
?>
]]>
</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
-->