pagination

การแบ่งข้อมูลออกเป็นหน้าๆแบบ pagination ด้วย PHP

การพัฒนาระบบหรือเว็บไซต์ต่างหากมีข้อมูลจำนวนมาก ส่วนใหญ่ก็คงจะล้นหน้าตาส่วนที่เราออกแบบเอาไว้ แล้วจะทำยังไงดีให้การแสดงผลแบ่งจำนวนออกเป็นอัตราที่พอเหมาะตามที่เราต้องการ งั้นมาดูวิธีการทำ Pagination ด้วย PHP กันดีกว่าครับ

pagination

pagination

การแบ่งข้อมูลที่เราแสดงออกมาด้วย PHP นั้นอันที่จริงแล้วถือว่าเป็นเรื่องที่พบเจอบ่อยมากๆนะครับ เช่น เราอาจจะออกแบบหน้าสำหรับให้แสดงเนื้อหา 6 เนื้อหาต่อ 1 หน้า แต่ว่าเนื้อหาจริงเราอาจจะมีมากกว่านั้น แบบนี้เราต้องทำการแบ่งหน้าเพื่อให้ข้อมูลที่ออกมานั้นมีหนา้ตาเหมือนกัน แต่แตกต่างกันตรงที่เนื้อหาอย่างเดียว

มาลองดู Code กันครับ

อันดับแรกมาดูเรื่องของการกำหนดการแสดงผลก่อนเลยครับว่าเราต้องการให้หน้านี้มีการแสดงผลทั้งหมดเท่าไหร่ เช่น ต้องการให้แสดงผลทั้งหมด 4 หัวข้อ

<?php
$pagelen = 4;
?>

ผมสร้างตัวแปรที่ชื่อ $pagelen ขึ้นมาเพื่อรับค่าว่าในแต่ละหน้าจะต้องให้แสดงทั้งหมดกี่หัวข้อ จากนั้นผมจะทำการประกาศตัวแปรขึ้นมาเพื่อรับค่าจาก URL มาดูว่าว่าค่าอะไรแนบมาหรือไม่

<?php
$page = $_GET['page'];
?>

จากนั้นผมจะทำการเช็คดูว่าถ้าหน้าแรกมาแบบไม่มีค่าอะไรมาเลย ให้ทำการ Set ค่าในตัวแปร page เป็น 1

<?php
if(empty($page)){
   $page  == 1;
}
?>

จากนั้นให้ทำการ Query ค่าออกมาจากฐานข้อมูลเพื่อนับดูว่ามีค่าทั้งหมดเท่าไหร่ มีทั้งหมดกี่ Row

<?php
$sCountSelect = "SELECT * FROM news";
$oCountSelect = mysql_query($sCountSelect);
$sNumCount = mysql_num_row($oCountSelect);
?>

บรรทัดแรกผมทำการ Select ข้อมูลทั้งหมดออกมาเก็บค่าไว้ในตัวแปรชื่อ $sCountSelect
แล้วบรรทัดต่อมา ผมสั่ง Query
บรรทัดที่สามผมทำการนับข้อมูลที่ Query ออกมาว่ามีทั้งหมดเท่าไหร่ด้วย function ของ mysl_num_row

ทีนี้พอเราได้จำนวนทั้งหมดมาแล้ว เราจะเอามาหารปัดเศษกับจำนวนที่เราตั้งไว้ใน $pagelen กันก่อนนะครับ

<?php
$totalPage= ceil($sNumCount / $pagelen);
?>

ทีนี้ต่อมาเราจะทำการเตรียมตัวแปรไว้อีกตัวเพื่อกำหนด Limit ในตอน Query ข้อมูลออกมาด้วยการ ลบ 1 แล้วนำไปคูณกับจำนวนหน้าที่เราต้องการแสดง

<?php
$goto = ($page-1) * $pagelen;
?>

