Php-Mysql veritabanı sayfalama işlemi
7120 3

Sayfalama dediğimiz şey aslında listeleme işlemi ve biz bunu SELECT deyimi ile yapmıştık. Fakat ben tüm kayıtları tek seferde listelemek istemiyorum! Beşer beşer listelemem gerekiyorsa nasıl yaparım? işte bu sayfalama işleminin tanımı oluyor. Öncelikle bu işlemi sql'de nasıl yaparız onu açıklayalım sonra php kısmına geçelim.

Sql ifadesinde SELECT deyimi ile kullanacağımız yeni bir deyimden bahsedeceğim. Yeni deyimimiz "LIMIT", bu deyim sayesinde istediğimiz kadar kayıt çekebilir veya istediğimiz kayıttan başlayıp istediğimiz kadar kayıt çekebiliriz. Tekerleme gibi oldu Çok Mutlu 

Örnek bir tablo oluşturalım ve adı "ogrenciler" olsun.

id ad_soyad okul_no yas cinsiyet
1 Zeynep Çimen 125 15 Bayan
2 Emrah Yalaz 127 16 Erkek
3 Ahmet Topuz 128 15 Erkek
4 Elif Duman 130 16 Bayan
5 Hasan Durmaz 132 17 Erkek

Bu tabloyu referans alarak birkaç sorgu oluşturalım. 

SELECT * FROM ogrenciler LIMIT 3
id ad_soyad okul_no yas cinsiyet
1 Zeynep Çimen 125 15 Bayan
2 Emrah Yalaz 127 16 Erkek
3 Ahmet Topuz 128 15 Erkek

Bu sorgu ile 3 kayıt çekmiş olduk. Şöyle dersek;

SELECT * FROM ogrenciler LIMIT 2,3
id ad_soyad okul_no yas cinsiyet
3 Ahmet Topuz 128 15 Erkek
4 Elif Duman 130 16 Bayan
5 Hasan Durmaz 132 17 Erkek

Kayıtların "0" dan başladığını hatırlatarak, 3. kayıttan itibaren 3 kayıt getir demiş olduk, sonuçlar yukarıda. Hazır yeri gelmişken bir de "ORDER BY" deyiminden bahsedelim. Bu deyim ile kayıtlarınızı artan veya azalan sıralayabilirsiniz. Mesela "ad_soyad" alanında artan bir sıralama yapalım.

SELECT * FROM ogrenciler ORDER BY ad_soyad ASC
id ad_soyad okul_no yas cinsiyet
3 Ahmet Topuz 128 15 Erkek
4 Elif Duman 130 16 Bayan
2 Emrah Yalaz 127 16 Erkek
5 Hasan Durmaz 132 17 Erkek
1 Zeynep Çimen 125 15 Bayan

 

Sonuç tablodaki gibi olacaktır. Yani "ad_soyad" alanında a'dan z'ye artan bir sıralama, bunu "ASC" deyimi ile yaptık. Azalan bir sıralama için "ASC" yerine "DESC" yazmalıydık. Şimdi "LIMIT" ve "ORDER BY" deyimlerini aynı cümle içerisinde kullanalım.

SELECT * FROM  ogrenciler
ORDER BY ad_soyad ASC 
LIMIT 2 , 3
id ad_soyad okul_no yas cinsiyet
2 Emrah Yalaz 127 16 Erkek
5 Hasan Durmaz 132 17 Erkek
1 Zeynep Çimen 125 15 Bayan

 

Görüldüğü gibi hem sıralanmış hem de tablonun belirli bir kısmı alınmıştır. Bu bilgiler ışığında gelelim sayfalama işlemine.

Sayfalama işlemi için php'de GET yöntemini kullanacağız, yani sayfa bilgisini adres çubuğundan gönderip çekeceğiz. Az önce anlattığımız şekilde sorguyu hazırlayabilmemiz için bize lazım olacak verileri sayalım; listemiz toplam kaç sayfa olacak, şu anda hangi sayfadayız, kaçar kayıt listelenecek, bu bilgileri almamız veya hesaplamamız gerekmektedir. Öncelikle başlangıçta bize sayfa bilgisi gelmiyorsa sayfa değerini 1 yapalım ve hata olmasını engelleyelim.

if (isset($_GET["syf"])){
    $syf=$_GET["syf"];
}else{
	$syf=1;
}

Şimdi de bahsettiğim diğer değerleri bulalım;

