การแบ่งหน้าแบบเก่าไปใหม่ โดยแสดงข้อมูลชุดใหม่ก่อน

การแบ่งหน้าโดยเรียงแบบเก่าไปใหม่ โดยแสดงจากข้อมูลชุดใหม่ก่อน ก็คือแบ่งข้อมูลเป็นหน้าๆ เอาหน้าสุดท้ายมาโชว์ก่อน พอกด previous ถึงไปดึงเอาข้อมูลชุดก่อนๆตามมา
หากอธิบายง่ายๆก็เหมือนกับการแสดงผล comment ของ facebook ในเว็บ facebook นั่นเอง ก็คือมันจะโชว์คอมเม้นท์ใหม่ๆก่อน พอกด previous xx comments มันก็จะดึงข้อมูลชุดเก่ากว่านี้มา ตามลำดับ

ผมจะเริ่มต้นโดยสมมุติจากข้อมูลตัวเลขที่กำหนดเป็นตัวแปรก่อนนะครับ


$total = 202; // 202 นี้ก็คือจำนวน record ทั้งหมดในฐานข้อมูล
$limit = 50; // 50 นี้ก็คือจำนวน limit ที่จะให้แสดงได้ใน 1 หน้า

ต่อไปเราก็มาหาจำนวนชุดหรือจำนวนหน้าทั้งหมด โดยนำเอาจำนวน $total หรือ record ทั้งหมดมาหารด้วยจำนวน limit แล้วเศษปัดขึ้น
(ปัดขึ้นเพราะแมัจะมีเศษมันก็หมายถึงข้อมูลที่จะเหลือๆอยู่ ต้องแสดงให้หมด)


$total_page = ceil( $total/$limit ); // จากตัวอย่างนี้จำนวนหน้าจะได้ทั้งหมด 5 หน้า หมายความว่าแสดงครบ 5 หน้าแล้วข้อมูลออกมาครบหมดแน่ๆ

ทดลองทำงานแบ่งหน้าโดยยังไม่เชื่อมกับ sql

ตอนนี้ได้จำนวน record และจำนวน limit ทั้งหมดแล้ว
ได้จำนวนหน้าทั้งหมดแล้ว
มาลองเขียน for วน loop ดูว่ามันจะเป็นไง


$total = 202;
$limit = 50;
$total_page = ceil( $total/$limit );

// ในการวน loop นี้ $i จะแทนเลขหน้าที่จะส่งกันด้วย $_GET หรือ $_POST ก็ตามนะครับ
for ( $i=1; $i<=$total_page; $i++ ) {
    $start = ( $total-( $limit*$i ) );
    if ( $start < 0 ) {$start = 0;}
    echo 'page '.$i.' start: '.$start.'<br />';
    if ( $start == 0 ) {$limit = ($total%$limit);}// ส่วนที่เหลือนี้คือถ้า start = 0 ให้เอา $total%$limit จะได้จำนวนที่เหลือในหน้านั้นครับ ให้มัน limit ส่วนเหลือออกมาพอดีๆ
    echo 'limit: '.$limit.'<br /><br />';
}

จะได้ผลลัพธ์

page 1 start: 152
limit: 50page 2 start: 102
limit: 50

page 3 start: 52
limit: 50

page 4 start: 2
limit: 50

page 5 start: 0
limit: 2

การทำงานกับ sql จริงๆ.


$sql = "select count( * ) from table where status = 'on'";
$query = mysql_query( $sql );
$total = mysql_result( $query, 0, 0);
$limit = 50;
// รับค่า"หน้า"ที่แบ่งมา
$page = $_GET['page'];
if ( !is_numeric( $page ) ) {
    $page = '1';// $page ไม่มีค่าอะไรส่งมา ให้เริ่มจาก 1
}
// หาค่า $start โดยเอาทั้งหมดมาลบ(limitxจำนวนหน้า)
$start = ( $total-( $limit*$page ) );
if ( $start < 0 ) {
    $start = 0;
}
if ( $start == 0 ) {
    $limit = ( $total%$limit );
    if ( $limit == 0 ) {
        $limit = '50';
    }
    // $start = 0 ก็คือข้อมูลหมดแล้ว คุณอาจส่งค่ากลับไปยังหน้าเพจจากตรงนี้ก็ได้ กรณีทำแบบหน้า php กับหน้าแสดงผลคนละหน้ากัน ตัวอย่าง..
    $_GET['page'] = 0;// ในหน้าแสดงผลหรือหน้าที่รับค่าจาก $_GET นี้ได้ ก็ทำการเช็คว่าถ้า $_GET['page'] == 0 ให้ยกเลิกการแสดงปุ่มแบ่งหน้า เพราะข้อมูลเก่าๆแสดงหมดเกลี้ยงแล้ว
}
// เขียน sql ใหม่ตามเงื่อนไขเดิมที่ใช้ใน total (ถ้ามี)
$sql = "select * from table where status = 'on'";
// เพิ่มคำสั่ง limit เข้าไป
$sql .= " limit $start, $limit";
$result = mysql_query( $sql );

เรียบร้อยแล้วครับ เพียงเท่านี้ก็น่าจะนำไปทำต่อได้แล้ว
ทีนี้ตอนส่งค่าหน้าไป ก็เริ่มจาก 1 +ไปเรื่อยๆครับ จนกว่าจะ query แล้วได้ค่าว่างเปล่าก็ไม่ต้องแสดงตัวแบ่งหน้าอีก
ตัวแบ่งหน้านี้ จะใช้ 1 2 3 ก็ได้นะครับ แต่จะมันน่าจะง่ายกว่าถ้าทำเป็นปุ่มเดียวเลย คือกด previous comment แบบนี้ไปเรื่อยๆ จนข้อมูลถูกนำมาแสดงจนหมดก็ไม่ต้องโชว์ปุ่มอีก

Download โค้ดตัวอย่าง
Download
ลองดาวน์โหลดโค้ดตัวอย่างไปเล่นดูนะครับ สุดท้ายหวังว่าบทความนี้จะเกิดประโยชน์กับทุกท่าน

 

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>