Giriş
Sayfalama veri odaklı uygulamalar oluşturmada önemli bir kavramdır. Veritabanından kayıtlar çekilirken, çok sayıda kayıt getirilebilir. Örneğin, aktif kullanıcılar veya belirli bir konuma ait kullanıcılar için sorgu çalıştırıldığında, yüzlerce hatta binlerce kullanıcı dönebilir. Bu kadar büyük miktarda kaydı tek bir web sayfasında görüntülemek, kullanıcıyı bunaltabileceği ve kullanıcı deneyiminin akıcılığını bozabileceği için kullanıcı dostu bir çözüm değildir.
Bu nedenle, tercih edilen bir seçenek kayıt sayısını sınırlamaktır. Bu, sayfalama kavramıdır. Başka bir deyişle, kayıt sayısını sayfalara böleriz ve ardından sayfayı görüntüleriz. Tek bir sayfa, ön uçta görüntülenebilecek on, hatta on beş veya uygun olan herhangi bir miktarda kayıt içerebilir.
Sayfalama, uygulamanın genel kullanıcı deneyimini iyileştirirken, daha az sayıda kayıt çekebildiğimiz için uygulamayı daha hızlı hale de getirebilir. Böylece, istemci ile sunucu arasında ağ üzerinden daha az veri aktarılır ve gecikme süresi azalır.
Bu öğreticide, veritabanına bağlanan bir PHP kodu oluşturacağız ve MySQL veritabanını ve onun LIMIT ifadesini kullanarak sayfalama uygulayacağız.
Gereksinimler
Bu öğreticiyi takip etmek için şunlara ihtiyacınız olacak:
-
Ubuntu'nun en son sürümünün kurulu ve çalışır durumda olması. Yardıma ihtiyacınız varsa Ubuntu sunucunuzu nasıl kuracağınıza dair öğreticiyi takip edin.
-
Ayrıca PHP ve MySQL'in kurulu olması gerekir. PHP ve MySQL'i kurmak için bir öğreticimiz var: LAMP Stack kurulumu – Linux Apache MySQL PHP.
Adım 1 — Bir Veritabanı Kullanıcısı ve Test Veritabanı Kurma
Bu öğreticide, MySQL veritabanı ile veritabanı bağlantısı kuracağız ve kayıtları çekeceğiz. Bu kayıtlar, tablo öğesi içeren bir HTML sayfasında görüntülenecektir. Bağlantıyı kurmak ve kayıtları görüntülemek için bir PHP betiği kullanacağız. Veritabanı bağlantısını hazırladıktan sonra, uygulamamızı sayfalama ile ve sayfalama olmadan test edeceğiz. Bu şekilde test etmek, sayfalama işleminin pratikte nasıl çalıştığını anlamamızı sağlayacaktır.
MySQL veritabanına bağlanmak için örnek bir MySQL veritabanına ve MySQL veritabanına bağlanacak kullanıcının kimlik doğrulama bilgilerine ihtiyacımız olacak. Bu adımda, MySQL veritabanınız için root olmayan bir kullanıcı, örnek bir veritabanı ve PHP betiğini test etmek için bir tablo oluşturacaksınız.
İlk olarak sunucunuza giriş yapın. Ardından, aşağıdaki komutu kullanarak MySQL sunucusuna giriş yapın:
|
1 |
mysql> sudo mysql -u root -p |
Sizden root kullanıcısının şifresi istenecektir. Şifreyi girin ve devam etmek için Enter tuşuna basın. Ardından, öğreticimizde kullanacağımız test_db, adında örnek bir veritabanı oluşturun. Yeni bir veritabanı oluşturmak için aşağıdaki komutu çalıştırın:
|
1 |
mysql> Create database test_db; |
MySQL sunucusundan bir satırın etkilendiğine dair çıktıyı göreceksiniz. Ardından, bu veritabanı için yeni bir kullanıcı oluşturmamız gerekecek. Bu kullanıcıya tüm yetkileri vereceğiz. Ancak, pratik uygulamalarla çalışırken yetkileri sınırladığınızdan emin olun. Kullanıcımıza test_user adını vereceğiz. Aşağıdaki komutta, PASSWORD kısmını güçlü bir şifre ile değiştirin:
|
1 |
mysql> GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD'; |
Kullanıcı oluşturulduktan sonra yetkileri yenileyin (flush):
|
1 |
mysql> FLUSH PRIVILEGES; |
Artık hem test_user hem de test_db hazır olduğuna göre, tablolar oluşturmak için test_db veritabanını kullanın. test_db veritabanına geçiş yapmak için aşağıdaki komutu çalıştırın:
|
1 |
mysql> Use test_db; |
Çıktıda veritabanının değiştiğini gördükten sonra, tablomuzu oluşturmaya hazırız. Ürünleri tutmak için Products adında yeni bir tablo oluşturacağız. Amacımız doğrultusunda, bu tabloda yalnızca iki sütuna ihtiyacımız olacak: product_id ve product_name. product_id sütununu AUTO_INCREMENT, böylece her yeni ürün eklediğimizde otomatik olarak artacaktır. Diğer sütun olan product_name ise ürünün adını saklamak için kullanılacaktır. product_name sütunu, her ürünü ismine göre ayırt etmek için kullanılacaktır:
|
1 |
mysql> Create table products (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50) NOT NULL ) Engine = InnoDB; |
Şimdi bu yeni oluşturulan tabloya bazı ürünler ekleyeceğiz. Bunun için aşağıdaki komutları çalıştırın:
|
1 2 3 4 5 6 7 8 9 10 |
mysql> Insert into products(product_name) values ('WIRELESS MOUSE'); mysql> Insert into products(product_name) values ('BLUETOOTH SPEAKER'); mysql> Insert into products(product_name) values ('GAMING KEYBOARD'); mysql> Insert into products(product_name) values ('320GB FAST SSD'); mysql> Insert into products(product_name) values ('17 INCHES TFT'); mysql> Insert into products(product_name) values ('SPECIAL HEADPHONES'); mysql> Insert into products(product_name) values ('HD GRAPHIC CARD'); mysql> Insert into products(product_name) values ('80MM THERMAL PRINTER'); mysql> Insert into products(product_name) values ('HDMI TO VGA CONVERTER'); mysql> Insert into products(product_name) values ('FINGERPRINT SCANNER'); |
Bu ürünlerin tabloya girilip girilmediğini doğrulamak için aşağıdaki komutu çalıştırın:
|
1 |
mysql> select * from products; |
Yukarıda girdiğiniz ürünleri görüyorsanız, devam etmeye hazırsınız demektir. Aşağıdaki komutu kullanarak MySQL veritabanından çıkın:
|
1 |
mysql> quit; |
MySQL veritabanını kurduğumuza ve test verilerini girdiğimize göre, bu veritabanına bağlanacak ve kayıtları çekecek PHP betiğini kodlamaya hazırız.
Adım 2 – Sayfalama Olmadan Kayıtları Çekme ve Görüntüleme
Yukarıda belirtildiği gibi, ilk olarak kayıtları sayfalama olmadan görüntüleyeceğiz. MySQL veritabanına bağlanan ve kayıtları çeken bir PHP betiği oluşturacağız. Yukarıda oluşturduğumuz test_db veritabanına, test_user kullanıcısını kullanarak bağlanacağız ve kayıtları çekeceğiz.
Şu anda products tablomuzda şu anda yalnızca on kayıt bulunmaktadır. Birçok kullanıcı için sayfalama yapılması gerekip gerekmediği açık olmayabilir. Ancak, uygulamayı sayfalama olmadan test etmek, bunun uygulamanın genel deneyimine nasıl yardımcı olduğunu açıklayacaktır. Ayrıca verileri bölmenin nasıl daha iyi bir kullanıcı deneyimi oluşturmaya yardımcı olduğunu ve sunucu üzerindeki yükü nasıl azalttığını da anlayacağız.
PHP sunucunuzda, web sitesi klasörünün belge kök dizininde (document root) aşağıdaki komutu çalıştırın:
sudo nano /var/www/html/pagination_test.php
Şimdi bu dosyaya aşağıdaki içeriği ekleyin. PASSWORD kısmını, kendi test_user:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php try { $pdo = new PDO("mysql:host=localhost;dbname=test_db", "test_user", "PASSWORD"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); $sql = "select * from products"; $stmt = $pdo->prepare($sql); $stmt -> execute(); echo "<table border='1' align='center'>"; while (($row = $stmt -> fetch(PDO::FETCH_ASSOC)) !== false) { echo "<tr>"; echo "<td>".$row['product_id']."</td>"; echo "<td>".$row['product_name']."</td>"; echo "</tr>"; } echo "</table>"; } catch(PDOException $e) { echo $e->getMessage(); } ?> |
Dosyayı kaydedin. Devam etmeden önce, yukarıda ne yaptığımızı özetleyeceğiz:
-
İlk olarak, MySQL veritabanına bağlandık ve bunun için PHP Data Object (PDO) kütüphanesini kullandık. MySQL veritabanına bağlanmak için yukarıda kullandığımız MySQL kullanıcısının kimlik bilgilerini kullandık. PDO, veritabanına bağlanmak için kullanılan son derece yararlı bir kütüphanedir. Veri erişim katmanının kodlanmasını kolaylaştırır ve uygulamayı kapsamlı bir şekilde yeniden yapılandırmaya gerek kalmadan çeşitli veritabanlarına bağlanmaya olanak tanır. PDO, güvenliğin tehlikeye atılmamasını sağlayan hazırlanmış ifadeler (prepared statements) kullanır. Dolayısıyla sorgular güvenli bir şekilde yürütülür.
-
Ardından, PDO APIsini kullanarak select * from products ifadesini yürüttük. $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false) ayarı, PHP'deki veri türlerinin veritabanındakilerle aynı olmasını sağlar. Böylece, product_id ve product_name sırasıyla tamsayı ve dize olarak görünür.
-
The $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ayarı, bir hata oluştuğunda PDO'ya istisna fırlatmasını söyler. Böylece, istisnayı try … catch bloğunda kolayca yakalayabilir ve gerektiği gibi işleyebiliriz.
Artık betiğimiz hazır olduğuna göre, bunu çalıştırmamız gerekiyor. Bunun için tarayıcınızı açın ve şu URL'yi ziyaret edin: /var/www/html/pagination_test.php. URL'nin sonuna sunucu IP'nizi eklediğinizden emin olun. Yerel olarak çalıştırıyorsanız, URL'niz şu şekilde olacaktır: http://localhost/var/www/html/pagination_test.php.
Aşağıdaki çıktıyı göreceksiniz:

Burada ürünlerimiz döndürülür ve sayfada görüntülenir. Şimdi, yüzlerce ürünümüz olduğunu hayal edin. Bu, verileri çekmek ve sayfada görüntülemek için uzun bir döngüye neden olur. Bu da sayfa yükleme süresini artıracaktır.
Bir sonraki bölümde, PHP betiğini değiştireceğiz ve MySQL LIMIT ifadesini ekleyeceğiz. Bu, çok sayıda kaydın görüntülenmesi sorununu çözecektir. Kullanıcının sayfalar arasında gezinebilmesi için sayfalama bağlantılarını ekleyeceğiz.
Adım 3 – PHP kullanarak Sayfalamayı Ayarlama
Bu adımda, verileri birden fazla tablo kullanarak görüntülemek için PHP kullanarak sayfalama ayarlayacağız. Sayfalamayı uyumlu hale getirmek için önceki adımda kodladığımız betiği değiştireceğiz.
MySQL veritabanının LIMIT ifadesini kullanacağız. Bunu betiğe eklemeden önce, MySQL LIMIT sözdiziminin bir örneğine bakalım:
|
1 |
mysql> Select [column1, column2, column n...] from [table name] LIMIT offset, records; |
Yukarıdaki ifadede, LIMIT ifadesinin offset ve records argümanlarına sahip olduğunu görebiliriz. offset kaç kaydın atlanacağını belirtir ve records sayfa başına görüntülenecek veya veritabanından çekilecek maksimum kayıt sayısını belirtir.
Artık sayfalamanın nasıl çalıştığını bildiğimize göre, bunu nasıl uygulayacağımıza bakalım. Sayfa başına üç kayıt görüntüleyeceğiz. Dolayısıyla, veritabanımızda on kayıt varsa, toplam kayıt sayısını sayfa başına düşen kayıt sayısına bölerek dört sayfamız olacaktır. Sonuç tam sayı olmayabileceği için, tam sayı sonucunu elde etmek amacıyla en yakın tam sayıya yuvarlamak için PHP'nin Ceil işlevini kullanacağız. Aşağıda, Ceil işlevini gösteren basit bir kod parçacığı bulunmaktadır:
|
1 |
$total_pages=ceil($total_records/$per_page); |
Şimdi sayfalama kodunu ekleyeceğiz. Sayfalamayı etkinleştirmek ve gezinti bağlantılarını eklemek için, aşağıdaki komutu kullanarak /var/www/html/pagination_test.php dosyasını açın:
|
1 |
$ sudo nano /var/www/html/pagination_test.php |
Ardından, bu dosyanın içeriğini aşağıdaki kodla değiştirin:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php try { $pdo = new PDO("mysql:host=localhost;dbname=test_db", "test_user", "ŞİFRE"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); /* Sayfalama Bilgisi Başlangıcı */ $page = 1; if (isset($_GET['page'])) { $page = filter_var($_GET['page'], FILTER_SANITIZE_NUMBER_INT); } $per_page = 3; $sqlcount = "select count(*) as total_records from products"; $stmt = $pdo->prepare($sqlcount); $stmt->execute(); $row = $stmt->fetch(); $total_records = $row['total_records']; $total_pages = ceil($total_records / $per_page); $offset = ($page-1) * $per_page; /* Sayfalama Bilgisi Bitişi */ $sql = "select * from products limit :offset, :per_page"; $stmt = $pdo->prepare($sql); $stmt->execute(['offset'=>$offset, 'per_page'=>$per_page]); echo "<table border='1' align='center'>"; while ( ($row = $stmt->fetch(PDO::FETCH_ASSOC) ) !== false) { echo "<tr>"; echo "<td>".$row['product_id']."</td>"; echo "<td>".$row['product_name']."</td>"; echo "</tr>"; } echo "</table>"; /* Gezinme Başlangıcı */ echo "<table border='1' align='center'>"; echo "<tr>"; if ($page-1 >= 1) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page - 1).">Önceki</a></td>"; } if ($page+1 <= $total_pages) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page + 1).">Sonraki</a></td>"; } echo "</tr>"; echo "</table>"; /* Gezinme Bitişi */ } catch(PDOException $e) { echo $e->getMessage(); } ?> |
İşte bu kodun bir özeti:
-
Şu anda üzerinde bulunduğumuz sayfa hakkındaki bilgiyi tutmamız gerekiyor. Bunun için $page değişkenini kullanıyoruz. $page değişkeni, $_GET[‘page’] değişkenini kullanarak şu anda bulunduğumuz sayfayı elde etmek için kullanılır.
-
Sonra, bir sayfada kaç adet göstereceğimizi belirtmemiz gerekiyor. Bunun için $per_page değişkeni. Burada sayfa başına yalnızca üç ürün görüntülüyoruz.
-
Yukarıda tartışıldığı gibi, veritabanında mevcut olan toplam kayıt sayısına sahip olmamız gerekir. Bu, toplam sayfa sayısını belirleyebilmemiz için gereklidir. $total_records değişkeni bu bilgiyi tutar.
-
Son olarak, kaç kaydın atlanacağını bilmemiz gerekir. Örneğin, ikinci sayfadaysak, veritabanının ilk üç kaydını atlamamız gerekir. $offset değişkenini bu bilgiyi tutmak için kullanıyoruz. Bu bilgiyi her sayfa yüklendiğinde şu formülü kullanarak hesapladık: $offset=($page-1)*$per_page. Başka bir sayıda öğe görüntülemeniz gerekiyorsa, değeri $per_page değişkeninde belirtebilirsiniz.
-
Gezinme düğmelerini görüntülemek için aşağıdaki kodu kullanıyoruz:
|
1 2 3 4 5 6 7 8 9 10 |
. . . if( $page-1>=1) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page-1).">Önceki</a></td>"; } if( $page+1<=$total_pages) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page+1).">Sonraki</a></td>"; } . . . |
Mantık şudur: $page geçerli sayfayı tutmak için kullanılır. Sayfada önceki seçeneğini görüntülemek istiyorsak, betik $page değişkeninin değerinden bir çıkaracaktır. Sonuç bire eşit veya daha büyükse, sayfada önceki seçeneği görüntülenir.
Benzer şekilde, sonraki seçeneği görüntülemek için $page değişkenine bir ekleriz. Burada, toplama işleminin sonucunun $total_pages değişkenindeki toplam sayfa sayısını aşmamasını sağlıyoruz.
Bundan sonra, sayfayı kontrol etme zamanı gelmiştir. Tarayıcıyı açın ve daha önce kullandığınız URL'yi kullanarak sayfaya gidin:
|
1 |
http://your_server_ip/pagination_test.php |
Çıktıyı aşağıdaki gibi göreceksiniz:



Burada nihayet PHP betiğindeki MySQL'in LIMIT ifadesini kullanarak sayfalama işlemini gerçekleştirdiniz. Uygulamanızda sayfalama uygulayarak, birden fazla kayıt arasında gezinmek için daha iyi bir yönteme sahip olursunuz.
Sonuç
Bu öğreticide, Ubuntu üzerinde PHP ve MySQL kullanarak sayfalama işleminin nasıl uygulanacağına baktık. Bu adımları kullanarak, etkili bir yönetim için sayfalara bölünmüş, çok sayıda kaydı yeterli şekilde görüntüleyebilen uygulamalar oluşturabilirsiniz.
Ayrıca, Ubuntu üzerinde PHP ve MySQL kullanımı hakkında daha fazla faydalı öğreticimiz bulunmaktadır:
- Ubuntu 18.04 üzerinde phpMyAdmin Kurulumu ve Güvenliğinin Sağlanması
- MariaDB veya MySQL Root Parolası Nasıl Sıfırlanır
- CloudSigma Öğreticisi: Sunucuda MySQL nasıl kurulur ve MySQL temelleri
Keyifli Bilişimler!
Yorumlar
Henüz yorum yapılmamış. İlk siz olun.