Veritabanından veri çekmek ve formatlı biçimde yazdırmak

Merhaba,

İlk eğitsel yazıma gelen “istek parça” üzerine kolay birşeyle başlıyorum. Bu eğitselde veritabanımızdan veri çekeceğiz ve bunu değişik şekillerde yazdıracağız.

Öncelikle basit bir SQL sorgusuna ve içerdiği değerlere bakış yapalım.

SELECT deger FROM tablo_adi WHERE sutun1=kosul1

İşlev olarak yukarıdaki SQL sorgusu “tablo_adi” isimli tablodaki “sutun1” isimli sütunun değeri “kosul1″‘e eşit olan tüm kayıtların “deger” sütunlarını çeker. Öyleyse sorgumuzda,
“deger” verilerini elde etmek istediğimiz sütunun adıdır. Not: Birden fazla sütunun verilerini çekmek isterseniz virgülle ayırmak koşulu ile hepsini yazabiliriz. Eğer istisnasız tüm sütunları çekmek istersek “*” kullanıyoruz.
“tablo_adi”  üzerinde sorgu yapmak istediğimiz tabloyu belirtir.
“sutun1” sorgumuzda koşulları sağlaması için içeriğine bakacağımız sütunun adını, “kosul1” de “sutun1” sütunu sorgularken kullanacağımız değeri temsil ediyor.

SQL’de koşulları sorgularken kullanabileceğiniz operatörler aşağıdaki gibidir. Ancak bu yazımda hepsine değinmeyeceğim. Dilerseniz w3schools gibi bir kaynaktan araştırabilir ya da ayrıntılı açıklama için yorum bırakabilirsiniz.

Operatör Anlamı
= Eşittir
<> Farklıdır
> Büyüktür
< Küçüktür
>= Büyük ya da eşittir
<= Küçük ya da eşittir
BETWEEN Belirtilen aralığın içinde
LIKE Belirtilen koşula göre benzerlik
IN Belirtilen değerlerden birine eşitse

Basit SQL sorguları ile ilgili birşeyler öğrendik. Şu anki aşamada bunların çoğuna ihtiyacımız olmayacak. Veritabanımızda bu örnekte kullanmak üzere bir tablo oluşturdum ve adını “ornek1” koydum. İçine denemek için bazı veriler girdim ve son hali aşağıdaki resim gibi oldu.

Çalışmamızda kullandığımız ornek1 tablosu

Çalışmamızda kullandığımız ornek1 tablosu

Bu tabloda kullandığımız “ID” sütunu verilerin veritabanındaki kayıt numarasını tutuyor. “kat_ID” sütunu ise eğer veri bir başka verinin altında yer alıyorsa, o verinin “ID”sini alıyor. Başka hiçbir verinin altında yer almayan verilerde ise “kat_ID” sütunu NULL yani boş değer alıyor. “isim” sütunumuzda ise verimize ait “isim” değeri yer alıyor. Sorgularımıza “ID” ve “kat_ID” değerlerini yazdırmayacağımızdan sadece “isim” sütununu çekmekle yetineceğiz ancak pekiştirmek isterseniz:

/* ornek1 tablosunda isim sütunu 'Firefox' olan verinin ID sütununu çeker. */
SELECT ID FROM ornek1 WHERE isim='Firefox'

/* ornek1 tablosunda ID sütunu 5 olan verinin ismini çeker. */
SELECT isim FROM ornek1 WHERE ID=5

/* ornek1 tablosunda kat_ID sütunu 4 olan tüm verileri çeker. */
SELECT * FROM ornek1 WHERE kat_ID=4

Buradan itibaren yavaş yavaş PHP ile karıştırmaya başlıyoruz işleri.

Bu eğitselin PHP bölümünde kullanacağımız başlıca komutlar şöyle;

$sorgu_resultset=mysql_query('sorgu');

mysql_query komutu tırnak içinde yazılmış olan SQL sorgusunu ya da parantez içinde bir değişken ile verilmiş olan SQL sorgusunu MySQL sunucumuzda işletir ve sonuçları bir resultset içerisinde (yukarıda $sorgu_resultset değişkeninde) bize döndürür

$dizi_degisken=mysql_fetch_assoc($sorgu_resultset);

mysql_fetch_assoc daha önce çalıştırılmış olan sorgunun sonuçlarını tablodaki sütun isimleri ile ilişkilendirilmiş biçimde bir dizi değişkene aktarır.

$dizi_degisken=mysql_fetch_array($sorgu_resultset);

