PHP Sayfalama ve Dinamik Sayfalama Butonları Yapımı

Herkese merhaba, bu dersimde PHP’de sayfalama işleminin nasıl yapıldığını ve dinamik sayfalama butonlarını nasıl yapacağımızı anlatacağım. Dinamik sayfalama butonları ne kadar doğru bir ifade bilemiyorum. Kısaca bu butonların özelliğinden bahsedecek olursak şöyle anlatabilirim:

Diyelim ki sizin yaklaşık 300 sayfa veriniz var. Bu verileri listelerken eğer her sayfa için bir buton koyarsanız doğal olarak 300 tane buton web sitenizde oldukça fazla yer kaplayacaktır. Bunun yerine sadece o an bulunduğunuz sayfadan önceki 5 sayfayı ve sonraki 5 sayfayı göstermeniz çok daha mantıklı ve güzeldir. Yazıyı okumadan önce isterseniz bu konu hakkında çekmiş olduğum video dersi de izleyebilirsiniz:

Bu sayfalama butonlarını tam anlayamadıysanız uzmancevap.org adresinde anasayfadaki sayfalamaya bakabilirsiniz. Siz sayfa değiştirdikçe sayfalama butonlarında gösterilen aralık da değişecek.

Şimdi önce sayfalama işleminin nasıl yapıldığını anlatarak başlayayım.

PHP İle Sayfalama Yapımı

Sayfalama işlemi son derece önemli bir işlemdir. Binlerce veriyle uğraşırken hepsini tek bir yere koyamadaığınızda önemini anlayacaksınız. Ben burda şimdi anlatacağım, siz de ‘vay efendim sunucu neden bu kadar yavaş o kadar da para ödüyoruz, bi veritabanı işlemini yapamadı’ falan demeyin. Hadi başlayalım. Öncelikle temel MySQL bilginiz olduğunu varsayıyorum. Öncelikle basit bir veritabanı oluşturalım. Benim Youtube adında bir veritabanım var ve bu veritabanımın içerisinde de dersler adında bir tablo var. Tablom iki alandan oluşuyor, ders_id ve ders_baslik. Buyrun bu da verilerle beraber tablonun SQL kodları.

