PHP ile sayfalama mantığı

php PHP ile sayfalama mantığıUzuuuuun bir aradan sonra ilk yazım ile tekrar buradayım şu sıralar çok fena yoğunluğum var. Hemen konuya giriyorum bir kaç arkadaş sormuştu onlar için yazıyorum. Bu arada bilmeyenlerde öğrenmiş olur…


İlk olarak her sayfada kaç adet veri listelemek istiyorsak onu belirliyoruz.Bunu da bir değişkene atayarak yapacağız.

1
$limit = 10;

Burada her sayfada 10 adet veri listele dedik.
Şimdi; sayfalamanın çalışması için tarayıcıdan gelecek olan string değişkeni belirliyoruz,

1
$sayfa = $_GET["sayfa"];

Bu tarayıcı adresini belirledik ama art niyetli kişiler yada tarayıcıda oluşabilecek bir hatada ötürü değişkene atanacak farklı bir sayı yada harf dizisi için bir önlem almamız gerekiyor.
Bunu da;

1
2
if(($sayfa=="") or !is_numeric($sayfa)){
$sayfa=1; }

kodu ile “eğer sayfa değişkeni boş yada sayısal olamayan bir değer ise değişkene 1 sayısını ata” diye söyledik.
Sobraki yapacağımız işlem veri tabanımızda bulunan satır satısını almak olacak bunu da aşağıda ki sorgu ile alıyoruz;

1
$satirsayisi = mysql_num_rows(mysql_query("SELECT * FROM veritablosu"));

Toplam kaç adet sayfa olduğunu hesaplamamız gerekiyor bunu aşağıda ki kod ile yapacağız.

1
$toplamsayfa = ceil($satirsayisi / $limit);

Burada fonkiyon içerisinde dedik ki “satır sayısını al sayfada göstermek istediğim sorgu adedine böl”
ceil() fonkiyonu ise şu işe yarıyor. diyelikmi veri tabanınızda 54 satır var her safaya 10 veri listelemek istiyorsunuz. 54/10 = 5,4 olursa ne olur olmaz işte burada ceil() foksiyonu bu 5,4 sayısını bir üst sayıya yuvarlar yani 6 sayısını toplam sayfa olarak verdirir.
Şimdi yapacağımız işlem; her sayfa da ilk listelenecek olan veriyi belirlemek. yani ilk sayfada 1-10 arası veriyi listeledik ikinci sayfaya geçtiğimizde 11-20 arasındaki veriyi listelemesi için bir başlangıç değeri belirtmemiz gerekiyor. bunu da aşağıda ki kod ile belirliyoruz.

1
$baslangic= ($sayfa-1) * $limit;

Şimdilik sayfalandırma kodlarımız bitti bundan sonra yapacağımız işlem ’dan veri çekerek listelememizi yapmak ama bunu yaparken dikkat etmemiz geerk n iki yer var bunları sorguyu yazdığımda anlayacaksınız.
Sorgu şöyle oalcak

1
$sorgu = mysql_query("SELECT * FROM veritablosu LIMIT $baslangic,$limit");

Üstteki sorguda başlangıç ve limit değişkenlerinin neden ve nasıl kullanıldığını görüyorsunuz. Bundan sonra normal while dögüsü ile veri listeleme islemimizi yapıyoruz.
Kodları uyguladık ve listelememizi yaptık,
Şimdi yapacağımız işlem sayfalandırma linklerini vermek onuda aşağıdaki şekilde for dögüsü kullanarak yapıyoruz. Bu kodları istediğiniz herhangi bir yere linkleriniz nerede görünmesini istiyorsanız ekleyebilirsiniz.

1
2
3
4
5
for($x=1; $x< =$toplamsayfa; $x++)
{
  if($x=="1") {echo"<strong><span style="font-size: x-small;">1</span>";}
else{ echo"<a href="\"><strong><span style="font-size: x-small;">$x</span>&lt; </strong></a></strong>-";}
}

İnşallah anlaşılır olmuştur.

Kodları toparlayacak olursak;

veri çekme kodları

1
2
3
4
5
6
7
8
$limit = 10;
$sayfa = $_GET["sayfa"];
if(($sayfa=="") or !is_numeric($sayfa)){
 	 $sayfa=1; }