“mysql_fetch_assoc”‘dan farklı olarak “mysql_fetch_array” daha önce çalıştırılmış olan sorgunun sonuçlarını tablodaki sütun isimleri ile ilişkilendirmeden bir dizi değişkene aktarır.

mysql_num_rows($sorgu_resultset);

mysql_num_rows daha önce çalıştırılmış olan sorgunun resultset’inde kaç adet veri ile geri döndüğünü verir.

while(kosul)
{
	//çalıştırılacak kodlar
}

“while” döngüsü koşul sağlandığı sürece arasındaki kodları işletir.

 

Yukarıdaki ornek1 tablomuz üzerinde çalıştığımızı ve veritabanına bağlandığımızı varsayarak örnekler yapalım.

//Sadece ID değeri 7 olan verinin isim değerini istiyoruz.

$sonuc=mysql_query('SELECT isim FROM ornek1 WHERE ID=7');
//$sonuc değişkeni artık yukarıdaki sorguya ait sonuçları(resultset) taşıyor.
//$sonuc değişkenindeki verileri bir dizi haline getirip tekrar $sonuc değişkenine atalım.

$sonuc=mysql_fetch_assoc($sonuc);
//$sonuc değişkeni artık bir dizi değişken. Yazdıralım.

echo $sonuc['isim'];
//$sonuc dizisi içinden 'isim' ile belirtilmiş veriyi yazdırdık.

Ekran çıktımız şöyle olacak:
Chrome

Öyleyse şimdi ana kategorideki, yani kat_ID değeri boş olan tüm verileri yazdıralım.

//Ana kategorideki, yani kat_ID değeri boş olan tüm verileri istiyoruz

$sonuc=mysql_query('SELECT isim FROM ornek1 WHERE kat_ID=NULL');
//$sonuc değişkeni artık yukarıdaki sorguya ait sonuçları(resultset) taşıyor.
//$sonuc değişkenindeki veriler birden fazla olduğundan bunları yazdırmak için döngü kullanacağız

