Sayfalar

MySQL Veritabaninda Resim veya Normal Dosyalari Saklamak


Aslinda bu ise baslarken ugrasmak istedigim seyleri bir liste haline getirdigimde kendim bile sasiyorum, bir bakmisim GTK+ içindeyim, olmamis cookie'lerle, bogusup session degiskenleri ile yatip kalkiyorum :)

Eger PHP bu kadar genis olursa bende de bu kadar ögrenme istahi olursa bu is devam eder, olsun halimden memnunum. Ilk olarak resim fikri, daha sonra uygulamayi dusundügüm bir ögrenci bilgi sistemi programindan gelisti, ogrencilerin resimlerini de veritabaninda tutup oradan okutmak, bu ise baslarken ufak puf noktalarýndan bu kadar çekecegimi sanmiyordum ama oluyor iste, ne de olsa PHP gelismis bir programlama dili ve gozunden bir þey kaçmiyor...

Islem basamaklarini yazarsak kisaca :

1- Resmi veritabanina kaydetme (resimekle.php)
2- Resmi secme (resimgoster.php)
3- Resmi ekranda gösterme (resimgetir.php)

1- Öncelikle resmi veritabanindan okuma islemleri için kisa bir seyler yazayim, resimlerimizi asagida belirtilmis vt içinde saklayacacagimiz, verilmis vt yapisina bakarsak çogu sey tanidik, belki longblob için biraz bilgi edinmek lazim, blob(binary-large-object) çesitli bilgi çesitlerini tutabilen bir tiptir. Deger olarak maximum 4294967295 (2^32 - 1) karakterdir. Blob'da da Varchar'da oldugu gibi bir degisken kendisine atanan kisimda, girilen bilgi kadar yer tutar. Yani 10 karakterlik bir tanimlama yapilip eger 4 karakterlik bir bilgi girilirse toplam alan 5 olacak(1 byte string ifade uzunlugunu tutar). Blob'ta da benzer bir mantik vardir. Evet bu kadar bilgi yeter.

"turkphp_veritabani" veritabani içindeki "resim" isimli tablonun yapisi :

    id int,auto_increment,primary
    aciklama varchar (50)
    dosyaadi varchar(50)
    boyut varchar(50)
    resimdata longblob
    dosyatip varchar(10)

Tablo icin SQL semasi :

    CREATE TABLE resim (
    id MEDIUMINT(5) DEFAULT '0' NOT NULL AUTO_INCREMENT,
    aciklama VARCHAR(50),
    dosyaadi VARCHAR(50),
    boyut MEDIUMINT(8),
    resimdata LONGBLOB,
    dosyatip VARCHAR(10),
    PRIMARY KEY (id)
    );

Ilk önce yapacagimiz dosyalari makineden vt'ye aktarmak ,asagidaki form yardimi ile yerel makineden seçilen bir dosyayi bir açiklama ile beraber vt'ye kaydediyoruz. Kaydetme islemi ardindan her bir dosya için mysql_insert_id komutu ile otomatik bir id numarasi saglaniyor resimlere.(Bu komut, AUTO_INCREMENT kolon için sorgu sonrasi bir ID üretir.)

Burada birde form içindeki birkaç olaydan kisaca söz etmek isterim,biliniyordur ama ben yinede söyleyeyim ki yazacak bir seyler olsun :Form içinde gelen bilginin tür olarak(enctype) multipart/form-data seçilmis, ve gizli parametre olarak dosya boyutu 2400000 byte olarak belirtilmis, daha yukarisi dosyalar için ben bölümlemenizi tavsiye ederim, dosya çekme islemi
içinde <input type ="file" > tip olarak file seçildi. Böylece dosyayi "gözat " butonu ile seçip form_data degiskenine aktarmis oluyoruz.