$sorgu=mysql_query("select * from deneme");
$limit=5; //Kayıtlar kaçar kaçar listelenecek
$kayitSayisi=mysql_num_rows($sorgu); //Toplam Kayıt Sayısı
$sayfaSayisi=ceil($kayitSayisi/$limit); //Toplam Sayfa Sayısı
$baslangic=($syf*$limit)-$limit; //Hangi kayıttan başlanacak

Bu kısımda $limit ve $kayitSayisi değişkenlerinin ne olduğu ve nasıl bulunduğu ortada, $sayfaSayisi malumunuz toplam kaydı 1 sayfadaki kayıt sayısına böldüğümüzde çıkıyor. Burada ceil() fonksiyonu çıkan sonucu yukarı yuvarlamaya yarar. Yani 27 kaydımız var beşer beşer listeliyoruz. 27/5 = 5,4 yapacağından tamsayı olarak 5 sonucu çıkar. Fakat burada küsürat kısmı bize 6. sayfada da kayıt olduğunu söylüyor. Nitekim 26. ve 27. kayıtlar 6. sayfada olur. Biz de ceil kullanarak eğer küsürat varsa yukarı yuvarla diyerek sorunu çözüyoruz. $baslangic değeri de mevcut sayfanın ilk değerini temsil eder. Sayfa değerlerini yerine yazarak sağlamasını yapabilirsiniz. Örneğin 1 değeri gelirse sonuç 0 çıkar bu da ilk kayıt demektir veya 3 verirsek sonuç 10 olur ki bu da 3. sayfanın ilk kaydıdır. Eğer bunlar anlaşıldıysa sayfalama olayını çözdük demektir. Bu değerleri kullanarak sorgumuzu hazırlayalım ve listeleyelim.

$sorgu=mysql_query("select * from deneme order by id desc limit $baslangic,$limit");
echo "<table>";
echo '<tr>
<td>Ad</td><td>Soyad</td><td>E-Posta</td>
</tr>';
while($kayit=mysql_fetch_array($sorgu)){
    echo '<tr>';
	echo '<td>'.$kayit["ad"].'</td>';
	echo '<td>'.$kayit["soyad"].'</td>';
	echo '<td>'.$kayit["e_posta"].'</td>';
	echo '</tr>';
}
echo '</table>';

İstenen kayıtlar listelenmiş oldu. Fakat diğer sayfalara gidebilmek için şu anda adres çubuğuna tek tek yazmanız gerekir. Bunun yerine linkleri oluşturup tıklamalar ile sayfalar arasında dolaşabilirsiniz.

if ($sayfaSayisi>1){ //1'den fazla kayıt varsa
echo '<div class="sayfalama">';
for ($i=1;$i<=$sayfaSayisi;$i++){
    echo '<a href="index.php?sayfa=listele&syf='.$i.'"';
    if ($syf==$i){ echo 'class="syf_aktif"';}
    echo '>'.$i.'</a>';
}
echo '<div>';
}

Gördüğünüz gibi linkleri oluştururken GET metodu ile gönderilecek olan syf değerini ayarlıyoruz, en yukarda kontrolünü yapmıştık zaten. Bir de şu an hangi sayfadaysak ona aktif klasını atıyoruz ki hangi sayfada olduğumuz belli olsun.  aktif klasını css biçimleri ile ayarlayın.

Yorumlar
ultimateFB 1 yıl önce dedi ki;
Göz Kırpma Teşekkürler Hocam İşime Yaradı Cevapla
ugurja 8 ay önce dedi ki;
Merhaba, benim bir problemim var. Örneklediğiniz gibi bir tabloyu, veritabanından aldık ve ekranda duruyor. ama, benim bir veri tabanım daha var ve orda aynı isimlere karşılık gelen, daha detaylı bilgiler var. Örneğin, öğrenci notları, devamsızlıkları, resimleri vs. Ben, bu listede örneğin Enrah Yalaz ismine tıklayıp, açılacak başka bir tabloda onun detay bilgisini görmek istiyorum. Bunu nasıl yapabilirim? Şimdiden teşekkür ederim. Cevapla
admin 7 ay önce cevap verdi;
İki tablo arasında ilişki kuracak bir alanın olmalı. Buna da yabancı anahtar diyorlar. İlk oluşturduğun tablodaki birincil anahtarı diğer tabloda kullan ve bu alan üzerinden 2. tablodaki bilgilere ulaş.
^
X