NEX YAZILIM

NECMETTİN ASLAN KİŞİSEL YAZILIM GELİŞTİRME DÜŞÜNCE KEŞİF PAYLAŞIM VS GÜNLÜĞÜ

PHP, 11.03.2010 - 15:03
PHP ile verileri sayfalara bölmek

PHP ile verileri sayfalara bölmek

 

(PHP sayfa numaraları, MySql verileri sayfalara ayırmak, PHP Veri Okuma Sayfalama, PHP her sayfada belli sayıda kayıt listeleme, PHP listeleme scripti, PHP MySql veri sayfalama)

 

Birçok projede PHP ile okuduğumuz MySql verilerimizi sayfalara bölmek isteriz. Web tabanlı yazılımların çoğunda tablolardan okuttuğumuz verilerin genelde en az yüzlerle ifade edilecek sayıda olduğunu düşünürsek kullanıcılarımızın verileri doğru dürüst okuyabilmesi, browser ekranının ve belleğinin şişmemesi için bu bir zorunluluktur. Birçok projede aynı ihtiyaçla karşılaştığım için verileri 50 satırlık sayfalara bölen bir fonksiyon yazdım. (50 rakamını dilediğiniz gibi değiştirebilirsiniz). Fonksiyon her sayfada 50 satır veri göstermenin yanı sıra;

            - Sayfa altında toplam kayıt sayısı, listelenen kayıt sayısı, toplam sayfa sayısı, aktif olan sayfa, diğer sayfaların linkleri gibi verileri de şık bir şekilde görüntülüyor.

Paylaşıyorum, fonksiyonum sayfa altında şöyle bir görünüm oluşturuyor:

 

liste

 

 

 

Öncelikle fonksiyonumuzda kullanacağımız linklerin font ve renklerinin yakışıklı olması için bir stil dosyası oluşturalım. Aşağıdaki satırları stil.css isimli dosyanıza (veya kendi stil dosyanıza) ekleyin. <head> - </head> tagları arasına da aşağıdaki satırları eklerseniz link ve font stillerimiz hazır hale gelecektir.

 

stil.css içeriği

font.etiket

            {

            font-family:tahoma;

            font-size:12px;

            font-weight:600;

            color: #004080;

            letter-spacing:1px;

            }

 

font.turuncuetiket

            {

            font-family:tahoma;

            font-size:12px;

            font-weight:600;

            color:#F14821;

            letter-spacing:1px;

            }

font.mavi

            {

            font-family:tahoma;

            font-size:12px;

            font-weight:600;

            color: #003399;

            letter-spacing:1px;

            }

font.yesil

            {

            font-family:tahoma;

            font-size:12px;

            font-weight:600;

            color:green;

            letter-spacing:1px;

            }

 

