Objets volumineux (LOBs) avec PHP PDO
À un moment donné, les applications peuvent avoir besoin de stocker des données « volumineuses » dans la base de données.
« Volumineux » signifie généralement « environ 4kb ou plus », bien que certaines bases de données puissent facilement gérer jusqu'à 32kb de données avant qu'elles ne deviennent « volumineuses ». Les objets volumineux sont essentiellement du texte ou du binaire.
L'utilisation du code de type PDO::PARAM_LOB dans les appels PDOStatement::bindParam() ou PDOStatement::bindColumn() permet à PDO d'utiliser le type de données volumineuses.
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.
Afficher une image depuis la base de données
L'exemple suivant lie un LOB à la variable $lob, puis utilise fpassthru() pour l'envoyer au navigateur. Comme un LOB représente un flux, des fonctions telles que fgets(), fread() et stream_get_contents() peuvent être utilisées sur celui-ci.
<?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);
?>
Insérer une image dans la base de données
L'exemple suivant ouvre un fichier et passe le descripteur de fichier à PDO pour l'insérer en tant que LOB. PDO fait en sorte que la base de données récupère le contenu du fichier de la manière la plus efficace possible.
<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
$id = get_new_id(); // 调用某个函数来分配一个新 ID
// 假设处理一个文件上传
// 可以在 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();
?>
Insérer une image dans la base de données : Oracle
Pour insérer un LOB à partir d'un fichier, Oracle est légèrement différent. L'insertion doit être effectuée après une transaction ; sinon, lorsque la requête est exécutée, le LOB nouvellement inséré sera implicitement validé avec une longueur de 0 :
<?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(); // 调用某个函数来分配一个新 ID
// 假设处理一个文件上传
// 可以在 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();
?>
Autres extensions
Manuel de référence PHP PDO