เราจะมาทำการ Select ข้อมูลกันอีกรอบซึ่งราวนี้เราจะมาทำการกำหนดปริมาณที่จะให้ Row ออกมาตามการแสดงผล

<?php
$sSelectData = "SELECT * FROM news LIMIT $goto, $pagelen";
$0QueryData = mysql_query($sSelectData);
?>

ผม Select ข้อมูลออกมาโดยระบุช่วงของข้อมูลเอาไว้ที่ตัวแปรสองตัว แล้วทำการ Query

ทีนี้ในส่วนของ Link เราจะมาสร้างหน้าทางซ้ายมือซึ่งเป็นหน้าแรกกับหน้าก่อนหน้ากันก่อน

<?php
if($page > 1){
    $back = $page -1;
    echo "<a href=$PHP_SELF?page=1">First</a>";
    echo "<a href=$PHP_SELF?page=".$back."> Previous </a>";
}
?>

ตรงนี้เราใช้ความสามารถของ PHP มาเป็นตัวช่วยด้วย PHP_SELF ซึ่งเป็นการเรียกไฟล์เดิมซึ่งตรงนี้จะทำการเปลี่ยนค่าไปตาม Page จริงอยู่แล้ว และเราใช้ตัวแปร $back เพื่อนำหมายเลขจาก Url ด้านบนมาลบออก 1 ทุกครั้งเพื่อถอยหลังกลับ

แล้วทีนี้เราจะมาดูกันในส่วนของการสร้างตัวเลข 1 2 3 4 ….. ไปเรื่อยกันบ้าง

<?php
for($a=1 $a<=$totalPage; $a++){
      if($a == $page) {
               echo "[$a]";
      } else {
               echo "<a href=$PHP_SELF?page=$a>$a</a>";
      }
}
?>

ตรงนี้เราใช้การวนลูปแบบ For loop มาช่วยเพราะเราไม่รู้ว่าเนื้อหาจะมีทั้งหมดเท่าไหร่ เราเลยให้ตัวแปร $a ถ้าน้อยกว่า Page ทั้งหมดก็ให้เพิ่มขึ้นไปเรื่อยๆ แล้วด้านในลูป ถ้าหาก $a มีค่าเท่ากับ $page ปัจจุบันก็ให้แสดงเครื่องหมาย [ ] ครอบ ตัวเลขลำดับนั้นๆเอาไว้

สุดท้ายแล้วเราจะมาดูกันในส่วนของ Link ไปหน้าสุดท้ายกับ Link หน้าถัดไป

<?php
if($page < $totalpage) {
    $next = $page +1;
    echo "<a href=$PHP_SELF?=page".$next."> Next </a>";
    echo "<a href=$PHPSELF?=page".$totalpage."> Last </a>";
}
?>

Code ส่วนสุดท้าย เราตั้งค่าตัวแปร $next ขึ้นมาโดยเอาค่าหน้าปัจจุบันที่ส่งมากับ Url มาบวก 1 จากนั้นก็แสดงผลแบบเดียวกันกับตอนทำ Back ส่วน Link หน้าสุดท้ายเราก็ใช้ $totalpage มาเป็นตัวกำหนดเพราะหมายถึงว่าหน้าทั้งหมดมีเท่าไหร่

นี่เป็นการใช้งานการแบ่งเพจแสดง้อมูลแบบง่ายๆนะครับ ลองนำไปประยุกต์ใช้งานกันดู ส่วนถ้าข้อมูลออกมาเป็นตารางไม่ใช่เป็นเนื้อหา ผมแนะนำตัวช่วยอย่าง DataTable นะครับเพราะทำตรงนี้มาให้เราเสร็จเลยไม่ต้องมานั่งทำเอง แต่ถ้าใครพัฒนาระบบโดยใช้ PHP Framework พวกนี้จะมีตัวช่วยมาให้ซึ่งทำให้การใช้งานไม่ยุ่งยากอีกด้วยครับ