dersler | CREATE TABLE `dersler` (
  `ders_id` int(11) NOT NULL AUTO_INCREMENT,
  `ders_baslik` varchar(110) NOT NULL,
  PRIMARY KEY (`ders_id`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8

Tablomuz oluştu şimdi verilerimizi ekleyelim.

INSERT INTO `dersler` (`ders_id`, `ders_baslik`) VALUES
(1, 'PHP - SMS İle Üye Doğrulama Sistemi'),
(2, 'Swift Genel Bakış - Bölüm 1 - Değişkenler ve Sabitler'),
(3, 'JQuery İle Akordiyon Menü Yapımı'),
(4, 'PHP Üye Giriş ve Profil Ayarları Uygulaması'),
(5, 'PHP Yazmanızı Kolaylaştıracak İpuçları'),
(6, 'Linux''a PHP Apache Ve MySQL Kurulumu'),
(7, 'PHP Detaylı PDO Kullanımı'),
(8, 'PHP İle İndirme İşlemine Hız Sınırı Koymak'),
(9, 'CSS İle Yazının İlk Harfini Değiştirmek'),
(10, 'CSS İle Nesneleri Dikey Ortalama'),
(11, 'CSS & JQuery İle Material Buton Yapımı'),
(12, 'JQuery Ve CSS İle Material Input Yapımı'),
(13, 'JQuery WaveSurfer İle MP3''leri Ses Dalgası Olarak Göstermek'),
(14, 'Onedio Tarzı Resim Karşılaştırma - CSS Clip Örnek Uygulama'),
(15, 'CSS Akordiyon Menu Yapimi'),
(16, 'CSS 3 Degisen Arkaplan Yapimi'),
(17, 'PHP Referans Operatoru Kullanimi'),
(18, 'PHP Facebook Benzeri Grup Sistemi Mantigi'),
(19, 'Linux Minte Dock Kurulumu'),
(20, 'Linux Mint Uzerinde Htaccess Etkinlesirmek'),
(21, 'JQuery Eklenti Gunleri Sweet Alert Eklentisi'),
(22, 'FancyBox - JQuery Eklentisi'),
(23, 'CSS Parallax Efekti Yapimi'),
(24, 'Web Tasarıma Nasıl Başlanır ?'),
(25, 'Temel MySQL #3 – Veritabanlarını, Tabloları ve Alanları Listelemek'),
(26, 'Temel MySQL #2 – MySQL’e Bağlanmak'),
(27, 'CSS Sonraki (+) Seçicisi'),
(28, 'Temel MySQL #1 – MySQL Kurulumu'),
(29, 'Az Kullanılan Mükemmel CSS Özelliği: Inherit'),
(30, 'Nerede Kullanılır: gettype() settype() unset()'),
(31, 'Metod, Fonksiyon ve Prosedür Arasındaki Farklar'),
(32, 'PHP Detaylı PDO Kullanımı #2');

Veritabanımda toplamda 32 tane dersim var. Şimdi şöyle bir şey yapalım ve bu dersleri her sayfada 5 ders olacak şekilde listeleyelim. Öncelikle index.php dosyamızı oluşturalım ve hemen kısa bir veritabanı bağlantısı kuralım.

index.php

<?php
try {
    $db = new PDO("mysql:hostname=localhost; dbname=youtube; charset=utf8;", "root", "veritabani_sifresi");
}catch(PDOException $e) {
    die($e->getMessage());
}

$query = $db->query("SELECT * FROM dersler");
$dersler = $query->fetchAll(PDO::FETCH_ASSOC);

// Toplam sayfa sayisini elde etmek icin toplam veri sayimizi bilmemiz gerekiyor.
$query2 = $db->query("SELECT COUNT(ders_id) as toplamDers FROM dersler");
$toplamDers = $query2->fetch(PDO::FETCH_ASSOC)['toplamDers'];

Buraya kadar her şey tamam. Şu an verilerimizi düzgün bir şekilde çekiyoruz, şimdi bu verileri nasıl sınırlandırabileceğimize bir bakalım. Bu işlem için SQL’de LIMIT konusunu bilmeniz gerekiyor. Şu an tam olarak da bunu anlatacağım ama önce kendi orjinal dökümantasyonunun linkini vereyim. Bu linkten temel kullanımına ve ekstra özelliklerine bakabilirsiniz. Şimdi ben burda nasıl kullanacağımızı anlatayım. SQL sorgumuzun en sonuna LIMIT diyoruz ve kaç tane veri göstermek istediğimizi yazıyoruz. Örnek olarak

SELECT * FROM dersler LIMIT 5

Bu kodu çalıştırdığımız zaman kaç tane verimiz olursa olsun en fazla 5 tane veriyi elde edebileceğiz. Bir şekilde daha kullanabiliriz bu LIMIT özelliğini. Onu da şöyle göstereyim.

SELECT * FROM dersler LIMIT 0, 5

Bu kodu çalıştırdığımızda da virgülün öncesinde yazdığımız sayının bir fazlasından başlayarak size virgülden sonra yazdığınız sayı kadar veri döndürür. Yani bu kodu çalıştırdığınızda size 1’den başlayarak 5 tane veri verecek (Veriverecek değil, veri verecek 😀 ). Şimdi sayfalama mantığından bahsedelim biraz da. Örnek vererek açıklayayım. Sayfa başına 5 veri göstereceğimizi varsayalım. 1. sayfadaysanız eğer 1 ile 5 arasındaki verileri göstermeniz gerekir. 2. sayfaya geldiğinizde 5 ile 10 arasındaki verileri göstermeniz gerekir. Şimdi bu iki sayfa için SQL kodlarımızı yazalım ki daha iyi anlayabilesiniz konuyu. Kullanıcı bizden 1. sayfayı istediği zaman şu SQL kodunu çalıştırırsak amacımıza ulaşmış oluruz.

SELECT * FROM dersler LIMIT 0, 5

1. sayfadaki verilerimizi göstermek için bu SQL kodumuz gayet uygun, şimdi ikinci sayfa üzerine biraz düşünelim. 1. sayfada ilk 5 veriyi gösterdiğimize göre ikinci sayfada da 6.veriden 10. veriye kadar verilerimizi listelememiz lazım. Bunun için de SQL kodumuzu şu şekilde yazabiliriz.

SELECT * FROM dersler LIMIT 5, 5

Bu kodu çalıştırdığımızda 6.’dan başlayarak toplamda 5 veri verecektir bize. SQL kısmında sistemin nasıl işlediğini anladıysanız problem kalmadı, şimdi sadece PHP ile LIMIT değerinden sonraki sayıları dinamik bir şekilde vereceğiz. Tabi bu işlem için öncelikle kullanıcıdan hangi sayfayı görüntülemek istediğini öğrenmemiz gerekiyor ki bunun için de GET metodu kullanabileceğimiz en uygun metod. Öncelikle varsayılan sayfamız 1. sayfa olduğu için sayfa adında bir değişken oluşturup bunun değerini 1’e eşitliyoruz. Eğer kullanıcıdan GET metodu ile alınan bir değer varsa ve bu değer sıfırdan büyük bir değerse bu sefer de sayfa değişkenimizin değerini bu değer ile değiştiriyoruz. Veritabanı bağlantı kodlarımızın hemen sonrasına bu kodları yazabilirsiniz.

$sayfa = 1;

if(isset($_GET['sayfa']) && $_GET['sayfa'] > 0) {
    $sayfa = $_GET['sayfa'];
}

Bu kod parçası sayesinde kullanıcı bize görmek istediği sayfayı söyleyebilecek ve eğer bizden geçersiz bir sayfa isterse de bu isteği bloke edip ilk sayfayı gösterebileceğiz.

Şimdi yukarda yazdığımız SQL sorgumuzu yenileyelim. Veritabanı bağlantımızı kurduğumuz satırdan sonra kullanıcıya hangi aralıktaki verileri göstereceğimizi belirleyen bir işlem yapacağız. Kodlarımızı verelim ve açıklayayım.

...
    $sayfa = $_GET['sayfa'];
}

$sayfaBasiVeri = 5;
// Burada yapmamiza gerek yok ama elimiz degmisken toplam sayfa sayisini da bulalim.
$toplamSayfaSayisi = ceil($toplamDers / $sayfaBasiVeri);
$limit = ($sayfa - 1) * $sayfaBasiVeri;

$query = $db->query("SELECT * FROM dersler LIMIT $limit, $sayfaBasiVeri");
...

Her şeyden önce toplamSayfaSayisi değişkenimizden bahsedelim. Bu değişkeni sayfalama butonlarını koyarken kullanacağız. Toplam sayfa sayımızı bulmak için toplam ders sayımızı sayfa başı gösterilecek veri sayısına bölüyoruz. Örnek olarak 30 verimiz varsa ve her sayfada 5 veri göstereceksek 30/5 işleminden toplamda 6 sayfamız olduğu sonucunu alıyoruz. Peki 32 verimiz olsaydı ? Bu sefer 2 veri artacağı için bir tane fazladan sayfaya ihtiyacımız olacaktı ama 32/5 işleminin sonucu da 6 olduğu için (PHP bize tam sayı sonuç veriyor) 7 sayfa olması gerekirken sadece 6 sayfa görecektik. İşte bu sorundan kurtulmak için de ceil fonksiyonunu kullandık ve eğer içine girilen değer tam sayı değil ise bir sonraki tam sayıya yuvarla dedik. Böylece toplam sayfa sayımızı da almış olduk. Şimdi kaldığımız yerden devam edelim. Bu işlemlerin sonrasında her sayfada kaç veri göstereceğimizin bilgisini tutan bir değişken oluşturup bu değişkene 5 değerini veriyoruz. Daha sonra koyacağımız limitte kaçıncı veriden başlayacağımızı belirlemek için ufak bir matematiksel hesaplama yapıyoruz. 2. sayfayı ele alırsak SQL sorgumuzun LIMIT kısmı şu şekilde olmalıdır.

SELECT * FROM dersler LIMIT 5, 5

Burada virgülden sonraki 5 değerimiz sayfa başı kaç veri göstereceğimiz bilgisi. Bunu zaten bir değişkene atamıştık. Virgülden önceki kısmı ele alalım şimdi de. Burası için de 2. sayfadayken 5 verisini elde etmemiz için şöyle bir işlem yapabiliriz: (2 – 1) * 5 . Burada 5 değeri sayfa başına gösterilecek veriyi ve 2 değeri de o anki sayfamızı temsil ediyor. İşlemimizi bu şekilde yaptığımızda: “$limit = ($sayfa – 1) * $sayfaBasiVeri” sistemimiz düzgün çalışıyor. İsterseniz sırayla SQL sorgularımızı simüle edelim.

1. sayfada olduğumuzu varsayalım. Sayfa başı gösterilecek veri sayımız da 5. Şimdi hesaplamamızı yapalım.

$limit = (1 – 1) * 5 oluyor ve SQL sorgumuz da şu hale geliyor.

SELECT * FROM dersler LIMIT 0, 5

Böylece ilk sayfamız için 0’dan başlayarak 5 tane veri çekmiş olduk. Şimdi 2. sayfada olduğumuzu varsayalım. Bu durumdaŞ

$limit = (2 – 1) * 5 oluyor ve SQL sorgumuz da tam olarak şöyle oluyor.

SELEC * FROM dersler LIMIT 5, 5

Böylece 5. veriden başlayarak 5 veri elde etmiş oluyoruz, yani 5 ile 10. arasındaki verileri elde etmiş oluyoruz. Hala inanmayanlar için 3. sayfayı da simüle edelim.

$limit = (3 – 1) * 5 oluyor ve SQL sorgumuzun son durumu şöyle oluyor.

SELECT * FROM dersler LIMIT 10, 5

Burada 10. veriden başlayıp 5 veri çekiyor ve bize 10 ile 15. arasındaki verileri veriyor.

Normal bir şekilde sayfalama işlemi bu şekilde yapılıyor. Şimdi de butonlarımızı ekleme işlemine bakalım.

Dinamik Sayfalama Butonları

Dersin başında da belirttiğim gibi ne kadar doğru bir ifade olduğunu bilmiyorum, daha güzel bir isim bulamadım. Neyse sistemimizi yapmaya başlayalım. Öncelikle bu sistemi bir inceleyelim. Kullanıcımız 1. sayfada ise 1, 2, 3, 4 ve 5. sayfalara giden butonları göstermemiz gerekiyor. Yani kısaca kullanıcının istediği sayfadan sonraki ve önceki 4 sayfayı göstereceğiz. Örnek olarak kullanıcımız bizden 10. sayfayı isterse bizim ona göstereceğimiz butonlar 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ve 15. sayfalar. Kuracağımız sistem de tam olarak bu şekilde olacak. Aslında kodlaması çok basit. Öncelikle yaptığımız işlemin çalışıp çalışmadığını görmek için PHP kodlarımızın altına bir ul etiketi oluşturalım ve burada derslerimizi bir foreach döngüsü ile ekrana yazdırabiliriz. Aşağıdaki kodlarımızı PHP etiketlerinizin hemen altına yazabilirsiniz. Açtığımız PHP etiketini kapatmayı unutmayın.

Verilerimizi listeleyeceğimiz kodlarımız aynen şu şekilde:

<ul>
  <?php foreach($dersler as $ders) { ?>
    <li><?php echo $ders['ders_id'].". ".$ders['ders_baslik']; ?></li>
    <?php } ?>
</ul>

Bu kodlarımız sayesinde veritabanımızdan çekmiş olduğumuz derslerimizi ul li içerisinde listeledik. Şimdi sayfalamamızın çalışıp çalışmadığını deneyelim. Ben localhost/youtube/sayfalama dizininde çalışıyorum. Adres çubuğuma http://localhost/youtube/sayfalama/index.php?sayfa=2 yazdığım zaman bana 5 ile 10. arasındaki verileri vermesi gerekiyor. Eğer şu ana kadar kodları düzgün yazdıysanız doğru sonuç vermesi gerekiyor.

Bu işlemi yapıp doğru sonucu aldıysak şimdi buton olayına geçelim. Butonlar için az sayfa olacak sitelerde genelde şöyle bir yöntem kullanılır.

<ul>
  <?php for($i = 1; $i <= $toplamSayfaSayisi; $i ++) { ?>
    <li><a href="?sayfa=<?php echo $i; ?>"><?php echo $i; ?></a></li>
  <?php } ?>
</ul>

Böylece 1’den başlayıp toplam sayfa sayısına giden bir döngü oluşturur ve 1, 2, 3… şeklinde sayfaları yazıp bunlara link verir. Ama bizim bu derste yapacağımız biraz daha farklı. Yukarda zaten bizim yapmak istediğimiz sistemi anlattım o yüzden şimdi sadece kodları verip açıklayacağım. İşte sayfalama kodlarımız.

<ul>
<?php
$aralik = range($sayfa - 1, $sayfa + 1);
foreach($aralik as $sayfaSayisi) {
  if($sayfaSayisi <= 0 || $sayfaSayisi > $toplamSayfaSayisi) {
    continue;
  }
  echo '<li><a href="?sayfa='.$sayfaSayisi.'">'.$sayfaSayisi.'</li>';
}
?>
</ul>

Şimdi kodlarımızı açıklayalım. Öncelikle o an bulunduğumuz sayfadan bir küçük ve bir büyük sayılar arasında bir dizi kuruyoruz. Örnek olarak o an 4. sayfadaysak bize dönecek olan dizi [3, 4, 5] olacak. Elimizde az veri olduğu için aralığımızı küçük tuttuk. Sizde daha fazla veri varsa aralık değeri olarak 4 veya 5 gibi değerler verirseniz daha iyi olur. Sadece sistemin çalıştığını görmeniz için böyle küçük bir değer verdim. Daha sonra bu aralık dizimizdeki verileri foreach döngüsüne sokuyoruz. Bu döngü içerisinde de bir kontrol yapıyoruz. Eğer bu değerimiz sıfırsa veya sıfırdan küçükse veya toplam sayfa sayımızdan büyükse continue deyimi ile o elemanı atlayıp bir sonraki elemana geçiyoruz ve böylece -1, 0 veya toplam sayfa sayımızdan büyük sayfalar göstermesini engellemiş oluyoruz. Eğer verimiz düzgün bir sayfaysa da li ve a etiketleri içerisine sayfamızın numarasını yazdırdık ve linkini verdik.

İşte sayfalama ve dinamik sayfalama butonları yapmak bu kadar basit. Bu ders anlatacaklarım bu kadar, isterseniz çalışan tam kodu aşağıdan görebilirsiniz.

<?php

try {
  $db = new PDO("mysql:hostname=localhost; dbname=youtube; charset=utf8;", "root", "123456");
}catch(PDOException $e) {
  die($e->getMessage());
}

$sayfaBasi = 5;

$sayfa = 1;

if(isset($_GET["sayfa"]) && $_GET['sayfa'] > 0) {
  $sayfa = $_GET['sayfa'];
}

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

$query = $db->query("SELECT * FROM dersler ORDER BY ders_id ASC LIMIT $limit, $sayfaBasi");
$fetch = $query->fetchAll(PDO::FETCH_ASSOC);
$query2 = $db->query("SELECT COUNT(*) as toplamDers FROM dersler");
$toplam = $query2->fetch(PDO::FETCH_ASSOC);
$toplamDers = $toplam['toplamDers'];

$toplamSayfa = ceil($toplamDers / $sayfaBasi);


?>

<ul>
  <?php foreach($fetch as $veri) { ?>
    <li><?php echo $veri['ders_id'].". ".$veri['ders_baslik']; ?></li>
    <?php } ?>
</ul>

<ul>
<?php
$aralik = range($sayfa - 1, $sayfa + 1);
foreach($aralik as $sayfaSayisi) {
  if($sayfaSayisi == 0 || $sayfaSayisi > $toplamSayfa) {
    continue;
  }
  echo '<li><a href="?sayfa='.$sayfaSayisi.'">'.$sayfaSayisi.'</li>';
}
?>
</ul>

Lütfen bu dersleri hazırlarken gece uykumdan feda ettiğimi, eğer olursa sadece reklamdan ufak bir miktar kazandığımı, sizden herhangi bir şey talep etmediğimi unutmayın. Ufacık bir teşekkür etmeniz bile bizim için çok önemli. O yüzden lütfen emeğimize saygı gösterin ve bizleri destekleyin. Ufacık bir yorum, abone olmak, videoları ve dersleri paylaşmak veya Youtube’da videoyu beğenmek çok zor bir şey değil, bu konuda biraz daha hassas olmanızı rica ediyorum 🙂

Herkese iyi çalışmalar ve bana da iyi uykular.

Genel Mustafa Zahid Efe 4 yorum