Toplam sayfa sayısını bulmak
Öncelikle veritbanındaki tüm verileri saydırmamız gerekiyor. Toplam veri sayısını bulduktan sonra anasayfada sayfa başına görünecek yazı adedini seçeceğiz. Toplam yazıyı sayfa başına görüntülenecek yazı miktarına ceil fonksiyonu yardımıyla bölüp yuvarlayacağız.$sayfada = 7; // sayfa başına içerik miktarı $sorgu = mysql_query('SELECT COUNT(*) AS toplam FROM icerik'); $sonuc = mysql_fetch_assoc($sorgu); $toplam_icerik = $sonuc['toplam']; $toplam_sayfa = ceil($toplam_icerik / $sayfada);Dikkatinizi çeken nokta elbette ceil fonksiyonu.Bunun neden kullandığımıza değinecek olursak , bu fonksiyon bölümde meydana çıkan sayıyı yuvarlıyor. Örnek olarak biz 7’şer sayfalama yaptık ama eğer 16 içeriğimiz var ise (16/7=2,1…) yani virgüllü tam sayı olmayan bir sonuç çıkacak. Ceil ile bunu yukarıya yuvarlıyoruz. Eğer round fonksiyonunu kullanırsak aşağı doğru yuvarlar ve bazı içerikler görünmeyebilir. Şayet çok fazla içerik var ise her sayfada normal sql sorgusu ile toplam içerik saysını bulmak yerine cache uygulayıp oradan okumanız performans bakımından daha faydalı olacaktır.
Sayfa içeriğini listelemek
Artık kullanıcıdan sayfa değerini alma zamanı geldi. Sayfa başına düşecek yazı sayısını ayarladıktan sonra şimdi ise içeriği listeleyeceğiz. Şimdi sayfa değerini GET parametresi ile kullanıcıdan “sayfa” olarak alacağız.// Sayfa değeri boş ise 1 olarak belirlensin $sayfa = isset($_GET['sayfa']) ? (int) $_GET['sayfa'] : 1; // 1'den küçük bir sayfa değeri girildiyse 1 olsun. if($sayfa < 1) $sayfa = 1; // Toplam sayfa miktarından fazla bir değer girilirse son sayfa baz alınsın. if($sayfa > $toplam_sayfa) $sayfa = $toplam_sayfa;Bu kullanım sayesinde de artık yanlış girilen url’lerden doğacak hatalara dur diyoruz. Artık kullanıcı bir şekilde ne yaparsa yapsın bizim anasayfamıza düşecek.Ayrıca sayfaya int değeri tanımlamamızın bize faydası şu olacak ; değer sayı dışında girilemeyecek.Artık bulunduğumuz sayfayı belirledik , içerikleri alma vakti geldi.
// Kaçıncı içerikten başlanacağını ifade eden limit değeri. $limit = ($sayfa - 1) * $sayfada; $sorgu = mysql_query('SELECT * FROM icerik LIMIT ' . $limit . ', ' . $sayfada); while($icerik = mysql_fetch_assoc($sorgu)) { // ... }Bu noktada açıklama yapmak da zor mantık kurmak da ama basit aslında. İlk başta sayfa başına gösterilecek yazı adedini belirlemiştik.Limit değerini normal “5” olarak girdiğimizde sayfada “5” adet yazı görünür ama burada ilk belirlediğimiz değere göre yazı çıkacak.Virgül ile ayırmamızın sebebi ise kaçıncı sayfadan itibaren kaç adet gösterileceğini belirlemektir. 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
Şimdi sayfa sayılarını gösterme zamanı geldi. Bir sayfalama işlemi varsa sayfanın altında sayfa sayılarını gösteren linklerde olur. Şimdi bir for döngüsü ile bulunduğumuz sayfayı da baz alarak bir listeleme işlemi yapacağız.for($s = 1; $s <= $toplam_sayfa; $s++) { if($sayfa == $s) { // Bulunduğumuz sayfa değeri ise link vermeyelim. echo $s . ' '; } else { echo '<a href="?sayfa=' . $s . '">' . $s . '</a> '; } }İşte bu kadar böylece temel anlamda basit bir sayfalama işlemi yapmış olduk.Şimdi sonuç olarak ortaya ne çıktı bir bakalım.
$sayfada = 5; // sayfada gösterilecek içerik miktarı. $sorgu = mysql_query('SELECT COUNT(*) AS toplam FROM icerik'); $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 icerik LIMIT ' . $limit . ', ' . $sayfada); while($icerik = mysql_fetch_assoc($sorgu)) { // ... } for($s = 1; $s <= $toplam_sayfa; $s++) { if($sayfa == $s) { // eğer bulunduğumuz sayfada ise link bir şey yapma echo $s . ' '; } else { echo '<a href="?sayfa=' . $s . '">' . $s . '</a> '; } }
Bunlara Ek Olarak
Ek olarak bildiğiniz gibi bu sistemi kullanırsak yüz sayfa olduğunu düşünün , oldukça kötü bir görüntü ortaya çıkacaktır.<<İlk sayfa <Önceki 35 36 37 38 [39] 40 41 42 43 Sonraki> Son sayfa>>Sayfa sayılarını daha dinamik gösteren yöntem için aşağıdaki paylaşıma bakabilirsiniz.Sayfa göster değerine her zaman tek sayı girmeniz sizin için daha iyi olur. Yani yukarıdaki gibi kullanıcı bulunduğu sayfayı direk tam ortada görsün.
$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"><<İlk sayfa</a> '; if($sayfa != 1) echo ' <a href="?sayfa='.($sayfa-1).'"><Ö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></a> '; if($sayfa != $toplam_sayfa) echo ' <a href="?sayfa='.$toplam_sayfa.'">Son sayfa>></a>';Bu kullanım da yetersiz olursa yani içeriğiniz daha fazla ise şu adresteki linki ziyaret edebilir ve slayta bakarak daha basit ve dinamik bir sayfalama yapabilirsiniz.
Yararlandığım Kaynak https://www.phpr.org/php-ile-sayfalama/