PHP ve MySQL resim upload, bilgilerini kullanmak ve basit resim galerisi

Bu dersimde PHP ve MySQL kullanarak hem sunucuya resim yükleme(upload) yapmayı anlatıcam aynı zamanda yoluyla beraber veritabanına kayıt işlemini gerçekleştirip basit bir resim galerisi yaparak resim bilgilerini kullanmayı ve hem veritabanından hem de sunucudan resmi silmeyi öğrenicez ve resim isim karışıklılığını önlemek için rasgele sayı üreterek resim yüklenirken, resmin ismini değiştirip karmaşıklığın önüne geçeceğiz.

Selam arkadaşlar,

Bu dersimde PHP ve MySQL kullanarak sunucuya resim yüklemek ve aynı zamanda veritabanına yoluyla beraber kayıt yapmayı göstericem. Ayrıca ufak birde resim galerisi yaparak yüklediğimiz resmin bilgilerini kullanmayı ve hem veritabanından hemde sunucudan resmi silmeyi göstericem ve sunucuya aynı isimde resim eklenmesini önlemek için rasgele sayı üretip resim yüklenirken resime yeni bir isim atayıp karmaşalığı önlemiş olduk. Her zamanki gibi projenin demosunu ve kodlarını paylaşacağım ve burada da anlatacağım. Umarım yeni başlayan, merak eden ve yapamayan arkadaşlara yardımcı olur.

Projeyi görmek için tıklayın - Projeyi indirmek için tıklayın

Öncelikle, aşağıdaki işemleri yapmadan önce dosyaları oluşturcağınız kısıma resimleri yükleyeceğiniz resimler adında bir klasör açmalısınız.

İsterseniz, farklı isimlerde de klasörler açabilirsiniz fakat ben yaptığım projede resimler isimli klasörü kullandım değiştirebilir veya geliştirebilirsiniz.

Veritabanında oluşturmamız gereken tablo;

--

-- Tablo yapısı: `resimler`

--



CREATE TABLE IF NOT EXISTS `resimler` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `resim_url` text NOT NULL,

  `resim_boyutu` varchar(10) NOT NULL,

  `resim_turu` varchar(10) NOT NULL,

  `eklenme` varchar(10) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin5 AUTO_INCREMENT=1 ;



--

-- Tablo döküm verisi `resimler`

--



/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


Peki ne yaptık?
Veritabanımıza resimler isminde bir tablo oluşturuyoruz.

Veritabanı bağlantısı için kodlarımız ? vtbaglan.php

<?php 

##################################################

#            Veritabanı Ayarları

#

#    $vt_host       = Veritabanı Hostu

#    $vt_kullanici = Veritabanı Kullanıcı Adı

#    $vt_sifre     = Veritabanı Şifresi

#    $vt_adi       = Veritabanı Adı

#

##################################################



$vt_host        "localhost";

$vt_kullanici  "root";

$vt_sifre        "";

$vt_adi        "ornekler";



//Veritabanı bağlantısını yapıyoruz

$vtbaglan = @mysql_connect($vt_host,$vt_kullanici,$vt_sifre) or die("Veritabanı bağlantısı sağlanamadı!");

mysql_select_db($vt_adi,$vtbaglan) or die("Veritabanı bulunamadı!");

@
mysql_query("SET NAMES 'latin5'"); //MySQL Türkçe Karakter Sorunu

?> ?>



Peki ne yaptık?

Bir veritabanı bağlantı dosyası oluşturduk. Oluşturduğumuz bu veritabanı dosyası ile her sayfada mysql bağlantısı kurmamızı ve resimler tablomuzdan bilgilere erişmemizi sağlayacak. $vt_host, $vt_kullanici, $vt_sifre, $vt_adi isminde 4 değişken oluşturduk bu değişkenlerimize veritabanı bilgilerimizi yazıp mysql_connect() fonksiyonu ile veritabanı bağlantısını kurduk ve mysql_select_db() fonksiyonu ile mysql bilgileri ile veritabanımızı bağdaştırıp veritabanımıza erişimi sağladık.