.yesillink A:link {text-decoration: none; color:#066E0B; font-weight:bold; font-family:tahoma; font-size:13px;}

.yesillink A:visited {text-decoration: none; color:#066E0B;font-weight:bold; font-family:tahoma;font-size:13px;}

.yesillink A:active {text-decoration: none; color:#066E0B;font-weight:bold; font-family:tahoma; font-size:13px;}

.yesillink A:hover {text-decoration: underline; color:#066E0B;font-weight:bold; font-family:tahoma; font-size:13px;}

 

 

<head> - </head> tagları arasına gelecek kısım:

 

<style type="text/css" media="screen, projection">

@import url(stil.css);

</style>

 

            Gelelim verileri sayfalara bölen fonksiyonumuzu açıklamaya. İlk başta sayfamızda verilerin hangi aralıkta görüntüleneceğini bilmemiz için sayfamızı çağıran sayfa (veya kendisi) veri aralığını tespit etmemize yarayacak bir değişken göndermelidir. Örneğin veri tablomuzdan 300 adet kayıt okutuyorsak ve bu kayıtların 200 - 249 arasındaki 50 adedini listeleyeceksek bunu tespit edebilmemiz için veri aralığındaki kayıtların numaralarını veya sayfa numarasını gösteren bir değişkene ihtiyacımız olacaktır. Ben sayfa numarasını GET ile alarak buna göre listelenecek kayıtların alt ve üst sınır numaralarını tespit etmeyi tercih ettim. Bu durumda Örnek liste.php dosyamızın ilk satırları şöyle olacaktır (bu dosya fonksiyonu çağıran dosyadır, fonksiyon daha aşağılarda):

 

www.nexyazilim.com/blog

           

            Örnekte kullandığım tablonun Id isimli SERIAL tipinde ve Aciklama isimli VARCHAR(30) tipinde 2 adet alanı var.

 

            Kodlar (detaylı açıklamalar aşağıda):

$SayfaNo = $_GET['SayfaNo'];

if(!$SayfaNo) $SayfaNo = 0;

$KayitSayisi = 0;

$KayitSayisiOku = mysql_query("SHOW TABLE STATUS LIKE 'veri_tablosu'");

$KayitSayisiAl = mysql_fetch_array($KayitSayisiOku);

$KayitSayisi = $KayitSayisiAl['Auto_increment'];

$KayitSayisi--;

$UstSinir = $KayitSayisi - ($SayfaNo * 50);

$AltSinir = $UstSinir - 50;

if ($AltSinir < 0) $AltSinir = 0;

 

$SorguCumlesi = "SELECT Id, Aciklama FROM veri_tablosu

WHERE Id > '$AltSinir' AND Id <= '$UstSinir' ORDER BY Id DESC";

 

$Listele = mysql_query($SorguCumlesi) or die ("MySql hatası:Tablo okunamıyor");

 

$Listelenen = 0;

if ($Listele)

            {

            if(mysql_num_rows($Listele) > 0)

                        {

                        while($Satir = mysql_fetch_array($Listele))

                                   {

                                   echo "<tr height=\"25\">";

echo "<td width=\"80\"><font class=\"liste\">" . $Satir['Id'] . "</font></td>";

echo "<td width=\"250\"><font class=\"liste\">" . $Satir['Baslik'] . "</font></td>";        

                                   echo "</tr>";

                                   $Listelenen++;

                                   }

                        echo "</table>";

                        }

            }

 

SayfaNolari('Haber', $Listelenen, $SayfaNo, $KayitSayisi, 'listhbr.php');

 

            // SayfaNo adlı GET değişkenini al:

$SayfaNo = $_GET['SayfaNo'];

 

// Eğer SayfaNo adlı bir GET değişkeni yoksa default değerimiz 0 olsun:

if(!$SayfaNo) $SayfaNo = 0;

 

// Verileri listelemede işimize yarayacak 0 değerli bir KayitSayisi değişkeni oluştur:

$KayitSayisi = 0;

 

/* KayitSayisi değişkenine veri_tablosu isimli tablonun gerçek kayıt sayısını aktar. Burada GERÇEK (silinmişler dahil) kayıt sayısı derken ne kastediyorum? Tabloda AUTO_INCREMENT özellikli bir alanım var. "Id" ismini verdiğim bu alan her kayıtta otomatik artan türde bir numara alanı. Bu alanın yeni bir kayıtta alması gereken değeri tespit edip bu değerden 1 çıkarırsam tablomun silinmiş satırlar dahil gerçek kayıt sayısını elde etmiş olurum. Peki neden silinmiş kayıtların sayısını da eklemek istiyorum? Fonksiyonu anlayıp uygularsanız bunun sebebini anlarsınız, ya da anlamak zorunda değilsiniz :)*/

 

// Tabloadaki gerçek (silinmişler dahil) kayıt sayısını tespit edelim :

$KayitSayisiOku = mysql_query("SHOW TABLE STATUS LIKE 'veri_tablosu'");

$KayitSayisiAl = mysql_fetch_array($KayitSayisiOku);

$KayitSayisi = $KayitSayisiAl['Auto_increment'];

 

/* Yeni kaydın alacağı Id değerini bulduk, 1 çıkarırsak gerçek kayıt sayısını elde ederiz.*/

$KayitSayisi--;

 

/* Sayfamızda göstereceğimiz en büyük ve en küçük Id numaralı kayıtları belirliyorum. Örneğin toplam 115 tane kayıt varsa;

 

0. sayfadaysak Üst sınır = 115 - (0 x 50) = 115, Alt sınır = 115 - 50 = 65 olacaktır.

1. sayfadaysak Üst sınır = 115 - (1 x 50) = 65, Alt sınır = 65 - 50 = 15 olacaktır.

 

0. sayfada üst sınır neden 50 değil de 115 diye soruyorsunuz. Çünkü verilerimi okuttuğum mysql sorgusunda ORDER BY ID DESC ifadesi ile verileri en büyük id den en küçüğüne göre sıralıyorum. Bu durumda 0. sayfada 115 inci satırdan 65 inci satıra kadar olan 50 kaydı görüntülemek istiyorum. Siz isterseniz bu sıralamayı ve formülleri değiştirebilirsiniz. */

 

$UstSinir = $KayitSayisi - ($SayfaNo * 50);

$AltSinir = $UstSinir - 50;

 

/* 115 kayıtta 2. sayfada yukarıdaki formüllere göre üst sınır = 15, alt sınır = -35 olacaktır. Negatif sayı handikapının önüne geçmek için alt sınırın sıfırın altına düşmesi durumunu kontrol altına alıyorum */

 

if ($AltSinir < 0) $AltSinir = 0;

 

Bundan sonraki kodlarda mysql sorgumuzu oluşturup tablodan veri çekiyoruz, eğer veri varsa verileri while döngüsü ile düzgün satırlar içinde görüntülüyoruz, en sonunda SayfaNolari isimli fonksiyonumuzu çağırarak veri tablomuzun altına sayfalara bölme işlemini ekliyoruz.

 

/* fonksiyonun parametreleri:

veri_tablosu : verilerin çekildiği tablonun adı

$Listelenen : ekranda görünmüş kayıt sayısı (arada silinmiş kayıtlar olduğundan her zaman 50 kayıt görüntülenmeyecektir.)

$SayfaNo : aktif sayfa numarası

$KayitSayisi : tablodaki silinmişler dahil kayıt sayısı.

liste.php : fonksiyonu çağıran dosyanın adı (fonksiyonun başka bir dosyada olduğunu varsayıyoruz. */

 

SayfaNolari(veri_tablosu, $Listelenen, $SayfaNo, $KayitSayisi, liste.php');

 

Artık çok fazla detaya girmeden fonksiyonun kodlarını vereyim. Açıklamadığım kısımları biraz kafa yorarak kolaylıkla anlayabilirsiniz.

 

www.nexyazilim.com/blog

 

function SayfaNolari($Tablo, $Listelenen, $SayfaNo, $KayitSayisi, $DosyaAdi)

{

            /* silinmiş kayıtlar HARİÇ kayıt sayısını kullanıcıya bildirmek için okuyalım, net kayıt sayısı ile ekranda listelenmiş olan kayıt sayısını ekrana yazalım.*/

 

            $Cumlecik = "SELECT COUNT(*) FROM " . $Tablo;

            $NetKayitSayisi = mysql_query($Cumlecik);

            $NetKayitSayisi = mysql_fetch_row($NetKayitSayisi);

            $NetKayitSayisi = $NetKayitSayisi[0];

            echo "<font class=\"etiket\">Toplam </font><font class=\"turuncuetiket\">" . $NetKayitSayisi . "</font><font class=\"etiket\">

             adet kayıt mevcut, </font><font class=\"turuncuetiket\">"  . $Listelenen . "</font><font class=\"etiket\"> adet listelendi. (Sayfa " . ($SayfaNo + 1) . ") ";

            echo "<br><br><br>";

 

            /* eğer kayıt sayısı 50 den fazla ise ve en az 1 adet silinmemiş kayıt var ise sayfa numaralarını oluşturmaya başlıyalım. */

 

            $i = 0; $j = 0;

            if ($KayitSayisi > 50 && $NetKayitSayisi > 0)

                        {

                        echo "<font class=\"mavi\">Sayfalar :</font>";

                        while ($i < 500)

                                   {

                                   if ($j == $SayfaNo) echo "<font class=\"turuncuetiket\"> [" . ($j + 1) . "] </font>";

                                   else echo "<span class=\"yesillink\"> <a href=\"" . $DosyaAdi . "?SayfaNo=" . $j . "\">[" . ($j + 1) . "]</a> </span>";

                                   $j++;

                                   $i+=50;

                                   if ($i > $KayitSayisi) break;

                                   }

                        }

 

            /* Eğer okuttuğumuz veri 10 sayfadan fazla ise geri kalan sayfaları bir combo box içinde listeleyip kullanıcının seçeceği sayfaya yönlenmesini sağlayalım */

 

            if ($KayitSayisi > 500)

                        {

                        echo "<font class=\"yesil\"> ... </font>

                        <form method=\"get\" action=\"" . $DosyaAdi . "\" style=\"margin:0;padding:0;display:inline;\">

                        <font class=\"turuncuetiket\"> Sonraki Sayfalar : </font>

                        <select name=\"SayfaNo\"><option value=\"0\"></option>";

                                               while($i < $KayitSayisi)

                                                           {

                                                           echo "<option value=\"" . $j . "\">" . ($j + 1) . "</option>";

                                                           $j++;

                                                           $i+=50;

                                                           }

                                               echo "</select>

                                               <input type=\"submit\" value=\" Git \">

                                               </form>";

            }

}

 

Umarım işinize yarar. www.nexyazilim.com/blog

 

YORUMLA
İsim - email
Başlık
Yorumunuz
YORUMLAR
Henüz yorum yapılmamış, ilk yapan sen ol!
CEO Müşteri İlişkileri
Ezgi MP3 Player
Haber Portalı
DYB İÇOM
C#
PHP
Network
PDA
Assembly
Hardware
XP & Vista
e - Kitap
Baloncuk
RSS (Canlı Başlıklar)
Ara
ÖTEKİLER
Ahmet Kaymaz
CE Turk
İç Mihrak