Bir site ya da projeye başladığımda, yazması en sıkıcı gelen işlerin başında veri sayfalama gelir. Her seferinde sayfalama işlemlerini bu yüzden en sona bırakırım. Daha önceki sayfalama makalelerimi okuduysanız hep karmaşık kodlardan oluştuğunu görebilirsiniz. Her seferinde bu kodları tekrar tekrar yazmak nedendir bilmem beni hep bunaltmıştır, öyle ki kopyala-yapıştır bile angarya gelir. Buna bir son vermem gerektiğini düşünüp, hazır OOP programlamaya kendimi alıştırmaya başladığım şu zamanlarda bununla ilgili bir sınıf yazmak istedim ve birşeyler karaladım. Benim can sıkıntımı fazlasıyla ortadan kaldıran bir sınıf hazırladım ve bunu sizlerle paylaşmak istedim.Sınıfıma SAYFALAYICI ismini verdim. 3 temel özelliğe değer atadıktan sonra bir fonksiyon çalıştırarak istediğim aralıktaki kayıtlara ulaşabiliyor, dolayısıyla sayfalama işlemlerini daha rahat bir şekilde icra edebiliyorum. Özellik isimlendirmede eski bir ASP’ci olarak Recordset nesneleriyle benzer isimler kullandım. Sınıf dosyasını ve örnek uygulamayı buraya tıklayarak indirebilirsiniz. Örnek uygulamanın çalışır halini görmek için ise buraya tıklayabilirsiniz.Örnek uygulamaya geçmeden önce sınıfımın özellik ve metodlarını kısaca tanımlayayım. Sınıf 8 özellik ve 1 metoddan oluşuyor.

  • sorgu: İşlenecek SQL cümleciği bu özelliğe atanmalıdır. Dikkat edilmesi gereken tek husus SQL cümleciği içinde kesinlikle LIMIT kullanılmamasıdır. Sınırlamayı sınıf kendi içinde halledecektir.
  • pageSize: Bir sayfada gösterilmek istenen kayıt sayısı bu özellikte belirtilir.
  • absolutePage: Halihazırda gösterilecek olan sayfanın numarası burada tanımlanır.

Bu 3 özelliğe değer atandıktan sonra sayfala() metodunun çağırılması verilerin düzenlenmesi için yeterlidir. Bundan sonraki özellikler sadece okunabilir. Üzerine yazmaya zorlarsanız kodların çalışmasında hata oluşabilir. (OOP metoduyla kod yazmaya yeni başladığımdan sadece okunabilir bir özellik tanımlamayı henüz bilmiyorum.)

  • recordCount: Uygulanan işlem sonucunda dönen kayıtların toplam sayısını verir.
  • veri: Uygulanan işlem sonucunda aralığı belirlenmiş kayıtlar bu özelliğe depolanır. Bu özellik dizi türünde olup, eleman isimleri tablonun alan isimleriyle aynıdır.
  • EOF: Döngüyle uygulandığında kayıt setinde yeni bir kaydın olup olmadığını gösterir. Kayıt varsa 1, yoksa 0 değeri döndürür.
  • pageCount: Uygulanan işlem sonucunda kaç sayfanın oluştuğunu gösterir.
  • recordRange: O anda gösterilmekte olan kayıt aralığını belirtir. (Örn: 1-10, 21-28, 42-50)