Gerekli fonksiyonlarımızın bulunduğı sayfamız - fonksiyonlar.php

<?php 

/*

Bu yazdığımız fonksiyon sayesinde yüklenen dosyanın boyutunu

string değer olarak değiştirirz.

*/

//Veri boyutlarını değiştirme

function strBoyut($bayt) {

if(
$bayt 1024) {

    return 
"$bytes byte"//Byte cinsini alıyoruz

}else{

    
$kb $bayt 1024;

    if (
$kb 1024){

        return 
sprintf("%01.2f"$kb)." KB"//KB cinsine dönüştürüyoruz

    
}else{

        
$mb $kb 1024;

        if(
$mb 1024){

            return 
sprintf("%01.2f"$mb)." MB"//MB cinsine dönüştürüyoruz

        
}else{

            
$gb $mb 1024;

            return 
sprintf("%01.2f"$gb)." GB"//GB cinsine dönüştürüyoruz

        
}

    }

}

}

?> ?>



Peki ne yaptık?

Yüklenecek olan resmin boyutunu kb, mb ve gb cinsinden string değere dönüştürmek için bir fonksiyon oluşturduk

Resim eklemek ve eklenmiş resimleri görmek için sayfamız - index.php

<?php 

//Veritabanı bağlantı dosyamızı çekiyoruz

require_once("vtbaglan.php");

//Fonksiyonlar dosyamızı çekiyoruz

require_once("fonksiyonlar.php");

?>



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9" />

<title>PHP ve MySQL Resim Upload</title>

</head>



<body>



/*

Bir string değişken oluştururp bu değişken sayesinde başka sayfa oluşturup

işlem yapacağımıza tek bir sayfada string değişkenimiz sayesinde işlem yapabiliriz.

Ayrıca bu string değişken başka sayfalara taşınıp kullanılabilir.

*/

$i = $_GET['i']; //Bir string değişken oluşturuyoruz

