Veri tabanından bilgi çekerken kalabalık sonuç kümeleri ile karşılaşacaksak sayfalama yapmak isteriz.
Sayfalama yaparken alışılagelmiş yöntemler kullanıyoruz. Veri tabanı ile çalışmış herkesin bu konuya aşina olduğuna eminim. Yine de yeni başlayanlar için bu işlemin mantığı üzerine birkaç satır karalamak istedim.
Kayıt eklenme sıklığı düşük olan veri kümeleri ile örneğin bunun gibi bir kişisel blog ile çalışıyorsak sayfalama işlemi sırasında veri kümesinin statik kalacağını varsayabiliriz. Sunduğumuz veri listesinin, kullanıcı ziyareti süresince değişmeyeceği kabulüyle yola çıkmanın verdiği iki önemli kolaylık vardır:
Bu tür bir sayfalama işlemi için benim tercih ettiğim yöntem kabaca şöyle:
<?php /* Veri tabanımıza bağlanalım */ $vt = new mysqli($sunucuAdi, $kullaniciAdi, $sifre, $veriTabaniAdi); /* Bir sayfada kaç kayıt listeleyeceğimizi belirleyelim */ $kayitSayi = 10; /* Kaçıncı sayfayı görüntülemekte olduğumuzu GET ya da POST ile ** göndermiş olmalıyız. Eğer gönderilmemişse ilk sayfayı ** görüntülüyor olmalıyız */ $sayfa = intval($_GET['sayfa'] ? $_GET['sayfa'] : 1); /* Sorgumuzu oluşturalım... ** Aslında basit sorgular için değişken oluşturmaya dahi gerek yok ** ancak ben, (özellikle uzun ve karışık sorgular yazacağımda) ** sorgunun çeşitli bölümlerini kod içinde ayrı ayrı ** kullanabilmek için genellikle birkaç değişken içinde toplama ** alışkanlığı kazandım. */ $sc = "SELECT alan1, alan2, alan3, alan4 "; // Select Clause $fc = "FROM tablo "; // From Clause $wc = "WHERE alan1 = 'bir şey' AND alan2 LIKE '%başka bir şey%' "; // Where Clause $tyyp = "ORDER BY alan1"; // Order Clause $lc = " LIMIT ".(($sayfa - 1) * $kayitSayi).", ".$kayitSayi; // Limit Clause /* Sorgumuzdan kaç kayıt döndüğüne bakalım. Benim tercih ettiğim yöntem şöyle: */ $toplamSayfa = ceil( intval( current( $vt->query("SELECT COUNT(*) ".$fc.$wc)->fetch_row() ) ) / $kayitSayi ); /* Bir diğer yöntem aşağıdaki gibi olabilir. Ancak ben bunu pek tercih etmiyorum ** çünkü ciddi bir süre farkı var. */ //--> $toplamSayfa = ceil($vt->query($sc.$fc.$wc)->num_rows / $kayitSayi); /* Artık sonuçlarımızın dökümüne başlayabiliriz. */ $ck = $vt->query($sc.$fc.$wc.$tyyp.$lc); // Cevap Kümesi ?> <div class="container"> <div class="row"> <div class="col-xs-12"> <h1>Sonuçlar</h1> <p> Görüntülenen Sayfa: <strong><?=$sayfa?> / <?=$toplamSayfa?></strong> </p> <table class="table table-striped table-hover"> <tr> <th>Alan1</th> <th>Alan2</th> <th>Alan3</th> <th>Alan4</th> </tr> <?php while($satir = $ck->fetch_assoc()) { ?> <tr> <td><?=$satir['alan1']?></td> <td><?=$satir['alan2']?></td> <td><?=$satir['alan3']?></td> <td><?=$satir['alan4']?></td> </tr> <?php } ?> </table> </div> </div> </div> <div class="container"> <div class="row"> <div class="col-xs-12 text-center"> <ul class="pagination inline"> <li class="<?=$sayfa == 1 ? 'disabled' : ''?>"> <a href="?sayfa=<?=$sayfa - 1?>">«</a> </li> <?php for($i = 1; $i <= $toplamSayfa; $i++) { ?> <li class="<?=$sayfa == $i ? 'active' : ''?>"> <a href="?sayfa=<?=$i?>"> <?=$i?> </a> </li> <?php } ?> <li class="<?=$sayfa == $toplamSayfa ? 'disabled' : ''?>"> <a href="?sayfa=<?=$sayfa + 1?>">»</a> </li> </ul> </div> </div> </div>
Açıklama: Aslında kod gayet basit. Hangi sayfada olduğumuzu ve bir sayfada kaç kayıt görüntüleyeceğimizi biliyoruz. Bu durumda istediğimiz sorguyu, hangi kayıt aralığını görüntülemek istediğimize göre bir LIMIT clause'u (cümleciği) ekleyerek oluşturup "while" döngüsü ile HTML'ini yazdırıyoruz. Yine toplam kaç sayfamız olduğunu bildiğimiz için tüm sayfalara linkler içeren bir sayfalama listesini de rahatlıkla bir "for" döngüsü ile oluşturabiliyoruz. Burada benim önemsediğin tek konu bir sayfada kaç satır olacağını belirlediğimiz değişken. Bu değeri bir değişkene atamak sayesinde ister kodda başkaca hiçbir satıra dokunmaksızın satır sayısını değiştirebilir, istersek kullanıcıya böyle bir opsiyon sunabiliriz...
Elbette eğer veri tabanımıza sıklıkla yeni kayıtlar ekleniyorsa kullanıcının ziyareti süresinde sonuç kümesindeki kayıt sayısının değişeceğini öngörmek ve kodumuzu buna göre yazmak gerekir. Bu noktada pointer (işaretçi) mantığı devreye girer. Ama bunu başka bir yazıda ele alırız...
Not: Örnek kodun HTML bölümü Bootstrap ile kullanılacağı varsayılarak yazılmıştır.