* @copyright 2009* @filename sayfalayici.class.php* @version 0.1** MySQL verilerini sayfalama sınıfı** Copyright 2009 tuncay.kinali.net* Licensed under the GNU General Public License, version 2.* See the file http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt*/class SAYFALAYICI {/*** @param recordCount İşlenen sorgu sonrası dönen kayıtların toplamını verir.*/public $recordCount;/*** @param pageSize Sonuçların kaçar adetlik sayfalara bölüneceğini belirtir.*/public $pageSize = 1000;/*** @param absolutePage Gösterilmek istenen sayfa numarasını belirtir.*/public $absolutePage = 1;/*** @param sorgu Sorgulanacak SQL cümleciği burada belirtilir.*/public $sorgu;/*** @param veri SQL cümleciği işletildikten sonra dönen kayıtlar bu özelliğe atanır. Okuma bu özellik üzerinden yapılır.*/public $veri;private $topRS;private $tmpSQL;/*** @return Kendisi bir değer döndürmez fakat işlenen SQL cümleciğinin döndürdüğü kayıtları hafızaya alır.*/public function sayfala() {try {$this->topRS = @mysql_query($this->sorgu);if(!$this->topRS) {throw new Exception(‘SQL sorgusu işlenemedi’);}$this->recordCount = mysql_num_rows($this->topRS);if($this->pageSize>0) {$this->tmpSQL = @mysql_query($this->sorgu . ‘ LIMIT ‘ . (($this->pageSize*$this->absolutePage)-($this->pageSize)) . ‘, ‘ . $this->pageSize);} else {$this->tmpSQL = @mysql_query($this->sorgu);}} catch(Exception $e) {echo(‘Bir hata oluştu: ‘. $e);}}function __get($isim) {switch($isim) {/*** @param EOF Elden geçirilmiş SQL cümleciğini işletir, kayıt bulunursa kaydı $veri özelliğine atar ve 1 (TRUE) değer döndürür. Kayıt bulunamazsa 0 (FALSE) değer döndürür*/case ‘EOF’:return(($this->veri = mysql_fetch_assoc($this->tmpSQL)) ? 0 : 1);break;/*** @param pageCount İşlenen SQL cümleciği sonucunda kaç sayfanın oluştuğu bilgisini verir.*/case ‘pageCount’:$sayfa = preg_replace(‘/[^0-9]+/mis’, ‘.’, strval($this->recordCount/$this->pageSize));$sayfa = intval(substr($sayfa, 0, strpos($sayfa, ‘.’)))+1;return($sayfa);break;/*** @param recordRange Gösterilmekte olan kayıtların aralığını verir. Örn: 1-10, 15-19 gibi.
*/case ‘recordRange’:$ilk = (($this->pageSize*$this->absolutePage)-($this->pageSize))+1;$son = $this->recordCount > (($ilk-1)+$this->pageSize) ? (($ilk-1)+$this->pageSize) : $this->recordCount;return($ilk < = $this->recordCount ? $ilk.’ – ‘.$son : ”);break;}}}?>
Örnek uygulamada kullanmak üzere kütüphanemdeki kitapları, yazarlarını ve yayın evlerini bir veritabanında topladım. Bunu söylerken utanmalı mıyım bilmiyorum ama sizin de göreceğiniz üzere kütüphanemde bilgisayar ve bilişim dışında hiç kitap yok. Veritabanı yapısı ve içeriği şöyle:— MySQL Administrator dump 1.4—- ——————————————————– Server version 5.0.75-0ubuntu10.2/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8 */;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=’NO_AUTO_VALUE_ON_ZERO’ */;—- Create schema sniper–CREATE DATABASE IF NOT EXISTS sniper;USE sniper;—- Definition of table `sniper`.`tblkitaplar`–DROP TABLE IF EXISTS `sniper`.`tblkitaplar`;CREATE TABLE `sniper`.`tblkitaplar` (`fldID` int(11) NOT NULL auto_increment,`fldKitapAdi` varchar(255) NOT NULL,`fldYazar` varchar(50) NOT NULL,`fldYayinEvi` varchar(50) NOT NULL,PRIMARY KEY (`fldID`)) ENGINE=MyISAM AUTO_INCREMENT=37 DEFAULT CHARSET=utf8;—- Dumping data for table `sniper`.`tblkitaplar`–/*!40000 ALTER TABLE `tblkitaplar` DISABLE KEYS */;LOCK TABLES `tblkitaplar` WRITE;INSERT INTO `sniper`.`tblkitaplar` VALUES (1,’Macromedia Flash 4 Windows ve Macintosh İçin’,’Katherine Ulrich’,’Sistem Yayıncılık’),(2,’Enine Boyuna Windows Server 2003′,’William R. Stanek’,’Arkadaş Yayınları’),(3,’Borland C++ Builder 6′,’İhsan Karagülle & Zeydin Pala’,’Türkmen Kitabevi’),(4,’Java SE 6′,’Herbert Schildt’,’Alfa Yayınları’),(5,’Java Ağ Programcılığı’,’Haluk Gümüşkaya & Ömer Boyacı’,’Alfa Yayınları’),(6,’Javascript Örnekleri’,’Mehmet Eğitmen’,’Alfa Yayınları’),(7,’C/C++ Programcının Rehberi’,’Chris H. Pappas & William H. Murray’,’Sistem Yayıncılık’),(8,’Nesne Yönelimli C++ Programlama Kılavuzu’,’Robert Lafore’,’Alfa Yayınları’),(9,’Visual Basic.Net ile Yazılım Geliştirme’,’Prof. Dr. Mithat Uysal’,’Beta Yayınları’),(10,’Swing’,’Herbert Schild’,’Alfa Yayınları’),(11,’ASP.Net’,’Zafer Demirkol’,’Pusula Yayıncılık’),(12,’Java Programlama Dili Yazılım Tasarımı’,’Altuğ B. Altıntaş’,’Papatya Yayıncılık’),(13,’Visual Basic 6.0′,’İhsan Karagülle & Zeydin Pala’,’Türkmen Kitabevi’);INSERT INTO `sniper`.`tblkitaplar` VALUES (14,’Macromedia Flash 5 Windows ve Macintosh İçin’,’Katherine Ulrich’,’Sistem Yayıncılık’),(15,’Macromedia Freehand MX’,’Patti Schuzle’,’Macromedia Press’),(16,’PHP 5′,’Mehmet Şamlı’,’Pusula Yayıncılık’),(17,’ASP ile Web Programcılığı ve Elektronik Ticaret’,’Zafer Demirkol’,’Pusula Yayıncılık’),(18,’Görsel İletişim ve Grafik Tasarım’,’Tevfik Fikret Uçar’,’İnkılap Yayınevi’),(19,’ASP.Net’,’Mehmet Nuri Çankaya’,’Seçkin Kitabevi’),(20,’Linux Doktoru’,’Görkem Çetin’,’Seçkin Kitabevi’),(21,’Linux Ağ Yönetimi’,’Görkem Çetin & Barış Metin’,’Seçkin Kitabevi’),(22,’Flash Web Tasarımı’,’Hillman Curtis’,’Alfa Yayınları’),(23,’Macromedia Dreamweaver 8′,’Osman Gürkan’,’Nirvana Yayıncılık’),(24,’Macromedia Flash 8.0 Professional’,’Osman Gürkan’,’Nirvana Yayıncılık’),(25,’Macromedia Fireworks 8′,’Osman Gürkan’,’Nirvana Yayıncılık’),(26,’GTK+/Gnome Programlama’,’M. Ali Vardar’,’Papatya Yayıncılık’),(27,’Java Programlama Dili’,’Dr. Turhan Çoban’,’Fotokopi Yoluyla Çoğaltım’);INSERT INTO `sniper`.`tblkitaplar` VALUES (28,’GTK+ 2.0 Tutorial’,’Tony Gale & Ian Main & the GTK Team’,’Fotokopi Yoluyla Çoğaltım’),(29,’Assembly Programlama Dili’,’Fehmi Noyan İsi’,’Fotokopi Yoluyla Çoğaltım’),(30,’J2ME’,’Asin Akdeniz’,’Fotokopi Yoluyla Çoğaltım’),(31,’Win32 Sistem Programlama Ders Notları’,’Kaan Arslan & Deniz Kürümoğlu’,’Fotokopi Yoluyla Çoğaltım’),(32,’MFC Ders Notları’,’Kaan Arslan & Deniz Kürümoğlu’,’Fotokopi Yoluyla Çoğaltım’),(33,’C++ Ders Notları’,’Necati Ergin’,’Fotokopi Yoluyla Çoğaltım’),(34,’Windows API Ders Notları’,’Kaan Arslan & Deniz Kürümoğlu’,’Fotokopi Yoluyla Çoğaltım’),(35,’Programlamaya Giriş Ders Notları’,’H. Turgut Uyar’,’Fotokopi Yoluyla Çoğaltım’),(36,’C++ Uygulamaları Ders Notları’,’Kaan Arslan & Deniz Kürümoğlu’,’Fotokopi Yoluyla Çoğaltım’);UNLOCK TABLES;/*!40000 ALTER TABLE `tblkitaplar` ENABLE KEYS */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
Bunu kullanarak hazırladığım demo sayfanın kodları ise aşağıda:0 ? $_GET[‘p’] : 10;$sayfa = is_numeric($_GET[‘s’]) && $_GET[‘s’]>0 ? $_GET[‘s’] : 1;?><html>Sayfalayıcı Sınıfı Demo Sayfası


