Există situaţii când trebuie stocate date "mari" în baza de date. Mare înseamnă "circa 4kb sau mai mult", în timp ce unele baze de date pot manevra peste 32kb înainte ca datele să devină "mari".
Obiectele mari pot fi de tip text sau binar.
PDO permite lucrul cu aceste date folosind codul PDO::PARAM_LOB în apelarea PDOStatement::bindParam() sau PDOStatement::bindColumn(). PDO::PARAM_LOB indică PDO să mapeze datele ca pe un flux, astfel încât să poată fi manipulate cu PHP Streams API.
Afişarea unei imagini dintr-o bază de date
Acest exemplu leagă LOB în variabila numită $lob şi o trimite la browser folosind fpassthru(). De când LOB este reprezentat ca un flux, pot fi folosite funcţiile fgets(), fread() şi stream_get_contents().
<?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);
?>
Inserarea unei imagini în baza de date
Acest exemplu deschide un fişier şi trece manipularea acestuia la PDO pentru a-l insera ca LOB. PDO preia conţinutul fişierului şi îl încarcă în baza de date.
<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
$id = get_new_id(); // unele functii pentru a aloca un ID nou
// presupunem ca este rulat un formular de incarcare a unui fisier
// detalii pot fi gasite in documentatia 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();
?>
Inserarea unei imagini în baza de date Oracle
Oracle cere o sintaxă diferită de inserare a unui LOB dintr-un fişier. Este esenţială realizarea inserării sub tranzacţie, altfel noul LOB introdus va avea valoarea zero:
<?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(); // functie de alocare ID nou
// presupunem ca este rulat un formular de incarcare a unui fisier
// detalii pot fi gasite in documentatia 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();
?>