$satirsayisi = mysql_num_rows(mysql_query("SELECT * FROM veritablosu"));
$toplamsayfa = ceil($satirsayisi / $limit);
$baslangic= ($sayfa-1) * $limit;
$sorgu = mysql_query("SELECT * FROM veritablosu LIMIT $baslangic,$limit");

link kodları

1
2
3
4
5
for($x=1; $x&lt; =$toplamsayfa; $x++)
{
  if($x=="1") {echo"<strong><span style="font-size: x-small;">1</span>";}
else{ echo"<a href="\"><strong><span style="font-size: x-small;">$x</span></strong></a>-";}
}</strong>

Sorunu olan yada yapamayanlara elimden geldiğince destek vermeye çalışırım.
Saygılar…

(4.40)Çok KötüKötüİdare EderİyiÇok İyi
Loading ... Loading ...
EkleBunu Sosyal Paylaşım Butonu

Bu yazı 2 Ağustos 2009 tarihinde Mustafa tarafından Güncel, PHP kategorisi altına yazılmış ve 3,961 Kişi okumuş defa okunmuş.

Mustafa

9 Yorum yapılmış...

  • emrah mert
    12 Mart 2009 |

    Merhaba, konuyu açıkladığınız için çok teşekkürler. Yalnız şöyle bir eksiklikten bahsedeyim size. Diyelim ki verilerimiz iki durumlu. Birincisi onay bekleyenler, ikincisi onaylananlar. Şimdi ben onay bekleyenleri sayfalayarak listeledim. Kullanıcı listeden üç tanesini ajax yardımıyla liste kaybolmadan onayladı. Yani listede şu an yedi onay bekleyen, üç de onaylı kayıt görünüyor. Sonra kullanıcı bir sonraki sayfaya geçmek istedi. Veriler yeniden çekildiğinde 11-20 arası kayıtlar çekildi. Yeni gelen bu 10 kayıt, bir önceki listeleme işleminde 14-24 arası kayıttı. Çünkü 11-14 arası kayıtlar ilk sayfanın elemanıymış gibi algılandı. Çünkü veritabanında değişiklik oldu. Bunu çözmek için tüm verileri tek seferde çekip, bir yerde saklamalı ve yeni bir istek geldiğinde sıradaki 10 taneyi göndermeliyiz.

  • 13 Mart 2009 |

    Bu dediğiniz de olabilir ancak kişi ajax teknolojisini programlayacak kadar bu konuda uzamansa. Listelenen satırlar kaldırıldığında yine ajax ile o sayfayı tamamlayacak ve sayfalamada da ajax kullanacaktır. Bunun için o bir yerde saklama olayıda yine ajax ile olacaktır. Ben bu anlatımı yeni başlayan birkaç arkadaşın gönderdiği istek üzerine yaptım. Zaten aslına satır sayısıda o şekilde alınmaz. Bu şekilde satır sayısı alma büyük veri tabanlı listelemelerde mysql’u çok yoracaktır. Yani eksiklik sadece sizin bahsettiğiniz değil. Ama teşekkür ederim bahsettiğiniz için okuyanlar bu şekilde de bri araştırma yapacaktır…

  • Mehmet
    16 Haziran 2009 |

    sayfalama link kodunda hata veriyor

  • 18 Haziran 2009 |

    Ne gibi bir hata veriyor yazarsanız bakayım.

  • Fikret
    21 Temmuz 2009 |

    Çok teşekkürler.Sayenizde yeni birşey öğrendim.Emeğinize sağlık.

  • 04 Eylül 2009 |

    çok güzel örnek ve anlatım olmuş. ellerine sağlık emeğine teşekkürler. php yi herkez böyle anlatsa öğrenmeyen kalmaz..

  • mehmet
    17 Ekim 2009 |

    kodlar hata veriyor özellikle get globaliyle aldığımız sayfa indexi nerede tanımlanan bir index bu index tanımlanmadan nasıl get metoduyla bunu alabiliriz…

  • albayoneil (stargate)
    17 Ekim 2009 |

    Kardeş eline ve diline sağlık çok teşekkür ederim.

  • 11 Kasım 2009 |

    oldukça yararlı oldu benim için.teşekkürler.

Tepki verin!

Aşağıdaki kutucuğa e-posta adresinizi girin sitemize yeni eklenen içerikten haberdar olun...

RSS okuyucu ile takip edin...

    No public Twitter messages.