Les gros objets (LOB)
À 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
PDO::PARAM_LOB dans vos appels aux fonctions
PDOStatement::bindParam ou
PDOStatement::bindColumn.
PDO::PARAM_LOB demande à PDO de transformer les données
en un flux que vous pourrez manipuler en utilisant
l'API PHP des flux.
Affichage d'une image depuis une base de données
Cet exemple lie un LOB dans une variable nommée $lob et l'envoie
au navigateur en utilisant la fonction fpassthru.
Étant donné qu'un LOB est représenté en un flux, les fonctions comme
fgets, fread et
stream_get_contents peuvent être utilisées sur ce flux.
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);
?>
]]>
Insertion d'une image dans une base de données
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.
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();
?>
]]>
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 d'effectuer votre insertion
au sein d'une transaction, sinon, votre nouveau LOB sera inséré
avec une longueur de zéro :
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();
?>
]]>