İçerikleriniz çoğaldı, bayağı kaynağınız ve birikiminiz oldu. Ve artık bunları sayfalamanın zamanı geldi. MySQL veritabanı tablosu verileri ile sayfalama yapımı anlatacağım bu yazıda genel sayfalama mantığını anladıktan sonra başka kaynaklardan gelen (array, xml, vs.) verilerle de sayfalama yapabileceğinize inanıyorum.

Toplam sayfa sayısını bulmak

Sayfalama olayına öncelikle toplam sayfa sayısını bulmakla başlayalım. Bu işlem için toplam içerik sayısını bir sayfada göstereceğimiz içerik sayısına böleceğiz, çıkan sonucu ise ceil fonksiyonu ile yukarı yuvarlayacağız.

$sayfada = 5; // sayfada gösterilecek içerik miktarını belirtiyoruz.
$sorgu = mysql_query('SELECT COUNT(*) AS toplam FROM mesajlar');
$sonuc = mysql_fetch_assoc($sorgu);
$toplam_icerik = $sonuc['toplam'];
$toplam_sayfa = ceil($toplam_icerik / $sayfada);

Buradaki ince noktalardan birisi yukarı yuvarlamak. Diyelim her sayfada 5 içerik istiyoruz ve 12 içerik var, bu durumda (12 / 5 = 2.4), ceil fonksiyonu ile bu rakamı 3’e yuvarlıyoruz. Eğer normal round fonksiyonunu kullanırsak böyle bir durumda 2 sayfamız olur ve son 2 içerik görünmez.

Eğer çok fazla içeriğiniz varsa, her sayfada toplam içerik sayınızı sayan bu SQL sorgusunu çalıştırmak yerine bir şekilde cache uygulayıp oradan okutmanız performans açısından daha faydalı olacaktır.

Sayfanın içeriğini listelemek

Bir sayfada ne kadar içerik olacağını belirledik, şimdi gelelim bulunduğumuz sayfaya göre içeriklerimizi listelemeye. Bu noktada artık kullanıcı tarafından sayfa sayısını almanın zamanı geldi. Ben örneğimde “sayfa” GET verisi ile alacağım, yani index.php?sayfa=2 şeklinde olacak. İsterseniz “s”de idealdir.

// eğer sayfa girilmemişse 1 varsayalım.
$sayfa = isset($_GET['sayfa']) ? (int) $_GET['sayfa'] : 1;
// eğer 1'den küçük bir sayfa sayısı girildiyse 1 yapalım.
if($sayfa < 1) $sayfa = 1;
// toplam sayfa sayımızdan fazla yazılırsa en son sayfayı varsayalım.
if($sayfa > $toplam_sayfa) $sayfa = $toplam_sayfa;

Eklediğimiz bu ufak koşullar ile geçersiz yazılan sayfa numaralarından doğacak olan hataları da engellemiş oluyoruz. Ayrıca değişkeni tanımlarken başına (int) eklememiz sayı haricinde yapılan girişleri geçersiz kılıyor. Bu ifadeyi NO, ID gibi dışardan gelen verileri çekerken de kullanabilirsiniz.
Hangi sayfada olduğumuzu da belirlediğimize göre artık içeriklerimizin istenilen kısmını listeleyebiliriz.

// kaçıncı içerikten başlanacağını ifade edecek limit değeri.
$limit = ($sayfa - 1) * $sayfada;
$sorgu = mysql_query('SELECT * FROM mesajlar LIMIT ' . $limit . ', ' . $sayfada);
while($icerik = mysql_fetch_assoc($sorgu)) {
   // ...
}

Sanırım kilit ve kafa karıştıran noktası burası. LIMIT ifadesi ile tüm içerikler arasından bizim istediğimiz adet ve aralıktaki içerikleri istiyoruz. Normalde sadece “LIMIT 10” dediğimizde 10 adet içerik verir. Fakat virgül ile ikinci bir sayı daha girdiğimizde kaçıncı sıradan sonra vereceğini ifade eder.
Yani “LIMIT 0, 5” dediğimizde 0. içerikten yani ilk içerikten sonra 5 tane ver diyoruz, bu bizim ilk sayfamız oluyor. 2. sayfa için “LIMIT 5, 5” yani 5. içerikten sonra 5 tane göster diyoruz. 3. sayfa için “LIMIT 10, 5”. Bu ifade için “($sayfa – 1) * $sayfada” işlemimizi yapıyoruz.

Sayfa sayılarını gösterme

Son olarak en alta sayfa sayılarını göstereceğiz. Bunun için döngü ile toplam sayfa sayısı kadar link oluşturacağız. Ayrıca bulunduğumuz sayfayı da dikkate alarak o sayfayı yazarken link yapmayacağız.