sorgu = ‘SELECT * FROM tblkitaplar’;// Bir sayfada gösterilecek kayıt sayısını bildiriyoruz.$pager->pageSize = $pageSize;// Hangi sayfanın gösterileceğini bildiriyoruz.$pager->absolutePage = $sayfa;// Yukarıdaki bilgileri kullanarak gerekli kayıt aralığını getirmesi için ‘sayfala’ metodumuzu çağırıyoruz.$pager->sayfala();?>

EOF) {echo(‘

‘);}?>

ID Kitap Adı Yazar Yayın Evi
‘.$pager->veri[‘fldID’].’ ‘.$pager->veri[‘fldKitapAdi’].’ ‘.$pager->veri[‘fldYazar’].’ ‘.$pager->veri[‘fldYayinEvi’].’
‘ . $pager->pageCount . ‘ sayfa arasında ‘. $pager->absolutePage. ‘. sayfadasınız. Bulunan ‘ . $pager->recordCount . ‘ kaydın ‘ . $pager->recordRange . ‘ arası gösteriliyor.’);
?>  Sayfalar:

Bir sayfada
kayıt göster.
</html> Kod içerisine yorum eklediğimden burada bunları tekrar etme gereği duymadım. Yine de bir sorunuz ya da sorununuz olursa yorum yazmaktan çekinmeyin.Not: Bu yazının bir kopyası da http://tuncay.kinali.net/php-ile-mysql-verilerini-sayfalama-sinifi.html adresinde yayınlanmaktadır.