switch($i){

case "": //$i string değişkeni boş ise yani sayfaya ilk girildiğinde

?>

<h3>Resim Upload Formu...</h3>

<form action="index.php?i=upload" method="post" enctype="multipart/form-data">

<label>Resim: <input name="file_resim" type="file" /></label>

<br /><br />

<input type="submit" value="Yükle!" />

</form>



<h3>Yüklenen Resimler...</h3>



echo '<table width="500" border="1">'; //Reesimlerimizi listelemek için bir tablo oluşturduk

$resim_cek = mysql_query("SELECT * FROM resimler ORDER BY id DESC"); //Resimleri en son eklenenden başlayarak çekmemiz için gerekli mysql kodumuz

while($resim_cek_yeni = mysql_fetch_array($resim_cek)){ //while döngüsü ile resimlerimizi listeliyoruz

$id = $resim_cek_yeni['id']; //Resmin id'sini alıyoruz

$gy_al = getimagesize($resim_cek_yeni['resim_url']); //Resmin genişlik ve yüksekliğini alıyoruz

//Resimlerimizi tablonun satırlarına ekleyip listeliyoruz

echo '

<tr>

  <td width="150"><a href="'.$resim_cek_yeni['resim_url'].'"><img src="'.$resim_cek_yeni['resim_url'].'" width="150" height="150" border="0" /></a></td>

  <td width="334" valign="top">

  <b>Boyutu:</b> '.$resim_cek_yeni['resim_boyutu'].'<br />

  <b>Türü:</b> '.$resim_cek_yeni['resim_turu'].'<br />

  <b>Eklenme:</b> '.$resim_cek_yeni['eklenme'].'<br />

  <b>Genişlik ve Yükseklik:</b> '.$gy_al[0].' x '.$gy_al[1].'<br /><br />

  Resimi <a href="index.php?i=sil&id='.$id.'">Silin</a> veya <a href="'.$resim_cek_yeni['resim_url'].'">Büyütün</a>

  </td>

</tr>';

}

echo '</table>';

break;



case "upload": //$i isminde oluşturduğumuz string değişkenin değeri yani upload yapmamız için gerekli kodlamaların bulunduğu değişken

//Resim Upload aracından verileri alıyoruz

$resim_isim      = $_FILES["file_resim"]["name"]; //Resmin ismini çekiyoruz

$resim_turu      = $_FILES["file_resim"]["type"]; //Resmin türü. Örn; JPEG, PNG, GIF vs.

$resim_boyut_orj = $_FILES["file_resim"]["size"]; //Resmin orjinal boyutunu alıyoruz

$resim_boyut_str = strBoyut($_FILES["file_resim"]["size"]); //Resmin dönüştürülmüş boyutunu alıyoruz

$resim_kaynak    = $_FILES["file_resim"]["tmp_name"]; //Resmin hangi kaynaktan geldiğini alıyoruz

$resim_hedef     = "resimler/"; //Resmin yükleneceği yolu bir değişkene atadık

$eklenme_tarih   = date("d.m.Y"); //Bir tarih formatı oluşturduk



    if($resim_kaynak == ""){ //Eğer resmin kaynağı boş iste yani hiç resim seçilmemiş ise hata mesajı verdiriyoruz

        echo '<script type="text/javascript">alert("Üzgünüz! Bir resim seçmelisiniz.");</script>';

        echo '<meta http-equiv="refresh" content="0;URL=index.php">';

    }elseif(($resim_turu != "image/jpeg") and ($resim_turu != "image/png") and ($resim_turu != "image/gif")){ //Eğer seçilen resimlerin türü JPEG, PNG veya GIF değilse bir hata mesajı verdiriyoruz

        echo '<script type="text/javascript">alert("Seçtiğiniz dosya jpeg, png ve gif formatlarında olmalıdır!");</script>';

        echo '<meta http-equiv="refresh" content="0;URL=index.php">';

    }elseif($resim_boyut_orj > 960000){

        echo '<script type="text/javascript">alert("Resim boyutu çok büyük maximum 960kb boyutunda resim yükleyebilirsiniz!");</script>';

        echo '<meta http-equiv="refresh" content="0;URL=index.php">';

    }else{ //Eğer resim seçilmişse ve türüde uygunsa resmi hem sunucumuza yüklüyoruz(upload) hemde veritabanımıza kaydediyoruz

        $rasgele_isim = rand(1,10000); //1 ile 10.000 sayıları arasında rasgele bir sayı üretiyoruz

        //Resmi sunucuya yüklememiz(upload) için gereken php kodumuz ayrıca rasgele ürettiğimiz sayı ile resmimizin yanına ürettiğimiz sayıyı ekleyip aynı resimden olma ihtimalini yok ediyoruz

        $resim_upload = move_uploaded_file($resim_kaynak,$resim_hedef.'/'.$rasgele_isim . "-" . $resim_isim);

        //Veritabanına kaydedilirken sadece resmin ismi değilde resmin yolu, rasgele sayı ürettiğimiz kodumuz ile resmin ismini birleştirerek veritabanına kaydetmemiz için yeni bir değişken oluşturduk

        $resim_isim_yeni = "resimler/" .$rasgele_isim. "-".$resim_isim."";



        $kaydet = mysql_query("INSERT INTO resimler (resim_url,resim_boyutu,resim_turu,eklenme) VALUES ('$resim_isim_yeni','$resim_boyut_str','$resim_turu','$eklenme_tarih')"); //Veritabanına eklememiz için gereken mysql kodumuz

        if($kaydet){ //Eğer işlem başarılı olursa onay mesajı verdiriyoruz

            echo '<script type="text/javascript">alert("Resim başarıyla eklendi.");</script>';

            echo '<meta http-equiv="refresh" content="0;URL=index.php">';

        }else{ //Eğer bir sorun olursa hata mesajı verdiriyoruz

            echo '<script type="text/javascript">alert("Hata! Resim eklenemedi.");</script>';

            echo '<meta http-equiv="refresh" content="0;URL=index.php">';

        }

    }

break;



case "sil":

$id = $_GET['id']; //Resimleri listelerken çektiğimiz resmin id'si

$silincek_resim      = mysql_query("SELECT * FROM resimler WHERE id=$id"); //Silincek resmin ismini çekmek için gerekli mysql kodumuz

$silincek_resim_yeni = mysql_fetch_array($silincek_resim); //Silincek resmin ismini çekmek için mysql_fetch_array() fonksiyonumuzu kullanıyoruz



$resim_sil = mysql_query("DELETE FROM resimler WHERE id=$id"); //Resmi silmek için gerekli mysql kodumuz

    if($resim_sil){ //Eğer resim başarıyla silinirse onay mesajı verdiriyoruz

        echo '<script type="text/javascript">alert("Resim başarıyla silindi.");</script>';

        echo '<meta http-equiv="refresh" content="0;URL=index.php">';

        @unlink($silincek_resim_yeni['resim_url']); //Resmi sunucudan silmek için gerekli fonksiyonumuz

    }else{ //Eğer resim silinirken bir sorun olursa hata mesajı verdiriyoruz

        echo '<script type="text/javascript">alert("Hata! Resim silinemedi.");</script>';

        echo '<meta http-equiv="refresh" content="0;URL=index.php">';

    }

break;

}