for($s = 1; $s <= $toplam_sayfa; $s++) {
   if($sayfa == $s) { // eğer bulunduğumuz sayfa ise link yapma.
      echo $s . ' ';
   } else {
      echo '<a href="?sayfa=' . $s . '">' . $s . '</a> ';
   }
}

Sonuç

Şimdi tüm hepsine bir arada bakalım ve daha rahat anlayalım.

$sayfada = 5; // sayfada gösterilecek içerik miktarını belirtiyoruz.
$sorgu = mysql_query('SELECT COUNT(*) AS toplam FROM mesajlar');
$sonuc = mysql_fetch_assoc($sorgu);
$toplam_icerik = $sonuc['toplam'];
$toplam_sayfa = ceil($toplam_icerik / $sayfada);
$sayfa = isset($_GET['sayfa']) ? (int) $_GET['sayfa'] : 1;
if($sayfa < 1) $sayfa = 1;
if($sayfa > $toplam_sayfa) $sayfa = $toplam_sayfa;
$limit = ($sayfa - 1) * $sayfada;
$sorgu = mysql_query('SELECT * FROM mesajlar LIMIT ' . $limit . ', ' . $sayfada);
while($icerik = mysql_fetch_assoc($sorgu)) {
   // ...
}
for($s = 1; $s <= $toplam_sayfa; $s++) {
   if($sayfa == $s) { // eğer bulunduğumuz sayfa ise link yapma.
      echo $s . ' ';
   } else {
      echo '<a href="?sayfa=' . $s . '">' . $s . '</a> ';
   }
}

Çok daha fazlası

Yukarıda anlattığım bu yöntem ile artık içeriklerinizi sayfalı yapabilirsiniz. Ama biraz ileri görüşlü olursak ya da elimizde çook fazla içerik ve bu nedenle yüzlerce sayfamız varsa; 1’den 200’lere kadar çok uzun sayfalar bağlantımız olur. Hem çirkin hem de kullanıcı dostu olmayan bir görüntü ile karşılaşırız. Bunu önlemek için ne kadar çok sayfamız olursa olsun kullanıcını o an kaçıncı sayfada ise ona ilaveten sonraki ve önceki 5-10 sayfayı göstermeliyiz. Yani şu şekilde;

<<İlk sayfa <Önceki 35 36 37 38 [39] 40 41 42 43 Sonraki> Son sayfa>>

Ben bu olay için bir kod bloğu hazırladım, bunu direkt çalışmanıza dahil edip kullanabilir ya da inceleyip daha farklı versiyonlarını yazabilirsiniz. Dikkat edilmesi gereken nokta; bu yöntemin doğru ve güzel çalışması için $sayfa_goster değerine her zaman tek sayı girin. Bu sayede kullanıcı bulunduğu sayfayı yukarıdaki örnekteki gibi ortada görür.

// yukarıdan geldiği varsayılan değişkenler:
// $toplam_sayfa ve $sayfa
$sayfa_goster = 11; // gösterilecek sayfa sayısı
$en_az_orta = ceil($sayfa_goster/2);
$en_fazla_orta = ($toplam_sayfa+1) - $en_az_orta;
$sayfa_orta = $sayfa;
if($sayfa_orta < $en_az_orta) $sayfa_orta = $en_az_orta;
if($sayfa_orta > $en_fazla_orta) $sayfa_orta = $en_fazla_orta;
$sol_sayfalar = round($sayfa_orta - (($sayfa_goster-1) / 2));
$sag_sayfalar = round((($sayfa_goster-1) / 2) + $sayfa_orta);
if($sol_sayfalar < 1) $sol_sayfalar = 1;
if($sag_sayfalar > $toplam_sayfa) $sag_sayfalar = $toplam_sayfa;
if($sayfa != 1) echo ' <a href="?sayfa=1">&lt;&lt;İlk sayfa</a> ';
if($sayfa != 1) echo ' <a href="?sayfa='.($sayfa-1).'">&lt;Önceki</a> ';
for($s = $sol_sayfalar; $s <= $sag_sayfalar; $s++) {
    if($sayfa == $s) {
        echo '[' . $s . '] ';
    } else {
        echo '<a href="?sayfa='.$s.'">'.$s.'</a> ';
    }
}
if($sayfa != $toplam_sayfa) echo ' <a href="?sayfa='.($sayfa+1).'">Sonraki&gt;</a> ';
if($sayfa != $toplam_sayfa) echo ' <a href="?sayfa='.$toplam_sayfa.'">Son sayfa&gt;&gt;</a>';

 

Shares:

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir