PHP Pear MDB2 modülü ile veritabanına binary data kaydetmek ve okumak

Yine Pear MDB2 modülü ile işlemler yapalım. Bu sefer veritabanına Binary Data kaydedeceğiz ve okuyacağız. Pear MDB2 modülü oldukça kullanışlı olması beni bu paketi kullanmaya yönlendirdi. Daha önce veritabanına Pear Mdb2 modülü ile binary data kaydetme ve okuma işlemlerini anlatmadım. Projenizde binary data işlemleri yapacağınızı düşünerekten yazımı sizlere paylaşıyorum.

Önce bir form ile dosya yollayacağız ve dosyayı PHP script ile okuyup dosya içeriğini veritabanına gireceğiz. Veritabanına gireceğimiz dosya türü resim olacak. Şimdi binary data gireceğimiz tabloyu kendi veritabanınızda oluşturalım. Binary datamızı tablonun BLOB tipindeki alana gireceğiz. Tablonun yapısı:
CREATE TABLE IF NOT EXISTS `images` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(10) COLLATE utf8_bin NOT NULL,
  `image` blob NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin ;
Dosya upload etmek için yazacağımız html body kısmı:
// Pear MDB2 modülü ile veritabanına binary data kaydetmek ve okumak
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Dosya (resim) yolu :</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" id="sub" />
</form>
Form action değerini upload_file.php yaptık. Bu dosyayı yollayacağımız dosyanın ismi. Şimdi upload_file.php dosyasını oluşturup içine aşağıdaki PHP kodunu kaydedelim:
<?php
// dosya (resim) tipini kontrol ediyoruz
// dosya boyutunu yaklaşık 200 kb (200000/1024) ile sınırlandırıyoruz 
if ((($_FILES["file"]["type"] == "image/jpeg"))
    && ($_FILES["file"]["size"] < 200000))
    
    {
    if ($_FILES["file"]["error"] > 0)
        {
        echo "Gönderilen dosya (resim) hatalı.";
        }
    else
        {
        // gönderilen dosyayi (resmi) açıyoruz
        $fp= fopen($_FILES["file"]["tmp_name"], 'r');
        // dosyayı (resmi) okuyoruz
        $content = fread($fp, filesize($_FILES["file"]["tmp_name"]));
        // açtığımız dosyayı (resmi) kapatıyoruz
        fclose($fp);
        // dosyanin (resmin) boyutunu alıyoruz
        $fileSize = $_FILES["file"]["size"];
        // mdb2 classını include ediyoruz
        require_once 'MDB2.php';
        // veritabanına bağlanıyoruz
        $dsn = 'mysql://kullanici:sifre@localhost/veritabani';

        // factory pattern ile mdb2 classını yaratıyoruz
        $mdb2 =& MDB2::factory($dsn);
            if (PEAR::isError($mdb2)) {
            die($mdb2->getMessage());
                
        }
            
        // veri tipini hazırlıyoruz
        $types = array('integer', 'text', 'blob');
        // prepare işlemini yapıyoruz
        $sth = $mdb2->prepare('INSERT INTO images VALUES (?, ?, ?)', $types, MDB2_PREPARE_MANIP);
        $mdb2->setOption('seqcol_name', 'id');        
        // insert edilecek veriyi hazırlıyoruz
        $data = array('NEW.id', 'one', $content);
        $affectedRows = $sth->execute($data);
        // execute yaptıktan sonra hata olup olmadığını kontrol edyrz
        if (PEAR::isError($affectedRows)) {
            echo "INSERT işlemi başarısız!";
            }
        else
            echo "INSERT işlemi başarılı!";
            
        }

    }
    
else

    {
        echo "Gönderilen dosya (resim) uygun değil";
    }
?>
Yukarıdaki PHP kodumuzuda önemli olan kısım MDB2 classını oluşturup Insert işlemi için Prepare kullanmamız. Eğer daha önce MDB2 modülü ile veritabanı işlemleri yapmadıysanız pear-mdb2-modülü-ile-insert-select-delete-ve-prepare-işlemleri linkinden inceleyebilirler. Yaptığım testte veritabanına bir kaç tane resim girdim. Resimleri girdikten sonra veritabanın içeriği şu şekilde oldu:

pear-mdb2-modulu-ile-insert-sonrasi

Şimdi bu binary data'yı veritabanından okuyalım. Bunun için yeni bir php dosyası (binarygoster.php) oluşturalım:
<?php
// Pear MDB2 modülü ile veritabanına binary data kaydetmek ve okumak
require_once 'MDB2.php';
// veritabanına bağlanıyoruz
$dsn = 'mysql://kullanici:sifre@localhost/veritabani';

// factory pattern ile mdb2 classını yaratıyoruz
$mdb2 =& MDB2::factory($dsn);
    if (PEAR::isError($mdb2)) {
        die($mdb2->getMessage());
                
    }
            
// sorgumuzu hazırlıyoruz.
// Parametremizi hazırlarken parametre tipini ve 
// (id, title, image) alanların tipini dizi olarak giriyoruz
$statement = $mdb2->prepare('SELECT * FROM images WHERE id = ?', array('integer'),array( 'blob'));
// id'si 1 olan satırı alması için parametre olarak 1 giriyoruz.
$result = $statement->execute(1);

$mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);
// sonucu taracıya gönderiyoruz
// girdiğim resimler jpeg formatında idi. 
// Header bilgisini girmemiz şart
header('Content-type: image/jpeg');

while ($row = $result->fetchRow()) {            
    echo $row['image'];    
    }
?>
Yukarıdaki kodumuzun çıktısı:

pear-mdb2-modulu-ile-binary-image

Pear MDB2 modülü ile veritabanına Prepare kullanarak veritabanına binary data girdik. Daha sonra binary datayı veritabanından çekip web browsera yolladık.
yazan Zülküf Küçüközer tarih   27th August 2009
primary key words  Pear | Mdb2 modülü | Veritabanı | Php okunma  6487
secondary key words  Prepare | İnsert | Binary data
Bu yazı hakkında yorum yapılmamış.