Codeigniter ile Veri Tabanı Kayıtlarını Sayfalama

Kategori : Demo, PHP, Mysql Yazar : alexander Tarih : 23 Eyl 2010, Pe 08:41 7 Yorum

İndir

Bu yazımda veri tabanından çekilen verileri codeigniter pagination sınıfını kullanarak sayfalanmasını anlatacağım.

İlk olarak url yapımızdan bahsedeyim. Linklerimizin dizilimi controller/function/sayfa şeklinde olacak. Örnek verecek olursak http://localhost/CodeIgniter/index.php/sayfalama/index/5 linkinde sayfalama controller sayfamızın adı, index fonksiyonumuzun adı, 5 ise bizim veri tabanından kayıtları çekerken başlayacağımız kayıt numarası.

Uygulamamıza başlayabiliriz .

Model

sayfalama_model.php adında yeni bir Model dosyası oluşturuyoruz. Model dosyamızda veri tabanından verileri çeken ve veri tabanındaki verilerin adetini bize veren 2 adet fonksiyonumuz olacak. Veri tabanımızda yazilar adında bir tablomuz ve bu tablomuzun id, baslik adında 2 tane sütunu bulunmaktadır.

İndireceğiniz uygulama dosyası içinde sql dosyasını bulabilirsiniz

Aşağıdaki kodlar model dosyamızı oluşturmaktadır.

<?php

class Sayfalama_model extends Model{

    function __construct()
    {
        parent::Model();
    }

    function yazilar($baslangic, $limit)
    {
        $sql = "SELECT * FROM yazilar ORDER BY id DESC LIMIT ?, ?";
        $query = $this->db->query( $sql, array((int)$baslangic, (int)$limit) );

        if( $query->num_rows() > 0 )
        {
            return $query->result_array();
        }
        else
        {
            return FALSE;
        }
    }

    function yazilar_adet()
    {
        $sql = "SELECT COUNT(*) as adet FROM yazilar";
        $query = $this->db->query($sql);

        return (int)$query->row()->adet;
    }

}

Yazıları çeken sorgumuzu bind query ile yaptık böylece otomotik olarak escape işlemi yaptık ayrıca parametre olarak gelen $baslangic ve $limit int tipine dönüştürerek urlde string olması durumuna karşılık önlemimizi almış olduk.

Controller

sayfalama.php adında yeni bir controller oluşturuyoruz. Controller dosyasında yapılacaklar :

  • Controller dosyamızda veri tabanındaki kayıtları url den gelen numaraya göre çekeceğiz.
  • Veri tabanındaki kayıtları her sayfada 3 adet kayıt olacak şekilde sayfalandıracağız.

Controller dosyamızın içeriği :

<?php

class Sayfalama extends Controller{

    function __construct()
    {
        parent::Controller();
    }

    function index()
    {
        $this->load->Model('sayfalama_model', 'Model'); 

        $data['sayfalama_linkleri'] = $this->sayfalama_linkleri($this->Model->yazilar_adet());
        $data['yazilar'] = $this->Model->yazilar($this->uri->segment(3,0),5);

        $this->load->view('sayfalama_view', $data);
    }

