Phân trang trong PHP đơn giản nhất

 Bạn có thể phân trang trong PHP bằng jquery, javascript hay có thể tự code bằng tay. Mỗi cách có một cái hay và nhược điểm của nó.

Hôm nay mình chia sẽ một cách phân trang sql trong php một cách đơn giản nhất. Cách phân trang này không hoàn toàn do mình nghĩ ra (vì mình chưa có khả năng đó), nhưng dựa trên một số code có sẵn được chia sẽ trên internet mà mình bổ sung một số phần vào cho hoàn thiện theo yêu cầu của bản thân. Thiết nghĩ một số bạn cũng sẽ thích và dùng code này.

Với cách phân trang thông thường thì chỉ phân trang khi đã load tất cả dữ liệu từ sql lên trước rồi sau đó mới phân trang dựa trên những dữ liệu đã load lên đó. Còn cách này thì phân trang ngay phần sql luôn trước khi hiển thị bảng ra vì vậy cần một đoạn code đặt trước khi load bảng từ sql

<?php

$sql = "SELECT * FROM table";


$item_per_page = !empty($_GET['per_page']) ? $_GET['per_page'] : 20;

$current_page = !empty($_GET['page']) ? $_GET['page'] : 1;

$offset = ($current_page - 1) * $item_per_page;

$total_records =mysqli_query($conn,"SELECT * FROM table");

$total_records = $total_records -> num_rows;

$total_page = ceil($total_records / $item_per_page);

$sql .= " ORDER BY id ASC LIMIT ".$item_per_page." OFFSET ".$offset;

?>

Trong đó 

  • $item_per_page là để hiển thị số hàng trong một trang, ở trên tui để là 20
  • $current_page  là trang hiện tại đang hiển thị
  • $total_records  là lấy tổng số record trong sql
  • $total_page là tổng số trang sẽ có

Tiếp đến tạo một tập tin và đặt tên là pagination.php và lưu đoạn code bên dưới vào

<div class="pagination">

    <span>Hiển thị <?php if($item_per_page < $total_records){ echo $item_per_page;}else{echo $total_records;} ?> / <?= $total_records ?></span>

    <!-- Tăng giới hạn hiển thị trên trang -->

        <select name="per_page" class="pg-select" onChange="set_per_page(this.value);">

            <option value="20" <?php if($item_per_page=="20"){ echo 'selected="selected"';}?>>20</option>

            <option value="50" <?php if($item_per_page=="50"){ echo 'selected="selected"';}?>>50</option>

            <option value="100" <?php if($item_per_page=="100"){ echo 'selected="selected"';}?>>100</option>

            <option value="500" <?php if($item_per_page=="500"){ echo 'selected="selected"';}?>>500</option>

            <option value="3000" <?php if($item_per_page=="3000"){ echo 'selected="selected"';}?>>3000</option>

        </select>    

    <!-- Hiển thị sô trang trên tổng -->

    <span class="pg-pertotal">Page <?php echo $current_page." of ".$total_page; ?></span>    

    <!-- trang đầu tiên -->

    <?php 

        if($current_page > 3){

            $first_page =1;

    ?>

        <a class="pg-first" href="?per_page=<?= $item_per_page ?>&page=<?= $first_page ?>">First</a>

    <?php } ?>

    

    <!-- ve trang trươc -->

    <?php 

    if($current_page > 1){

        $prev_page = $current_page - 1;

    ?>

        <a class="pg-prev" href="?per_page=<?= $item_per_page ?>&page=<?= $prev_page ?>">Prev</a>

    <?php } ?>    

    <!-- trang hiện tại -->

    <?php for($num =1; $num <= $total_page; $num++){ ?>

        <?php if($num != $current_page){ ?>

            <?php if($num > $current_page - 3 && $num < $current_page + 3){ ?>

                <a class="pg-normal" href="?per_page=<?= $item_per_page ?>&page=<?= $num ?>"><?= $num ?></a>

            <?php } ?>

        <?php } else { ?>

            <span class="pg-active"><?= $num ?></span>

        <?php } ?>

    <?php } ?>

    

    <!-- ve trang sau -->

    <?php 

    if($current_page < $total_page - 1){

        $next_page = $current_page + 1;

    ?>

        <a class="pg-next" href="?per_page=<?= $item_per_page ?>&page=<?= $next_page ?>">Next</a>

    <?php } ?>

    

    <!-- trang cuối cùng -->

    <?php 

        if($current_page < $total_page - 3){

            $last_page = $total_page;

    ?>

        <a class="pg-last" href="?per_page=<?= $item_per_page ?>&page=<?= $last_page ?>">Last</a>

    <?php } ?>

    

    <!-- nhảy đến trang cụ thể-->

    <form action="" method="get">

        <span class="pg-label">Đến trang</span>

        <input type="hidden" name="per_page" value="<?= $item_per_page ?>" />

        <input type="text" class="pg-go" name="page" value="<?= $current_page ?>" />

        <button class="pg-btngo" type="submit">Đi</button>

    </form>