Resimekle.php

    <?php
    if ($submit)
    {
    mysql_connect("localhost","turk_user","******");
    mysql_select_db("turkphp_veritabani");
    $data = addslashes(fread(fopen($form_data, "rb"),filesize($form_data)));
    $sonuc=mysql_query("INSERT INTO resim
    (id,aciklama,dosyaadi,boyut,resimdata,dosyatip) ".
    "VALUES
    ('null','$form_aciklama','$form_data_name','$form_data_size','$data','$form_data_type')");
    $id= mysql_insert_id(); //otomatik ID verildi.
    print "<p>Database ID No: $id";
    mysql_close();
    echo "<BR>n";

echo "<a href="http://www.turk-php.com/ornekler/mysql/resimgoster.php">Yuklediginiz resme bakabilir veya bilgisayariniza indirebilirsiniz...</a>";

    echo "<BR>n";
    echo "<a href="http://www.turk-php.com/">Anasayfaya donebilirsiniz....</a>";
    }
    else
    {
    print "<a href="$PHP_SELF">Ana Sayfa</a>";
    ?>
    <form method="post" action="<?php echo $PHP_SELF; ?>"
    enctype="multipart/form-data">
    Saklanacak dosya için aç&yacute;klama:

    <input type="text" name="form_aciklama" value="Yorum Yapilmamis..." size="40">
    <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="10000">
    <br> Database gonderilecek dosyayi secin: <input type="file"
    name="form_data" size="40">
    <br>
    <BR>NOT : Bu demoda maximum dosya boyutu "10000" byte olarak ayarlanmistir... <BR>
    <input type="submit" name="submit" value="Veritabanina EKLE">
    </form>
    <?php
    }
    ?>

2- Simdide ekledigimiz resmi gösterelim. Vt içindeki tüm resimleri göstermek veya belli bir resmi seçmek için çesitli yöntemler kullanabiliriz.Bir form yardimi ile dosyaadi veya id degiskenlerini kullanabiliriz. Basitçe id si veya dosyaadi girilen degisken vt'den sorgu ile çagrilip. Bir nesne olarak fetch ediliyor,burada istenirse degerler array olarak da çekilebilir, bir fark yok sanirim ama sadece kullanim farki var. (Array kullanimi : echo $sira["dosyaadi"] , nesne kullanimi: echo $sira->dosyaadi (pointer gibi)) Burada resimleri localhost/resimgoster.php?id=2 seklinde id parametresini göndererek resmi çagiriyoruz, eger kisi herhangi bir id yazmamissa tüm resimleri gösteriyor.

Formu hazirlayalim...iste hazir asagida : )

resimgoster.php

    <?
    $i=0;
    mysql_connect("localhost","turk_user","******") or die("server baglantisi
    olmadi");
    @mysql_select_db("turkphp_veritabani") or die("Veritaban&yacute; seçilemedi");
    //e&eth;er id k&yacute;sm&yacute;nda bir de&eth;er yoksa tüm resimleri göster
    if ($id==0 || $id==" ")
    {
    $sonuc=mysql_query("SELECT * FROM resim");
    while($sira=mysql_fetch_object($sonuc))
    {
    $i++;
    // burada resimgetir dosyas&yacute;na id ile resim ekrana ç&yacute;kart&yacute;l&yacute;yor,dosyaadi ve
    // aç&yacute;klama ile beraber.
    echo "<a href="resimgetir.php?id=$sira->id"><IMG SRC="resimgetir.php?id=$sira->id"></IMG></a>";
    echo "tt";
    echo "Dosya adi : " . $sira->dosyaadi . "";
    echo "tt";
    echo "Dosya açiklamasi: ". $sira->aciklama . "";
    echo "<BR>n";
    }
    echo "Toplam dosya sayisi:$i";
    echo "<BR>";
    exit();
    }
    //eger id kisminda bir deger varsa sadece olani göster
    $sonuc=mysql_query("SELECT * FROM resim where id='$id' ") or die("Sorgu
    calismadi");
    if ($sonuc==NULL)
    {
    echo "Böyle bir resim yok..";
    exit();
    }
    $sira=mysql_fetch_object($sonuc);
    echo "<IMG SRC="resimgetir.php?id=$sira->id">";
    ?>

3- Bunlar&yacute;n ardindan gelelim en önemli kisma :) (finali en son yapalim dedim). Burada hazirlayacagimiz dosya ile resimgoster'den gelen id'yi (tabi bir id gelmi&thorn;se) kullanarak vt'den uygun olan resmi, eger id gelmemisse tüm resimleri gösterecek. Burada önemli nokta gösterilecek veri bir resim oldugu için content-type için image/gif veya iamge/pjpeg seçilecek (ama herhangi bir tanesi hepsi için çalisiyor :) ) resimgetir.php

    <?php
    Header("Content-type: Image/gif");// veya image/pjpeg
    mysql_connect("localhost","turk_user","*******") or die("server baglantisi
    olmadi");
    @mysql_select_db("turkphp_veritabani") or die("Veritabani Secilemedi");
    $sonuc=mysql_query("SELECT * FROM resim WHERE id='$id' ") or die("Sorgu
    çalistirilamadi");
    $sira=mysql_fetch_object($sonuc);
    echo $sira->resimdata;
    ?>

Bu olayi daha gelistirebiliriz. Örnegin resimleri bir combobox içine alip oradanda seçildigi anda (onchange olayi) resmi göstermek gibi.Örnegin;

    <FORM method="post" action="resimgetir1.php" name="gonder" >
    <SELECT name="id" onchange="submit()">
    <?
    While($row=mysql_fetch_object($result))
    {
    ?>
    <option> <?echo $row->dosyaadi?></option>
    <?
    }
    ?>
    </SELECT>
    <INPUT TYPE="SUBMIT" name="gonder" value="GONDER">
    </form>