Web sitelerinde içerik miktarı arttıkça, tüm verileri tek bir sayfada yüklemek hem sunucu performansını olumsuz etkiler hem de kullanıcıların sayfayı aşağı kaydırırken kaybolmasına neden olur. Bu sorunu çözmenin yollarından biri, verileri belirli sayfalara bölerek sunan sayfalama (pagination) sistemidir.
Sayfalama Mantığı Nedir? (Limit ve Offset Kavramları)
Büyük veri setlerini (yüzlerce blog yazısı veya projeyi) tek seferde ekrana yüklemek hem sunucuyu yorar hem de kullanıcı deneyimini (UX) mahveder. Bu yüzden veriyi "sayfa sayfa" böleriz. SQL dilinde bu işi sırtlayan iki anahtar kelime vardır: LIMIT ve OFFSET.
-
LIMIT (Adet): Veritabanından tek seferde en fazla kaç satır (içerik) çekmek istediğimizi belirtir. Örneğin LIMIT 10 derseniz, sorgu sonucu ne olursa olsun size sadece 10 tane veri döner.
-
OFFSET (Atlama / Başlangıç Noktası): Veritabanından veri çekmeye kaçıncı satırdan itibaren başlayacağımızı söyler. Yazılım dünyasında saymaya 0'dan başladığımız için, OFFSET 0 ilk veriden başla demektir. OFFSET 10 ise ilk 10 veriyi atla, 11. veriden itibaren çekmeye başla demektir.
Sayfalama Matematiği Nasıl Çalışır?
Her sayfada 5 içerik göstermek istediğimizi varsayalım (LIMIT = 5). Sayfa numarası ayfa içerisinden bir link ile bize querystring aracılığıyla gelecek ve bir değişkene atayacağız. Örneğin $sayfa değişkeni..
Bu durumda gelen $sayfa bilgisine göre SQL'in arka planda yapacağı atlama (OFFSET) hesabı tam olarak şöyledir:
<?php $offset = ($sayfa - 1) * $limit; ?>
Aktif sayfa numarasından 1 çıkarıp bu sonucu sayfa başına gösterilecek içerik sayısı (limit) ile çarptığımızda, SQL sorgusunun verileri hangi satırdan itibaren çekmeye başlayacağını, yani OFFSET değerini elde ederiz.
Örneğin:
1. Sayfa için: İlk 5 veriyi isteriz. Sıfır veri atlamamız gerekir. ($sayfa=1)
2. Sayfa için: İlk 5 veriyi geçip sonraki 5 veriyi isteriz. ($sayfa=2)
-
- OFFSET= (2-1) * 5 = 1 * 5 = 5 olur.. Sayfa 2'de kayıtlar 5. satırdan (0'dan basladığı için 6. kayıt) itibaren gösterilmeye başlanır.
-
SQL: LIMIT 5 OFFSET 5
3. Sayfa için: İlk 10 veriyi atlayıp sonraki 5 veriyi isteriz.
-
- OFFSET= (3-1) * 5 = 2 * 5 = 10 olur.. Sayfa 3'te kayıtlar 10. satırdan (0'dan basladığı için 11. kayıt) itibaren gösterilmeye başlanır.
-
SQL: LIMIT 5 OFFSET 10
sayfalar arttıkça , bu şekilde devam eder..
VERİTABANI YAPISI
Sayfalamayı test etmek ve uygulamak için bir "kullanicilar" veri tabanı kullanalım.

