Uygulamanızın bir yerinde veritabanınızda büyük müktarda veri saklamanız
gerekebilir. Burada büyük veriden kasıt 4kB civarı olsa da bazı
veritabanları için büyük veri 32kB'tan başlar. Büyük veriler ikil veya
dizgesel olabilir. PDOStatement::bindParam() ve
PDOStatement::bindColumn() çağrılarında büyük
verilerlerle çalışmak için PDO::PARAM_LOB
veri türünü
kullanabilirsiniz. PDO::PARAM_LOB
, verinin bir akım
olarak eşleneceği anlamına gelir. Dolayısıyla, bu veriler üzerinde PHP Akım işlevleri ile işlem yapabilirsiniz.
Örnek 1 - Veritabanındaki bir resmin gösterilmesi
Bu örnekte bir LOB, $lob değişkeni ile ilişkilendirilmekte ve fpassthru() üzerinden tarayıcıya gönderilmektedir. LOB bir akımla temsil edildiğinden fgets(), fread() ve stream_get_contents() gibi işlevlerle üzerinde işlem yapabilirsiniz.
<?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);
?>
Örnek 2 - Bir resmin veritabanına yerleştirilmesi
Bu örnekte bir dosya açılıp, bir LOB olarak veritabanına yerleştirilmek üzere, dosya tanıtıcısı PDO'ya aktarılmaktadır. PDO, dosya içeriğini veritabanına yerleştirme işlemini en verimli şekilde yapacaktır.
<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
$id = get_new_id(); // Yeni bir kimlik ayıran bir işlev
// Resmin bir dosya yükleme formundan geldiğini varsayıyoruz
// PHP belgelerinde bu konuda ayrıntılı bilgi bulabilirsiniz
$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();
?>
Örnek 3 - Oracle'da bir resmi veritabanına yerleştirmek
Oracle, bir LOB'u bir dosyadan alıp veritabanına yerleştirirken farklı bir sözdizimi kullanımını gerektirir. Esas olarak, yerleştirme işlemi bir toplu hareket olarak gerçekleştirilir. Böyle yapılmazsa oluşturulan LOB, sorgu çalıştırıldığında örtük olarak sıfır uzunluklu bir veri girişinin parçası haline gelir.
<?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(); // Yeni bir kimlik ayıran bir işlev
// Resmin bir dosya yükleme formundan geldiğini varsayıyoruz
// PHP belgelerinde bu konuda ayrıntılı bilgi bulabilirsiniz
$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();
?>