</div>

<script type="text/javascript">

function set_per_page(x)

{

location.href = "?per_page="+x;

}

</script>


Và cuối cùng để hiển thị được cái phân trang ra dưới cái bảng dữ liệu mà bạn vừa load lên thì bạn thêm đoạn code dưới đây vào bên dưới cái bảng dữ liệu của bạn.

<?php include('../inc/pagination.php');?>

Và bonus thêm cái CSS cho anh em nào lười hoặc chưa rành về CSS nhé

.pagination{

    background:#fff;

    align-items: center;

    justify-content: center;

    padding: 5px 0;

}

.pg-normal{

    background:#eee;

    width: 50px;

    margin:0 2px;

    padding: 2px 0;

    text-align: center;

    border:1px solid #eee;

    border-radius:3px;

}

.pg-active{

    width: 50px;

    margin:0 2px;

    padding: 3px 0;

    text-align: center;

    border:1px solid #eee;

    border-radius:3px;

}

.pg-next{

    background:#eee;

    width: 50px;

    margin:0 2px;

    padding: 2px 0;

    text-align: center;

    border:1px solid #eee;

    border-radius:3px;

}

.pg-prev{

    background:#eee;

    width: 50px;

    margin:0 2px;

    padding: 2px 0;;

    text-align: center;

    border:1px solid #eee;

    border-radius:3px;

}

.pg-first{

    background:#eee;

    width: 50px;

    margin:0 2px;

    padding: 2px 0;

    text-align: center;

    border:1px solid #eee;

    border-radius:3px;

}

.pg-last{

    background:#eee;

    width: 50px;

    margin:0 2px;

    padding: 2px 0;

    text-align: center;

    border:1px solid #eee;

    border-radius:3px;

}

.pg-pertotal{

    margin-left: 15px;

    border: 1px solid #eee;

    padding: 2px 5px;

    border-radius: 3px;

    background: #eee;

    margin-right: 2px;

}

.pg-label{margin-left:10px;}

.pg-go{

    width:50px;

    padding:2px;

    margin: 0 5px;

    text-align:center;

    border: 1px solid #ced4da;

    border-radius: 3px;

}

.pg-select{

    width:65px;

    padding:4px;

    margin: 0 5px;

    text-align:center;

    border: 1px solid #ced4da;

    border-radius: 3px;

}

.pg-btngo{

    background:#ccc;

    width:40px;

    padding:3px 0;

    border:none;

    border-radius:3px;

    text-align:center;

}

Thế thôi là đã có một cái phân trang cho sql trong php rồi nhé. Vừa không rườm rà vừa dễ sử dụng chỉ có cái phiền xíu là muốn phân trang ở đâu thì bỏ ở đó chứ ko tự động phân trang như mấy cái dùng jquery hay javascript, nhưng bù lại nó phân luôn từ sql chứ ko load sql rồi phân nghen.


Đăng nhận xét

0 Nhận xét