PDA

View Full Version : Phân trang đơn giản (dành cho new bie thôi)



luuanhquyen
22-03-2009, 20:48
Vấn đề phân trang thì hầu như bạn nào lập trình web động cũng phải trải qua, mình có đọc các code phân trang trước nhưng thực sự chưa hiểu lắm nên đã tạm thời tạo ra 1 code phân trang mới rất đơn giản nhưng vẫn hiệu dụng và đáp ứng tốt yêu cầu phân trang, nay post code lên đây các new bie có thể sử dụng. Tinh thần là kiến thức không của riêng ai, code này mình cũng chỉ dám nói là dành cho new bie cho nên là có gì củ chuối mọi người thẳng thắn phê bình. HEHE.

Đầu tiên thêm vào đầu trang đoạn code này:


<? include("dbconnect.php");
//* phan them vao
$start1 = $_GET['start'];
$sql = "SELECT COUNT(*) AS count2 FROM comments";
$result1 = mysql_query($sql);
while ($row1 = mysql_fetch_array($result1))
{
$count2 = $row1["count2"];
?>


Chú thích
$start1 = $_get['start'];
Câu lệnh này nhận biến start (biến trung gian) bắt đầu để đọc dữ liệu từ sql
Toàn bộ khối lệnh sau đó sẽ dùng để đếm số bản ghi có trong CSDL
Khi hiển thị dữ liệu mình sẽ giới hạn đọc từ bản ghi ở vị trí $start1 câu lệnh như sau:

$result = mysql_query("select * from comments order by id desc limit $start1,5") or
die (mysql_error()); //* Chỉ đọc dữ liệu limit từ $start1 và chỉ đọc 5 dòng
while ($row = mysql_fetch_array($result))
{
//* đây là phần hiện thị dữ liệu ra trang.
}


Cuối trang sẽ là phần thiết kế các nút chuyển trang :

------------
<? if (($start1 > 5) and ($start1 -5 >0))
<a href="comments.php?start=<? $start = $start1 -5; echo $start;?> ">BACK</a>
?>

Khi nhấn nút Back thì sẽ lùi giá trị $start1 đi 5 giá trị như vậy sẽ đọc 5 bản ghi trước
------------
<?
if (($start1 > 0) and ($start1 -5 <=0))
<a href="comments.php?start=0">BACK</a>
?>

Đoạn lệnh này để quay về đọc 5 bản ghi đầu tiên.
-----------
<?
if (($start1 < $count2) and ($count2 >$start1 +5))
<a href="comments.php?start=<? $start = $start1 +5; echo $start;?> ">NEXT</a>
?>

Khi nhấn nút NEXT thì sẽ tăng $start1 lên 5 giá trị như vậy sẽ đọc 5 bản ghi sau.

-----------
Điều kiện nằm trong IF nhằm đảm bảo phân trang trong tổng số bản ghi không chạy ra ngoài phạm vi tổng số bản ghi. Ví dụ như nếu có từ 0 đến 20 bản ghi thì chỉ giới hạn biến start trung gian min = 0 và max = 20 chứ biến start sẽ không thể <0 và >20.

Chú ý: theo cách làm này thì khi muốn vào trang hiện thị dữ liệu luôn luôn phải gán biến start = 0. Như vậy muốn hyperlink đến trang này phải dùng code html như sau:

<li><a href="comments.php?start=0" action="GET"><COMMENTS</a></li>

Dạng địa chỉ trên trình duyệt là:
http://luuanhquyen.info/comments.php?start=0

Vậy hiểu 1 cách đơn giản hơn code này hoạt động như sau:

Trang đọc dữ liệu là trang nhận biến trung gian từ ngoài vào (biến start) để quyết định đọc dữ liệu từ bản ghi nào.
Kết hợp với code html để thiết kế các nút NEXT và BACK tăng giảm biến START để điều khiển các bản ghi được đọc.
Hyperlink phải được gán giá trị start = 0.
Đếm tổng số bản ghi điều khiển biến start ko chạy ra ngoài phạm vi số lượng bản ghi.

Mình đảm bảo code này dù đơn giản vẫn đáp ứng các yêu cầu sau:
Phân trang được - tất nhiên.
Chạy ổn định, không có lỗi.
Hoàn toàn có thể chỉnh sửa code để nút back next có thể thay đổi thành số bản ghi ví dụ như là thay back next thành ..[1..5][6..10][11..15]..
Hoàn toàn có thể thay đổi số bản ghi được đọc trên mỗi trang.
...
Nói chung mình thấy vẫn chạy ổn và đơn giản. Điều duy nhất phải lưu ý là khi hyperlink đến trang phải thêm biến start giá trị bằng 0 như đã nói.
Khả năng diễn giải của mình có hạn có gì lủng củng sai sót các bro reply.

ngoc_viet08
23-03-2009, 11:31
để mọi người dễ hiểu hơn , phiền bạn giải thích 1 số đoạn sau :
$sql = "SELECT COUNT(*) AS count2 FROM comments";
$result1 = mysql_query($sql);
while ($row1 = mysql_fetch_array($result1))
{
$count2 = $row1["count2"];
}
count2 là 1 cột trong table ????
nó là cái gì ???hay nó là số đếm các mẩu tin . vậy thì nên dùng thuật ngữ "id" hoặc mình quen xài "stt" cho thông dụng , dễ hiểu với dân vn .

+++++++++++++++++++
if (($start1 > 5) and ($start1 -5 >0))
:D 2 điều kiện này hình như là 1 ???

nói chung code bạn sẽ chạy được . tuy nhiên . các website thường ko phân trang bằng cách chọn mẩu tin bắt đầu như bạn mà chọn đúng page cần hiển thị .
kiểu như
http://ddth.com/showthread.php?t=259743&page=2
làm như bạn sẽ ko biết có bao nhiêu trang tổng cổng sẽ được duyệt . muốn bạn phải thêm code để tính tổng số trang .

toannet
23-03-2009, 13:54
Bạn ấy có ý muốn viết đơn giản cho newbie mà . Bạn nên thông cảm , nếu bạn có code nào hay hơn post lên đi ...

Ok !

ngoc_viet08
24-03-2009, 09:13
ừm , đó là ý tốt của bạn ý đáng ghi nhận . tuy nhiên theo ý kiến mình thì .
code dành cho newbie có nghĩa là code đơn giản , sự chồng chéo giữa các hàm ít , và sử dụng hàm thông dụng .
theo mình nghĩ code phân trang cho pro hay cho newbie gì thì nó cũng như nhau cả thôi . chả khác gì . chỉ có code phân trang phức tạp ở việc xử lý cái thông tin query ra như kiểu forum này chẳng hạn , hay trưng bày sản phẩm dạng table với nhiều sp trên 1 hàng chứ ko đơn thuần là trải từ trên xuống ... còn công thức xây dựng phân trang nó cũng tương tự nhau cả . khác nhau 1 xíu ở phần giải thuật .
:d chỉ có bác nào giải thuật rắc rối thì code phân trang mới phức tạp thôi .=)) lúc đó người viết mới đúng là newbie . càng giỏi thì người ta càng xây dựng code đơn giản , dễ hiểu , có chuẩn mực , trình bày đẹp , rõ ràng !
nói túm lại thì đã gọi là phân trang thì phải nổi bật được cái phần trang lên (page ) mới đúng . ở bài viết phân trang đã có 2 đoạn code khác nhau về việc phân trang , mình đã xem và hiểu cả . cả 2 đều đơn giản và tương đối giống nhau . chỉ có bạn chủ topic đọc chưa hiểu nên nghĩ nó phức tạp . :D code của ai thì chỉ có người ý đọc nhanh nhất thui mà :D