?>

</body>

</html> ?>



Peki ne yaptık?

Resim yüklemek için bir form oluşturduk. Farklı sayfalar oluşturmak yerine bir string değişken oluşturup tek sayfa içerisinde upload, galeri, silme vb. gibi işlemleri yaptık. Aynı zamanda tek sayfa içinde upload yapabilmemiz için formumuza enctype="multipart/form-data" özelliğini ekledik eklemediğimiz taktirde aynı sayfa içerisinde upload işlemleri yaptıramayız. Sunucuda aynı isimde resimler yüklenipte üst üste yazılıp karmaşıklığa yol açmasın diye 1 ile 10.000 arasında rasgele sayı üretip resim sunucuya yüklenirken başına rasgele sayı ekletip tire(-) işareti ile isimle beraber ayırıp, yeni bir isim oluşturduk.

  • Etiketler;
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Derdime derman oldun, bende resimli personel ekleme formu yapacaktım artık uyarlarım kendime göre. eline sağlık emeğin için teşekkürler.
resim turunu kontrol ettiğimiz zaman and kullandıgımız ıcın internet explorer da resim türünde problem yaratıyor(diğerlerinde sorun yok). onun yerine && simgesi ile yaparsak ie de sorunsuz çalışıyor.
[function.getimagesize]: failed hatası veriyor. 78. satırda. resimler klasörüne resmi upload edemedi. yardımlarınız için şimdiden teşekkürler.
Localde kullandığınız php programından hata veriyor olabilir özellikle easyphp kullanıyorsan sorunlu biraz. Ama hata resim boyutundan kaynaklanıyor yüklediğiniz resmin boyutu yüksek olabilir. Ama ben if döngüsüyle hata verdiren birşey yaptım fakat çalışmaması anormal projede gördüğünüz gibi çalışıyor.
Öncelikle ellerinize sağlık hocam bu konuda biraz acemiyim, yüklenen resimleri bütün sayfaya giren kullanıcılar görebilecek mi?ben örnek sayfnıza girdim, birisi çiçek resmi eklemiş,onu sildim:)bu problemi nasıl çözebiliriz?
Bu bir problem değil ben resmi sadece eklemek yerine hem veritabanından hemde klasörlerden silmeyi gösterdim. Proje isteğe göre değiştirilebilir. Sayfaya giren kullanıcılara gözükür zaten yaptıgım örnek bu şekilde ama isteğe göre kullanılabilir. Avatar upload, resim upload vb. gibi ben sadece veritabanına ve sunucuya resmi nasıl yükleyebiliriz fonksiyonlar ve özellikleri nelerdir bunları anlatmaya çalıştım.
anladım hocam tekrar tekrar teşekkürler.aslında o problem sizin değil benim çözemediğim bir problem(acemilik diyelim).
resimleri yüklemeden önce bir albüm oluşturup, resimleri albüme yüklemek için ne yapabilirim.
@bulentsakarya Bu biraz uzun konu ama mantığını anlatıyım hazır scriptini yapıp vermeyi isterdim ama vaktim olmuyor şuan bir proje üzerinde çalışıyorum. Öncelikle albümler ve resimler diye 2 adet veritabanında tablo oluştur. Sonra albüm isimlerini veritabanına eklersin daha sonra bir resim ekleme bölümü oluşturup resimi eklerken albüm ismi seçmek için bir seçim kutusu oluşturursun ve bu seçim kutusuna veritabanından albüm isimlerini çekersiniz. Resmi eklerkende ve ekrana albüm olarak çekerkende bu resmi eklerken seçtiğimiz albüm isimlerini kullanarak çekebiliriz.
Merhaba. Bende Notice: Undefined index: i in C:xampphtdocssiteresimuploadindex.php on line 21 yani $i = $_GET['i']; //Bir string değişken oluşturuyoruz kod satırında hata oluşturuyor. Bu hata neden kaynaklanıyor? Ben çözmeye çalıştım ama olmuyor. Bir de resim yüklemek istediğimde format hatası veriyor. JPEG olduğu halde olmuyor. Sebebini öğrenebilir miyim?
Hatanın neden kaynaklandığı hakkında 2 şüphem var, ya "i" string değişkenine ulaşamıyor yada index.php dosyanın ismi değişmiş veya bu dosyaya giden uzantıda bir sorun olabilir. Fakat sorun olması gerçekten saçma örnekde gördüğünüz gibi sorunsuz bir şekilde çalışıyor, localde de aynı şekilde. Bunlar stabil kodlar olduğu için en fazla sytnax hatası verebilir. Diğer hatalar dediğim gibi url'lerden felan kaynaklanıyor olabilir baştan kontrol edin. Dosyaların üzerinde değişiklik yaptıysanız yaptığınız değişiklikleri kontrol edin. Yapmadıysanız baştan dosyaları ve veritabanını baştan kurmayı deneyin. Dosya yüklerkende hata vermemesi lazım çünkü az öncede dediğim gibi stabil kodlar yani orda basit bir if döngüsü var. Belki şeyde sorun olabilir if döngüsünde resmi uzantısını image/jpeg olarak tanımlamıştım uzantılarda problem olabilir ama örnekte o sıkıntıda yok gördüğünüz gibi. Bence sbir değişiklik yaptıysanız onları kontrol edin yada localde çalıştığınız apache sunucusunda sorun olabilir.
Merhabalar hocam.Öncelikle çok teşekkür ederiz.Şimdi ben internet explorer da deniyorum şu hatayı alıyorum “Seçtiğiniz dosya jpeg, png ve gif formatlarında olmalıdır!”.Google crome de sorunsuz çalışıyor.İnternet Explorerda nasıl çalıştırabiliriz.Yukarıda arkadaş demişki and yerine && şu şekilde yazarsan düzelir yazdım düzelmedi neden olabilir.Saygılarımla
S.a bi sorum olacak çok da gerekli bişey değil ama yapmak istiyorum tabi bi yolur varsa. input type=file ekledigimizde bi textbox ve yanında bi gözat butonu çıkıyo. Bu gözat butonunu resim yapma şansımız var mı? Normal submit butonu yapabiliyoruz ama bunun bi yolunu bulamadım yardımcı olursanız iyi olur...
S.a input type=file'daki textbox'ın yanında olan gözat butonunu resim yapabiliyo muyuz?
merhaba web sitenizdeki sorusu olan herkeze cevap vermişsiniz. oyönden ve eğitimci yönünüzden dolayı tebrik ederim. tabi benimde bir sorum var yardımcı olursanız çok sevinirim. benim açık kaynak kodlu kurulumlu bir emlak site scriptim var ve bunu hostingime yükledim. türkçe karekter bozukluğu vardı çogunu düzenledim. ( türkçe çevirili ) site admin panel içersinde birkaç tema var ama hepsi emlakçılar için yapılmış. ben bu sitenin ana görünümünü ve yazılarını değiştirerek farklı linkler vererek değiştirdim. istediğim bir ilan sitesine çevirmek. admin panelinde ilan ekle bölümü var ve sadece admin veya modaratör ilan ekleyebiliyor. bende admindeki ilan ekle sayfasının tarayıcıdaki linkini kopyalayıp ana sayfadaki bir yazıya linkledim. fakat kullanıcı olarak tıklandığında admin giriş sayfasına yöneliyor ve kullanıcı adı şifre istiyor admin şifrelerini girersem istediğim ilan ekleme sayfası açılıyor. burda üye için ve admin için bu sayfaya erişim izni vermem lazım scriptin kopyasnıvereblrim
teşekkür ederim
hepinizi selamlar öncelikle hocambir problemim olacak daha öncede yazmıslar resim yükleme konusunda sıkıntı oluyo devamlı "Seçtiğiniz dosya jpeg, png ve gif formatlarında olmalıdır!". diye mesaj alıyorum tekrar tekar bakıyorum ama hata nerede bir türlü bulamadım yardımcı olursdanız sevinirim
selam öncelikle hepinize hocam daha önceden de yazmıslar ama tekrar tekrar baktım devamlı "Seçtiğiniz dosya jpeg, png ve gif formatlarında olmalıdır!". hata alıyorum yardımcı olursanız sevinirim tesekkürler
Öncelikle bu güzel anlatımınız için teşekkürler. Buradan da yararlanarak bir resim galerisi oluşturdum. Ön izleme resimleri de tamam. Tıklayınca jquery ile resimler büyüyor. Ama sorunum şu şimdi veritabanından gelen resimlerin sayısı fazlalaştıkça sayfa doluyor. Aşağı yukarı scrollar yerine sayfanın büyümemesi adına bazı yerlerde gördüğüm tek satır da küçük ön izlemeleri sağına ve soluna koyulan ileri geri butonları yardımı ile küçük bir div içerisinde kontrol altına almak istiyorum. farzı misal ufak bir yatay div'de 10 adet resim gözükecek ama yanlarındaki ok'a tıklayınca resimler kayacak ve resimlerin gerisini gösterecek. Off düzgün anlatabilmek adına çok yazdım ama inş. anlatabilmişimdir. Yardımlarınız için şimdiden teşekkürler.
dostum eline sağlık güzel olmus yanlız ben jpeg png veya gif resim eklemem rağmen bana jpeg png gif koymalısn die hata veriyo sorun ne olaiblir?
elinize sağlık :)
merhaba, çalışma için elinize sağlık.Benim bir sorum olacaktı.Bu çalışmayı sadece resim için değilde diger formatlar için nasıl yapabiliriz.İsteğim bu bilgileri veritabanına tutmak listelemek,düzenlemek,silmek ve eklemek.Yardımlarınız için teşekkürler
merhaba, kendime ait websayfam var üye kayıt olurken istediği profil resmini yüklüyebiliyor .orda sıkıntı yok .. fakat üye sonradan kullanıcı adını kulanarak yeni bir profil resmini yüklemek istediğinde resim başarıyla yüklendi diyor resmi resimler adlı dosyaya kaydediyor fakat kullanıcı adında halen eski resim duruyor .. şimdi istediğim şu: kullanıcı adını kullanarak yeni resmi nasıl veritabanına kaydedebilirim. Teşekkürler.

Yukarı Git