    function sayfalama_linkleri($toplam)
    {
        $this->load->library('pagination');
        $config = array(
            'base_url'          => site_url('sayfalama/index'),
            'total_rows'        => $toplam,
            'per_page'          => 3,
            'num_links'         => 2,
            'page_query_string' => FALSE,
            'uri_segment'       => 3,
            'full_tag_open'     => '<div class="pagination">',
            'full_tag_close'    => '</div>',
            'first_link'        => 'İlk Sayfa',
            'first_tag_open'    => '',
            'first_tag_close'   => '',
            'last_link'         => 'Son Sayfa',
            'last_tag_open'     => '',
            'last_tag_close'    => '',
            'next_link'         => 'Sonraki',
            'next_tag_open'     => '',
            'next_tag_close'    => '',
            'prev_link'         => 'Önceki',
            'prev_tag_open'     => '',
            'prev_tag_close'    => '',
            'cur_tag_open'      => '<span class="current">',
            'cur_tag_close'     => '</span>',
            'num_tag_open'      => '',
            'num_tag_close'     => ''

        );

        $this->pagination->initialize($config);

        return $this->pagination->create_links();
    }

View

Kayıtları ve sayfalama linklerini view dosyamızda yazdıracağız. sayfalama_view.php adında yeni bir view dosyası oluşturun ve aşağıdaki kodları view dosyasına ekleyin.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <style type="text/css">
        a{color:#21759B;text-decoration:none;}

        #table th{background:#eee;padding:5px;text-align:left; vertical-align: top; }
        #table td{padding:5px; border-bottom: 1px solid #c3c3c3; vertical-align: top; }
        #table{ -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; width:500px; border:1px solid #c3c3c3;}
        #table tr:hover{ background: #bed9ee;}

        .pagination{margin-top:20px;}
        .pagination a, .pagination span{background: #fff;padding:5px;margin:2px;border:1px solid #d9d9d9;font-weight: bold;text-decoration:none;-moz-border-radius:3px;-webkit-border-radius: 3px;}
    </style>

  </head>
  <body>
      <?php if( $yazilar ) : ?>

            <table id="table">
                <tr>
                    <th>ID</th>
                    <th>Başlık</th>

                </tr>

                <?php foreach( $yazilar as $dizi ) : ?>
                    <tr>
                        <td style="width: 10%;"><?php echo $dizi['id']; ?></td>
                        <td><a href="#"><?php echo $dizi['baslik']; ?></a></td>
                    </tr>
                <?php endforeach;  ?>

           </table>

            <?php echo $sayfalama_linkleri; ?>

    <?php endif; ?>

  </body>

</html>

Uygulamamız sonucunda oluşan sonuç :

Codeigniter Sayfalama

NOT : Eğer config dosyanızda $config['enable_query_strings'] = TRUE; şeklinde ayarlıysa page_query_string ayarını FALSE yapsak dahi codeigniter linklerimizi http://localhost/CodeIgniter/index.php/sayfalama/?per_page=5 şeklinde oluşturacaktır. Bu sorunu aşmak için system/libraries/pagination.php dosyasını açın ve aşağıdaki değişiklikleri yapın.

SATIR 125 eski hali :

if ($CI->config->item('enable_query_strings') === TRUE  OR $this->page_query_string === TRUE)

yeni hali :

if ($CI->config->item('enable_query_strings') === TRUE && $this->page_query_string === TRUE)

SATIR 175: eski hali :

if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)

yeni hali :

if ($CI->config->item('enable_query_strings') === TRUE && $this->page_query_string === TRUE)

İyi çalışmalar.

İndir

Yorumlar >> (7 Yorum)

  1. Tutkun 21 Şub 2011, Pt 18:22 tarihinde yazılmış.
    Merak ettim hocam, bu "sayfalama_linkleri()" fonksiyonunun parametresi nereye gidiyor? :D 'total_rows' => $this->Model->yazi_adet(), yerine: 'total_rows' => $toplam, olması gerekiyordu. Gözünden kaçmış sanırım :)
  2. Ömer 21 Şub 2011, Pt 18:24 tarihinde yazılmış.
    Bu çalışmada çok fonsiyonel php de il kod yazdığımda zorlandığım kısımlardan dı.. CodeIgniter iyi halletmiş eline sağlık üstad..
    • Mehmet 28 Nis 2012, Ct 11:41 tarihinde yazılmış.

      Merhaba hocam ben sizin kodlarla bir örnek yaptım ama olmadı listeliyorum haberleri yalnız sayfalama kısmında sayfayı cagırınca hata alıuyorum. Diger yada diger veriler gelmiyor hep aynı veriler nasıl aşabilirim?

      http://localhost/ci/index.php/sayfala/ dizin yapım bu.

      • alexander 28 Nis 2012, Ct 12:50 tarihinde yazılmış.

        aldığın hatayı görmeden yorum yapamam. var_dump fonksiyonu ile değişkenleri ekrana yazdırarak hatanın nedenini bulabilirsin.

    • Mehmet 28 Nis 2012, Ct 13:21 tarihinde yazılmış.

      Hocam , mesela ikinci sayıya tıkladıgımda 4 veri 8 verioluyor aynı sayfada ? Ama sonraki 4 kayıt gelsin istiyorum nasıl yapabilirim?? Bu arada yorum için çok teşşekür ederim.

      • alexander 28 Nis 2012, Ct 15:28 tarihinde yazılmış.

        büyük ihtimalle sql sorgundan kaynaklanıyor olsa gerek. örneğin 4. ve 8. kayıtlar arasındaki verileri çekmek istersen sorgun şu şekilde olmalı.

        SELECT * FROM tablo_adi limit 4,4

        “limit 4,4” yazan kısımdaki birinci 4. kaçıncı kayıttan itibaren getireceğini söylüyor, ikinci 4 ise kaç tane kayıt getireceğini söylüyor.

    Yorum Yap

    Yeni yorum yapıldığında bana bildir.

    Yorum Yazarken

    Basit Html etiketlerini kullanabilirsiniz.

    Kodlarınızı <pre></pre> etiketleri arasına yazınız.