echo '<ol>';
//Listeli şekilde yazdırmak bir adet <ol>(Ordered List / Sıralı Liste) tagı açtık.
while ($deger = mysql_fetch_assoc($sonuc){
//Yukarıdaki satır döngü boyunca $sonuc resultset'inden bir adet değeri alıp, $deger degiskenine ilişkilendirilmiş bir dizi ile atar
    echo '<li>'.$deger['isim'].'</li>';
	//Farkettiğiniz gibi dizi içinde kullanım esnasında $deger degiskeni üzerinden işlem yapıyoruz.
	//$deger dizisinin 'isim' olarak belirtilmiş alanındaki veriyi <li></li> tagları arasında bir liste elemanı olarak yazdırdık.
}

echo '</ol>';
//Listemizi kapattık.

Yukarıda tüm kategorileri yazdırdık. Bu sefer de iki kademeli yapımız olduğunu göz önünde bulundurarak tüm verileri çekerek kategori yapısıyla beraber yazdıralım.

//Ana kategorideki, yani kat_ID değeri boş olan tüm verileri istiyoruz

$sonuc=mysql_query('SELECT ID, isim FROM ornek1 WHERE kat_ID=NULL');
//$sonuc değişkeni artık yukarıdaki sorguya ait sonuçları(resultset) taşıyor.
//Bu sefer altındaki verilere de ihtiyacımız olduğu için onları sorgularken kullanmak üzere ihtiyacımız olacak olan ID sütununu da çekiyoruz.
//$sonuc değişkenindeki veriler birden fazla olduğundan bunları yazdırmak için döngü kullanacağız

echo '<ol>';
//Listeli şekilde yazdırmak bir adet <ol>(Ordered List / Sıralı Liste) tagı açtık.
while ($deger = mysql_fetch_assoc($sonuc){
//Yukarıdaki satır döngü boyunca $sonuc resultset'inden bir adet değeri alıp, $deger degiskenine ilişkilendirilmiş bir dizi ile atar
    echo '<li>'.$deger['isim'].'</li>';
	//Farkettiğiniz gibi dizi içinde kullanım esnasında $deger degiskeni üzerinden işlem yapıyoruz.
	//$deger dizisinin 'isim' olarak belirtilmiş alanındaki veriyi <li></li> tagları arasında bir liste elemanı olarak yazdırdık.

	$alt_sorgu=mysql_query('SELECT isim FROM ornek1 WHERE kat_ID='.$deger['ID']);
	if(mysql_num_rows($alt_sorgu)>0)
	{
	//Yukarıdaki ilk satırda kategoriye ait alt kategorileri veritabanından çekmek istedik;
	//Normalde gelen verilere göre yazdırmak için yukarıdaki gibi bir döngüye sokmamız gerekiyor.
	//Ancak Alt kategorisi olmayan Kategoriler için gereksiz bir döngüye girmemek için
	//if ile işlettiğimiz sorgunun getirdiği veri sayısının sıfırdan büyük olup olmadığını kontrol ediyoruz
	//Gelen veri sayısı sıfır ise döngüye girmeyeceğiz.
		echo '<ul>';
		//bu sefer alt kategoriler için <ul>(Unordered List / Sırasız Liste) tagı açtık.
		while ($alt_deger = mysql_fetch_assoc($alt_sorgu){
			echo '<li>'.$alt_deger['isim'].'</li>';
		}
		echo '</ul>';
	}
}

echo '</ol>';
//Listemizi kapattık.

 

Herşey tamam, şimdi son örnek olarak gelen sonuçları iki sütun halinde yazdıralım. Bunun için yukarıdakinden çok farklı birşey yapmıyoruz. Mantık olarak sadece bir tablo yaratacağız ve gerekli yerde tablonun bir sütununu kapatık diğerini açmasını isteyeceğiz.

 

//Ana kategorideki, yani kat_ID değeri boş olan tüm verileri istiyoruz

$sonuc=mysql_query('SELECT ID, isim FROM ornek1 WHERE kat_ID=NULL');
//$sonuc değişkeni artık yukarıdaki sorguya ait sonuçları(resultset) taşıyor.
//Bu sefer altındaki verilere de ihtiyacımız olduğu için onları sorgularken kullanmak üzere ihtiyacımız olacak olan ID sütununu da çekiyoruz.
//$sonuc değişkenindeki veriler birden fazla olduğundan bunları yazdırmak için döngü kullanacağız

echo '<table><tr><td>';
//Bir tablo açıp bir satır ve bir sütun başlattık
$say=0;
//bu bizim sayaç değişkenimiz olacak
$kontrol=mysql_num_rows($sonuc)/2;
//Burada $kontrol bizim kontrol değişkenimiz. Kaç elemanda bir sütun değiştirmemiz gerektiğini belirleyecek.
//Kaç sütun halinde yazdırmak istiyorsanız o rakama bölüyorsunuz. Ben 2'ye bölerek iki sütun halinde yazdıracağım
while ($deger = mysql_fetch_assoc($sonuc){
//Yukarıdaki satır döngü boyunca $sonuc resultset'inden bir adet değeri alıp, $deger degiskenine ilişkilendirilmiş bir dizi ile atar
    echo '<p>'.$deger['isim'];
	//Farkettiğiniz gibi dizi içinde kullanım esnasında $deger degiskeni üzerinden işlem yapıyoruz.
	//$deger dizisinin 'isim' olarak belirtilmiş alanındaki veriyi <p> tagı açarak bir paragraf başlatarak yazdırdık.

	$alt_sorgu=mysql_query('SELECT isim FROM ornek1 WHERE kat_ID='.$deger['ID']);
	if(mysql_num_rows($alt_sorgu)>0)
	{
	//Yukarıdaki ilk satırda kategoriye ait alt kategorileri veritabanından çekmek istedik;
	//Normalde gelen verilere göre yazdırmak için yukarıdaki gibi bir döngüye sokmamız gerekiyor.
	//Ancak Alt kategorisi olmayan Kategoriler için gereksiz bir döngüye girmemek için
	//if ile işlettiğimiz sorgunun getirdiği veri sayısının sıfırdan büyük olup olmadığını kontrol ediyoruz
	//Gelen veri sayısı sıfır ise döngüye girmeyeceğiz.
		echo '<ul>';
		//bu sefer alt kategoriler için <ul>(Unordered List / Sırasız Liste) tagı açtık.
		while ($alt_deger = mysql_fetch_assoc($alt_sorgu){
			echo '<li>'.$alt_deger['isim'].'</li>';
		}
		echo '</ul>';
	}
	echo '</p>';
	//Bu kategorimiz bittiği için paragrafını sonlandırdık
	$say++;
	//her yazdırdığımız kategoride sayacımızı bir arttırıyoruz.
	if($say>=$kontrol)
	{
		echo '</td><td>';
		$say=0;
	}
	//yukarıdaki if koşulunda öteki sütuna geçmek için yeterli miktarda kategori yazdırıp yazdırmadığımızı kontrol ediyoruz.
	//Eğer yan sütuna geçmemiz gerekiyorsa </td><td> yaparak içinde bulunduğumuz sütunu sonlandırıp yeni bir tane başlatıyoruz.
	//Her sütunda eşit sayıda yazdırmak için sayacımızı sıfırlamayı unutmuyoruz.
	//Not: Sayacı sıfırlamak yerine $kontrol değişkeninin integer olmasınız sağlayarak,
	//kontrolünüzü mod alarak da sağlamaya çalışabilirsiniz. Aklınızda bulunsun.
}

echo '</tr></td></table>';

 

Böylece ilk eğitselimi tamamlamış oldum. Kodları bolca açıkladığım için herhangi bir demo çalışması hazırlamaya gerek görmedim.

Eğer denediğinizde çalışmazsa yorum olarak yazın, kontrol edeyim. Umarım birilerine faydalı olur.

Bu yazı bugün 0 kere olmak üzere toplam 9,001 kere okundu.

Posted in: Development

8 Comments

  1. Davut says:

    Merhaba arkadaşlar, phpde bir resim galerisi oluşturdum, veri tabanında ise iki tablo var birinci tablo resim galeri, ikicisi ise resim kategori diye. benim sorum şu, öncelikle iki kategori oluşturdum, bu iki kategorilere iki farklı resim yükledim, anasayfada son yüklenen resimlerin gösterilmesini isityorum gösteriyor, lakin kategori adını dedil kategori numarasını gösteriyor bende eşitse değerini kullandım kod aynen şu: ?php if($row_resimler[‘res_kat’]==$row_kategori[‘kat_id’]) echo $row_kategori[‘kat_adi’] kategorinin adını gösteriyor lakin sadece ilk kategori adını gösteriyor diğerlerini boş bırakıyor. gözükmeyen diğer kategori adlarını nasıl göstere bilirim. yardımlarınız için şimdiden tşk ederim

    • mustafabugra says:

      Merhaba,
      Şu an kopyaladığınız kodda herhangi bir döngü görünmüyor ancak muhtemel sorun döngülerinizde. Her resim ekrana yazdırılırken kategori sorgusunun sonuçlarını tekrar döngüden geçirerek eşitlik durumunda kategori adını yazdırırsanız sorun çözülecektir. Diğer yollar olarak resimleri yazdırdığınız döngünün içerisinde her seferinde kategori_id’yi sorgulatabilirsiniz. Bu daha çok sorgu ve çok resim olması durumunda işlem yükü demektir. Son çözüm iste kategori adını çektiğiniz resultset’i (sonuçlarınızı) kategori_id’si index olacak şekilde bir döngüye aktarmanız. Bu durumda istediğiniz şekilde $kat_array[$row_resimler[‘res_kat’]] size doğrudan kategori adını verecektir.

  2. Emir says:

    Merhaba,
    TABLOLARIM
    Uyeler (kulladi, kullsif, mail)
    Yorumlar (yorum, mail)

    Yorumlardaki mail ile uyeler tablosuna gidip yorumun sahibinin adını yorumun yanında yazdırmak istiyorum. 2 kullanıcı ileörnek yaptım ancak iki yorumda da tek kullanıcının ismini yazıyor.

    Kodum şu şekilde:
    $sorgu = mysql_query(“SELECT uyeler.kulladi FROM uyeler INNER JOIN yorumlar ON yorumlar.mail = uyeler.mail”);
    $sonuc = mysql_fetch_array($sorgu);
    echo “$sonuc[kulladi]”;

    • mustafabugra says:

      Merhaba,
      Join kullanmadım ancak şu şekilde deneyebilirsin.
      select yorumlar.*, uyeler.kulladi from yorumlar, uyeler where yorumlar.mail=uyeler.mail

      Kullanırken de normal şekilde kullanabilirsin.

  3. asil balaban says:

    Bir framework kullanmadan proje geliştiriyorsanız PDO kullanmanızı tavsiye ediyorum.

    • mustafabugra says:

      Merhabalar,
      Aynı soyada sahip birinden yorum gelince başta şaşırdım :) Öneriniz için teşekkürler. Framework’lere geçiş yapmak istiyorum ama bir türlü zaman ayıramadım. Sizin sitenize de gözatma fırsatım oldu. Faydalanacağım kesin gibi duruyor.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.