À un moment donné, l'application peut avoir besoin de stocker des données « volumineuses » dans la base de données.
"Grand" signifie généralement "environ 4 Ko ou plus", bien que certaines bases de données puissent facilement gérer jusqu'à 32 Ko de données avant que les données n'atteignent "grandes". Les objets volumineux peuvent être de nature textuelle ou binaire.
Utilisez le code de type PDO::PARAM_LOB dans l’appel PDOStatement::bindParam() ou PDOStatement::bindColumn()) pour permettre à PDO d’utiliser des types de données volumineux.
PDO::PARAM_LOB indique à PDO de mapper les données sous forme de flux afin qu'elles puissent être manipulées à l'aide de l'API PHP Streams.
L'exemple suivant lie un LOB à la variable $lob puis l'envoie au navigateur à l'aide de fpassthru(). Étant donné qu'un LOB représente un flux, des fonctions telles que fgets(), fread() et stream_get_contents() peuvent y être utilisées.
<?php$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');$stmt = $db->prepare("sélectionnez le type de contenu, les données d'image à partir des images où 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);?>
L'exemple suivant ouvre un fichier et transmet le handle de fichier à PDO pour l'insertion en tant que LOB. PDO permet à la base de données d'obtenir le contenu des fichiers de la manière la plus efficace possible.
<?php$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');$stmt = $db->prepare("insérer dans les images (id, contenttype, imagedata) valeurs (?, ?, ?)");$id = get_new_id(); // Appeler une fonction pour attribuer un nouvel ID // Supposons qu'un téléchargement de fichier soit traité // Cela peut être fait en PHP Plus d'informations trouvées dans la documentation $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();?>
Oracle est légèrement différent pour insérer un lob à partir d'un fichier. Les insertions doivent être effectuées après une transaction, sinon le LOB nouvellement inséré sera implicitement validé avec une longueur de 0 lorsque la requête est exécutée :
<?php$db = new PDO('oci:', 'scott', 'tiger');$stmt = $db->prepare("insérer dans les images (id, contenttype, imagedata) " .VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?");$id = get_new_id(); // Appel d'une fonction pour attribuer un nouvel ID // Supposons la gestion d'un téléchargement de fichier // Plus d'informations peuvent être trouvées dans la documentation 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();?>