PHP ve PDO İLE SAYFALAMA KODLARI
Şimdi bu mimariyi koda döküyoruz. Dosya adımızın index.php olduğunu varsayalım. En güvenli yöntem olan PDO Prepared Statements (Hazırlanmış İfadeler) kullanacağız. Önce veri tabanı bağlantısını yapalım.
VT BAĞLANTISI
İçinde veri tabnaı işlemi yapıalcak her sayfada mutlaka veri tabanı bağlantısı olmlaıdır. Aşağıda en basit haliyle PDO veri tabanı bağlantıısnı yapıyoruz.
$pdo = new PDO("mysql:host=localhost;dbname=phpvtislemleri;charset=utf8mb4", "root", "");
KULLANICILARIN LİSTELENMESİ
Veritabanındaki kullanıcılar tablosundaki kayıtları bir tablo içerisine çekelim. Kayıtları çekeceğimiz sorguya ve yapıya yukarda belirlediğimiz $sayfa, OFFSET ve LIMIT değerlerini ekleyelim.
<?php $pdo = new PDO("mysql:host=localhost;dbname=phpvtislemleri;charset=utf8mb4", "root", ""); ?>
<table class="table table-bordered table-hover table-striped">
<thead>
<th>Id</th> <th>Ad</th> <th>Soyad</th> <th>Kullanıcı Adı</th>
<th>Mail</th> <th>Şifre</th> <th>Tarih</th> <th>İşlem</th> </thead>
<tbody>
<?php
//gelen sayfa numarası
$sayfa=isset($_GET["sayfa"])?$_GET["sayfa"]:1;
//limit ve offset
$limit = 4; //sayfada goruntulenecek kayıt sayısı
$offset = ($sayfa - 1) * $limit; //kayıtlarınhangi sıradan başlayacağı
//kayıtlara bağlantı ve listeleme
$stmt = $pdo->query("SELECT * FROM kullanicilar limit $limit offset $offset");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ?>
<tr>
<td><?=$row["id"]?></td>
<td><?=$row["ad"]?></td>
<td><?=$row["soyad"]?></td>
<td><?=$row["kullanici_adi"]?></td>
<td><?=$row["mail"]?></td>
<td><?=$row["sifre"]?></td>
<td><?=date("d/m/Y H:i",$row["tarih"])?></td>
</tr>
<?php } ?>
</tbody>
</table>
<div class="d-flex">
<?php
if ($toplam_sayfa>1) {
for($i=1;$i<=$toplam_sayfa;$i++) { ?>
<a href="?sayfa=<?=$i?>" class="btn btn-sn btn-light"> <?=$i?> </a>
<?php }
} ?>
</div>
$sayfa Değişken değeri
Yukarıda önce $sayfa değişkenini kontrol ettik. Eğer sayfaya gelen bir $_GET["sayfa] mesajı varsa, sayfa değeri gelen değer olur. Ama gelen herhangi bir sayfa değeri yoksa $sayfa değişkeni varsayılan olarak 1 olur. Böylece ilk başta ilk 5 kayıt gösterilir.
$sayfa=isset($_GET["sayfa"])?$_GET["sayfa"]:1;
Limit ve offset
Sayfada aynı anda görüntülenecek kayıt sayısı için $limit değeri belirledik (5). $sayfa değişkenini kullanarak yukarda planladığımız gibi , kayıtların listelenmesi için gerekli offset değerini hesapladık ve $offset değişkenine atadık.
//limit, offset, toplam sayfa
$limit = 4; //sayfada goruntulenecek kayıt sayısı
$offset = ($sayfa - 1) * $limit; //kayıtlarınhangi sıradan başlayacağı
//toplam kac sayfa olacak
$toplam_sayfa = ceil($toplam / $limit);
Kayıtların alınması ve listelenmesi
limit ve offset kelimelerini sorguyayerleştirerek , kullanıcı kayıtlarını while ile alıp listeledik.
<?php
$stmt = $pdo->query("SELECT * FROM kullanicilar limit $limit offset $offset");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
?>
EKRAN GÖRÜNTÜSÜ

SAYFA NUMARALARININ YERLEŞTİRİLMESİ
Kullanılca listelendiğine göre , tablonun hemn altına sayfa numaralarını sıralayabiliriz. Bunun için önce, toplam sayfa sayısı birden fazla mı diye kontrol etmeli ve kaç sayfa varsa , sayfa no butonlarını eklemeliyiz.
<div class="d-flex">
<?php
if ($toplam_sayfa>1) {
for($i=1;$i<=$toplam_sayfa;$i++) { ?>
<a href="?sayfa=<?=$i?>" class="btn btn-sn btn-light"> <?=$i?> </a>
<?php }
} ?>
</div>
EKRAN GÖRÜNTÜSÜ

Artık sayfa numaralarına tıklayarak, sayfalar arası geçiş yapıp, farklı kayıtları görüntülüyebiliriz. Böylleikle klasik usülde PHP VERİLERİNİN Sayfalanması işlemini bitirmiş olduk!
İyi çalışmalar.