PHP

Phân trang PHP .

Chào các bạn ! Hôm nay mình sẽ giới thiệu với các bạn về cách phân trang trong php .
Như các bạn đã biết thì trong 1 trang web chúng ta không chỉ có vài record dữ liệu như ban đầu chúng ta nhập. Mà nó sẽ tăng dẫn theo thời gian khi site của bạn hoạt động. Và một trong những điều khó tránh khỏi đó là phải phân trang cho các sản phẩm hoặc tin tức … chúng ta hiện ra để có thể quản lý được layout của site không bị dăng hoặc quá dài .
Chính vì vậy khi làm 1 website chúng ta phải tính trước được điều đó .
Có lẽ đói với các anh chị đã làm vài site rồi thì việc phân trang không làm khó dể được phải không ạ. Nhưng đối với các bạn mới bắt đầu tiếp xúc với php thì việc phân trang cũng là một vấn đề không phải dể dàng . Nếu các anh chị pro thì đừng chê nha . Mình cũng bắt đầu chưa lâu nhưng mình thấy nó hơi khó khăn lúc ban đầu nên viết lại . Ai có nhu cầu thì xem vậy !! hihi

Trước hết để có thể show dữ liệu ra thì mình sẽ tạo database tên là pic_database trong đó có bảng picture .
Bảng picture là nơi mà chúng ta sẽ lấy ra các thông tin để show ra .

CREATE TABLE IF NOT EXISTS `picture` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`size` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`sort_desc` text COLLATE utf8_unicode_ci NOT NULL,
`long_desc` longtext COLLATE utf8_unicode_ci NOT NULL,
`price` decimal(10,0) NOT NULL,
`update_date` datetime NOT NULL,
`total_view` int(11) NOT NULL,
PRIMARY KEY (`id`)
)

Sau khi tạo được database thì ta sẽ kết nối vào database như thường lệ thì mình tạo 1 file dbcon.php để kết nối vào csdl của bạn.

<?php
$con=mysql_connect("localhost","root","")or die ("Don't connect database!");
mysql_select_db("pic_database");
mysql_query("SET NAME utf8");
?>

Sau đó bạn include file dbcon.php này vào trang mà bạn show ra sản phẩm của bạn , giả sử ta đặt là index.php

<?php
include ("dbcon.php");
?>

Ở đây mình cho 2 trang index.php và dbcon.php ở cùng cấp nha các bạn.

Sau khi đã tạo xong csdl và file kết nối chúng ta sẽ nói một chút về cách xử lý trong phân trang .
Thứ nhất để có thể hiểu nhanh vấn đề này các bạn vào http://localhost/phpmyadmin sau đó thực hiện 1 vài câu lệnh như sau :
SELECT * FROM `picture` where price > ‘0’ ORDER BY id LIMIT 0,10
Với câu lênh sql đó các bạn sẽ lấy ra được 10 sản phẩm có price lớn hơn không và sắp xếp theo id . Hơi kì phải không bạn vì sản phẩm thì lúc nào giá chẳng lớn hơn 0 nhưng đây là mình ví dụ thôi .
Điều quan trọng là các bạn để ý vào phần LIMIT 0,10 có nghĩa là lấy ra 10 sản phẩm bắt đầu từ vị trí đầu tiên.
Vậy giả sử mình muốn phân trang mà 1 trang mình lấy ra 10 sản phẩm thì đó sẽ là 10 sản phẩm đầu tiên . Và trang thứ 2 sẽ là 10 sản phẩm tiếp theo : LIMIT 10,10 .
Tương tự cho 10 sản phẩm của trang thứ 3 sẽ là LIMIT 20,10 ….Và cứ như thế cho đến khi hết sản phẩm .
Vậy để có thể phân trang được thì ta phải làm sao cho các số đó tự động lấy được mỗi khi sang trang .
Mình sẽ tạo ra 2 cái biến $start và $display để tượng trưng cho số bắt đầu và số lượng sản phẩm lấy trong LIMIT . Như thế nó sẽ trở thành LIMIT $start , $display .
Biến $display này là số sản phẩm trên một trang , cái này do mình tự cho , bạn có thể cho 5 ,6,7,8 hoặc 10 tùy bạn . Ở đây mình tạm cho nó là 5 tức là chúng ta sẽ lấy ra 5 sản phẩm trên mỗi trang .
Bạn xem hinh phía dưới:

Ở đây ta giả sử có 8 trang thì trang bắt đầu sẽ có $start = 0 , trang tiếp theo $start = 5 , $start =10 ….. và cứ thế tăng lên theo cấp số cộng là 5 . Con số 5 này chính là giá trị của $display . Vậy cứ mỗi lần chuyển sang trang kế tiếp tức là $tart sẽ bằng $start tại vị trí hiện thời cộng với $display . Vậy chúng ta đã có thể giải quyết được vấn đề về biến $start cho viêc lùi hoặc tiến 1 trang .
Nhưng vấn đề đặt ra ở đây là giả sử bạn đang ở trang 1 mà bạn lại muốn click vào trang 3 để xem sản phẩm ở trang 3 thì sao .
Cái này chúng ta cần để ý đến phần phía trên của hình ảnh có display*(i -1). Số i ở đây chính bằng trang hiện tại mà bạn đang đứng . Ví dụ bạn đang ở trang 5 chẳng hạn thì khi đó $display*(i-1) = 5*(5-1) = 20 = $start tại trang 5 phải không ạ .Vậy nó sẽ giúp chúng ta khi người dùng muốn chuyển từ trang này qua trang kia mà không theo tứ tự tiến hay lui 1 trang. Họ có thể click vào bất kì trang nào .
Chúng ta còn có thêm $current cái này thì mình dùng khi tạo link cho trang . Nếu bạn đang xem 1 trang nào đó thì trang đó sẽ không có link như các trang còn lại và im đậm hay in nghiêng chẳng hạn để cho người dùng biết họ đang ở trang đó.

Ví dụ như bạn đang ở trang 3 thì nó sẽ là thế này .

Bây giờ chúng ta sẽ đi vào giải quyết từng vấn để .
1 . Để bạn có thể biết được có bao nhiêu trang thì bạn cần phải có được số record trong database .
Nên chúng ta sẽ đếm để biết số lượng id có trong bảng picture này .
Số trang sẽ bằng số record có trong bảng chia cho số sản phẩm của 1 trang . Trong  này có sử dụng hàm ceil để làm tròn , vì số trang không thể là 1,2 hay 3,5 được .

$query = "SELECT COUNT(id) FROM picture";
$res = mysqli_query($connection,$query) or die('Could not select picture ');
$rows = mysqli_fetch_array($res, MYSQLI_NUM);
$totalId = $rows[0];
   if($totalId  > $display) {
        $page = ceil($totalId/$display);
   } else {
        $page = 1;
   }

2 . Sau đó chung ta show sản phẩm ra . Ví dụ ở đây mình sẽ lấy ra một số thông tin trong bảng picture chẳng hạn như : title , size , update_date .
Chúng ta sẽ cho $start = 0 và $display = 5 để lúc ban đâu vào ta sẽ lấy ra 5 sản phẩm đầu tiên .

<php?
$sql = "SELECT *
FROM picture
ORDER BY id
LIMIT $start, $display";
$result = mysqli_query($connection,$sql) or die('Could not select email';
while($set = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$title = $set['title'];
$update_date = $set['update_date'];
$size = $set['size'];
echo "<tr>
<td>$title</td>
<td>$size</td>
<td>$update_date</td>
</tr>";
}
?>

3 . Tạo phần đưa ra phân trang :
Nó sẽ có dạng như :

Và code sẽ đươc thực hiện như sau :

<?php
if($page > 1) { 

$next = $start + $display;
$prev = $start - $display;
$current = ($start/$display)+1;

//Hien thi trang Previous
if($current !=1) {
         echo "<li><a href='phantrang.php?start=$prev'>Previous
                                                                 </a></li>";
}
//Hien thi so link
for($i=1;$i<=$page;$i++) {
         if($current != $i) {
               echo "<li><a href='phantrang.php?start=".($display*($i-1))
                                                              >$i</a></li>";
         } else {
               echo "<li class='current'>$i</li>";
         }
} 

//Hien thi trang Next

if($current != $page) {
          echo "<li><a href='phantrang.php?start=$next'>Next
                                                               </a></li>";
}
}
?>

Khi chúng ta click vào số trang thì nó sẽ truyền link đi và truyền thêm tham số start để lấy ra sản phẩm của trang đó .

Ngoài ra để tránh trường hợp khi bạn đang ở trang 1 mà bạn click vào preview thì sẽ xãy ra trường hợp LIMIT -5,5 (lỗi sql ss) . Nên trước khi thực hiện lấy sản phẩm thì bạn cần có lệnh kiểm tra .
Kết quả chúng ta thấy sẽ là : index.php

Download source
Download database

Phù … xong rồi ! Tạm thế đã .

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s