Files
doc-fr/reference/pdo/lobs.xml
2022-06-28 12:31:03 +01:00

139 lines
4.5 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: eae19eb5fe0f5bebcbce382ea7a505cedeb5a883 Maintainer: yannick Status: ready -->
<!-- Reviewed: yes -->
<chapter xml:id="pdo.lobs" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Les gros objets (LOB)</title>
<para>
À un moment dans votre application, vous pourriez avoir besoin de stocker de
grosses données dans votre base de données. « Gros » signifie typiquement
des données d'environ 4 ko ou plus, bien que certaines bases de données peuvent
gérer plus de 32 ko avant que les données deviennent « grosses ». Les gros objets
peuvent être de nature textuelle ou binaire. PDO vous permet de travailler
avec ce type de grosses données en utilisant le code type
<constant>PDO::PARAM_LOB</constant> dans vos appels aux fonctions
<methodname>PDOStatement::bindParam</methodname> ou
<methodname>PDOStatement::bindColumn</methodname>.
<constant>PDO::PARAM_LOB</constant> demande à PDO de transformer les données
en un flux que vous pourrez manipuler en utilisant
l'<link linkend="ref.stream">API PHP des flux</link>.
</para>
<para>
<example>
<title>Affichage d'une image depuis une base de données</title>
<para>
Cet exemple lie un LOB dans une variable nommée $lob et l'envoie
au navigateur en utilisant la fonction <function>fpassthru</function>.
Étant donné qu'un LOB est représenté en un flux, les fonctions comme
<function>fgets</function>, <function>fread</function> et
<function>stream_get_contents</function> peuvent être utilisées sur ce flux.
</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>Insertion d'une image dans une base de données</title>
<para>
Cet exemple ouvre un fichier et passe le pointeur de fichier à PDO
pour l'insérer en tant que LOB. PDO fera son possible pour récupérer
le contenu du fichier et l'insérer dans la base de données de la
manière la plus efficace possible.
</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(); // fonction pour allouer un nouvel ID
// assumons que nous récupérons un fichier depuis un formulaire
// vous pouvez trouver plus de détails dans la documentation de 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>Insertion d'une image dans une base de données Oracle</title>
<para>
Oracle requiert une syntaxe légèrement différente pour y insérer un LOB
depuis un fichier. Il est également essentiel d'effectuer votre insertion
au sein d'une transaction, sinon, votre nouveau LOB sera inséré
avec une longueur de zéro :
</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(); // fonction pour allouer un nouvel ID
// assumons que nous récupérons un fichier depuis un formulaire
// vous pouvez trouver plus de détails dans la documentation de 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
-->