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çý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ý
seçilemedi");
//eðer id kýsmýnda bir deð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ýna id ile resim ekrana
çýkartýlýyor,dosyaadi ve
// açý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ýn ardindan gelelim en önemli kisma :) (finali
en son yapalim
dedim). Burada hazirlayacagimiz dosya ile resimgoster'den gelen
id'yi (tabi
bir id gelmiþ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>
Ornek Dosyalar
http://www.turk-php.com/ornekler/mysql/resimsema.sql
http://www.turk-php.com/ornekler/mysql/resimekle.php
http://www.turk-php.com/ornekler/mysql/resimgoster.php
http://www.turk-php.com/ornekler/mysql/resimgetir.php
Daha fazla bilgi icin e-posta gonderebilirsiniz...
Yavuz Selim
y_selim@hotmail.com
|