PDO – Les Objets Larges (LOBs)

Stocker de larges données dans votre base

À un moment donné, dans votre application, vous pourriez avoir besoin de stocker de larges données dans votre base. « Large » signifie typiquement des données  d’environ 4ko ou plus, bien que certaines bases de données puissent gérer plus de 32ko avant que les données deviennent « larges ». Les objets larges peuvent être textuels ou binaires. PDO vous permet de travailler avec ce type de données larges en utilisant PDO:: PARAM_LOB dans vos appels aux méthodes PDOStatement->bindParam () ou PDOStatement bindColumn (). PDO:: PARAM_LOB demande à PDO de mapper les données en un flux que vous pourrez manipuler en utilisant l’API PHP sur les flux.

Exemple#12 Affichage d’une image à partir d’une base de données

Cet exemple lie un LOB (Objet Large) dans une variable nommée $lob et l’envoie au navigateur en utilisant fpassthru(). Étant donné qu’un LOB est représenté comme un flux, les fonctions comme fgets(), fread() et stream_get_contents() peuvent être utilisées sur celui-ci.

$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);

Exemple#13 Insertion d’une image dans une base de données

Cet exemple ouvre un fichier et transmet le dossier à PDO pour l’insérer en tant que LOB. PDO fera son possible pour insérer le contenu du fichier dans la base de données de la manière la plus efficace possible.

$db = new PDO(‘odbc:SAMPLE’, ’db2inst1′, ’ibmdb2′);
$stmt = $db->prepare(« insert into images (id, contenttype, imagedata) values (?, ?, ?) »);
$id = get_new_id(); // fonction qui alloue un nouvel ID// Suppose qu’un fichier a été uploadé
// Pour plus d’informations à ce sujet, se reporter à 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();

Exemple#14 Insertion d’une image dans une base de données Oracle

Oracle requiert une syntaxe légèrement différente pour y insérer un LOB depuis un fichier. Il est également essentiel que vous effectuiez l’insertion dans le cadre d’une transaction, sinon votre LOB nouvellement inséré aura une longueur zéro lors du commit implicite qui se passe lorsque la requête est exécutée:

$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 qui alloue un nouvel ID// Suppose qu’un fichier a été uploadé
// Pour plus d’informations à ce sujet, se reporter à 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);

$stmt->beginTransaction();
$stmt->execute();
$stmt->commit();