แจกตัวอย่างการสร้างหน้ารายงานด้วย PHP พร้อมตัวอย่างการดึงข้อมูลจากฐานข้อมูล MySql และการแบ่งหน้าโดยใช้ Function Pagination
อธิบายการใช้งาน PHP Code อย่างละเอียด
เริ่มด้วยตัวอย่างการสร้าง SQL สำหรับดึงข้อมูล จังหวัด อำเภอ ตำบล
ตัวอย่างด้านล่าง คือการดึงข้อมูลด้วยการเชื่อมตารางทั้ง 3 ตารางเข้าด้วยกัน และเพิ่มเงื่อนไขการดึงข้อมูล WHERE จังหวัดที่มีคำว่า "เชียง" ในชื่อจังหวัด และ LIMIT การแสดงผลข้อมูลไว้ที่ 100 รายการหากดึงข้อมูลจากฐานข้อมูลด้วย Query ชุดนี้ Query จะดึงข้อมูลจากฐานข้อมูลมาแสดงและจำกัดการแสดงผลที่ 100 รายการเท่านั้น
SELECT
pv.`code` AS province_code,
pv.name_th AS province_name,
dt.`code` AS district_code,
dt.name_th AS district_name,
sdt.`code` AS subdistrict_code,
sdt.name_th AS subdistrict_name
FROM
province AS pv
INNER JOIN district AS dt ON SUBSTR(pv.`code`,1,2)= SUBSTR(dt.`code`,1,2)
INNER JOIN subdistrict AS sdt ON SUBSTR(dt.`code`,1,4)= SUBSTR(sdt.`code`,1,4)
WHERE
pv.name_th LIKE '%เชียง%'
LIMIT 100
pv.`code` AS province_code,
pv.name_th AS province_name,
dt.`code` AS district_code,
dt.name_th AS district_name,
sdt.`code` AS subdistrict_code,
sdt.name_th AS subdistrict_name
FROM
province AS pv
INNER JOIN district AS dt ON SUBSTR(pv.`code`,1,2)= SUBSTR(dt.`code`,1,2)
INNER JOIN subdistrict AS sdt ON SUBSTR(dt.`code`,1,4)= SUBSTR(sdt.`code`,1,4)
WHERE
pv.name_th LIKE '%เชียง%'
LIMIT 100
ตัวอย่าง Code การแบ่งหน้าด้วย PHP
ส่วนแรกคือการทำ Code สำหรับแบ่งหน้า รายละเอียดดังนี้
1. เรียกใช้งาน Class แบ่งหน้า
2. นับจำนวน Row ข้อมูลทั้งหมด เพื่อใช้ในการแบ่งหน้า
3. กำหนดค่าตัวแปรสำหรับ Function การแบ่งหน้า
4. ส่งค่าเข้าไปยัง Function การแบ่งหน้า
5. ตัวอย่าง SQL สำหรับแบ่งเพจ
/********* 1. เรียกใช้งาน Class แบ่งหน้า *********/
require_once ("class/class.pagination.php");
$Pagination = new Pagination();
/********* 2. นับจำนวนข้อมูลทั้งหมด $numRows *********/
$sql = "SELECT
COUNT(pv.`code`) AS num_rows
FROM
province AS pv
INNER JOIN district AS dt ON SUBSTR(pv.`code`,1,2)= SUBSTR(dt.`code`,1,2)
INNER JOIN subdistrict AS sdt ON SUBSTR(dt.`code`,1,4)= SUBSTR(sdt.`code`,1,4)
WHERE pv.name_th LIKE '%เชียง%'";
$result = mysqli_query($connect, $sql);
foreach ($result as $key => $val){
$numRows = $val['num_rows'];
}
/********* 3. กำหนดค่าตัวแปร *********/
$_GET['pageNo'] = (!isset($_GET['pageNo']))? '1' : $_GET['pageNo']; // หน้าปัจจุบัน
$rowPerPage = 15; //แสดงรายการต่อแถว
$link = '?t='; // ใส่ parameter link ที่ต้องการใน Pagination
$showPage = 5; // จำนวนหน้าสูดสุดที่จะแสดงใน Pagination ต่ำสุดคือ 3 ควรใส่เป็นเลขคี่ เช่น 3 5 7
/********* 4. ส่งค่าไปยัง Class Pagination *********/
$limitConfig = $Pagination->pagination($numRows,$_GET['pageNo'],$rowPerPage);
$arrayPage = $Pagination->devidepage($numRows,$_GET['pageNo'],$rowPerPage,$link,$showPage);
/********* 5. ตัวอย่าง SQL ที่ใช้สำหรับแบ่งเพจ *********/
// ดึงข้อมูล จังหวัด อำเภอ ตำบล ที่มีชื่อจังหวัดขึ้นต้นด้วย "เชียง"
// แบ่งหน้า ด้วย คำสั่ง LIMIT และตัว $limitConfig ที่ได้จาก Class Pagination
$sql = "SELECT
pv.`code` AS province_code,
pv.name_th AS province_name,
dt.`code` AS district_code,
dt.name_th AS district_name,
sdt.`code` AS subdistrict_code,
sdt.name_th AS subdistrict_name
FROM
province AS pv
INNER JOIN district AS dt ON SUBSTR(pv.`code`,1,2)= SUBSTR(dt.`code`,1,2)
INNER JOIN subdistrict AS sdt ON SUBSTR(dt.`code`,1,4)= SUBSTR(sdt.`code`,1,4)
WHERE
pv.name_th LIKE '%เชียง%'
LIMIT {$limitConfig ['start']},{$limitConfig ['rows_perpage']}";
$result = mysqli_query($connect, $sql);
require_once ("class/class.pagination.php");
$Pagination = new Pagination();
/********* 2. นับจำนวนข้อมูลทั้งหมด $numRows *********/
$sql = "SELECT
COUNT(pv.`code`) AS num_rows
FROM
province AS pv
INNER JOIN district AS dt ON SUBSTR(pv.`code`,1,2)= SUBSTR(dt.`code`,1,2)
INNER JOIN subdistrict AS sdt ON SUBSTR(dt.`code`,1,4)= SUBSTR(sdt.`code`,1,4)
WHERE pv.name_th LIKE '%เชียง%'";
$result = mysqli_query($connect, $sql);
foreach ($result as $key => $val){
$numRows = $val['num_rows'];
}
/********* 3. กำหนดค่าตัวแปร *********/
$_GET['pageNo'] = (!isset($_GET['pageNo']))? '1' : $_GET['pageNo']; // หน้าปัจจุบัน
$rowPerPage = 15; //แสดงรายการต่อแถว
$link = '?t='; // ใส่ parameter link ที่ต้องการใน Pagination
$showPage = 5; // จำนวนหน้าสูดสุดที่จะแสดงใน Pagination ต่ำสุดคือ 3 ควรใส่เป็นเลขคี่ เช่น 3 5 7
/********* 4. ส่งค่าไปยัง Class Pagination *********/
$limitConfig = $Pagination->pagination($numRows,$_GET['pageNo'],$rowPerPage);
$arrayPage = $Pagination->devidepage($numRows,$_GET['pageNo'],$rowPerPage,$link,$showPage);
/********* 5. ตัวอย่าง SQL ที่ใช้สำหรับแบ่งเพจ *********/
// ดึงข้อมูล จังหวัด อำเภอ ตำบล ที่มีชื่อจังหวัดขึ้นต้นด้วย "เชียง"
// แบ่งหน้า ด้วย คำสั่ง LIMIT และตัว $limitConfig ที่ได้จาก Class Pagination
$sql = "SELECT
pv.`code` AS province_code,
pv.name_th AS province_name,
dt.`code` AS district_code,
dt.name_th AS district_name,
sdt.`code` AS subdistrict_code,
sdt.name_th AS subdistrict_name
FROM
province AS pv
INNER JOIN district AS dt ON SUBSTR(pv.`code`,1,2)= SUBSTR(dt.`code`,1,2)
INNER JOIN subdistrict AS sdt ON SUBSTR(dt.`code`,1,4)= SUBSTR(sdt.`code`,1,4)
WHERE
pv.name_th LIKE '%เชียง%'
LIMIT {$limitConfig ['start']},{$limitConfig ['rows_perpage']}";
$result = mysqli_query($connect, $sql);
อ่านเรื่องการแบ่งหน้าเพิ่มเติม คลิกที่นี่
ตัวอย่างการใช้งานใช้งาน PHP foreach แสดงผลข้อมูลจากฐานข้อมูล
เมื่อทำการดึงข้อมูลจากฐานข้อมูลมากแล้ว ขั้นตอนไปคือการนำข้อมูลที่ได้มาแสดงผลรูปแบบคำสั่ง foreach ใช้งานได้ 2 แบบ
รูปแบบนี้จะดึงข้อมูล Array มาแสดงโดยไม่ดึง Array Key มาด้วย
foreach (array_expression as $value)
statement
รูปแบบนี้จะดึงข้อมูล Array มาแสดงโดยดึง Array Key ออกมาด้วย
foreach (array_expression as $key => $value)
statement
foreach (array_expression as $value)
statement
รูปแบบนี้จะดึงข้อมูล Array มาแสดงโดยดึง Array Key ออกมาด้วย
foreach (array_expression as $key => $value)
statement
ตัวอย่างการวนลูป
<h1 style="padding: 0; margin: 0;">ข้อมูลจังหวัด ที่ขึ้นต้นด้วย "เชียง"</h1>
<table border="1" width="800" cellpadding="">
<thead>
<tr>
<th>ลำดับ</th>
<th>รหัสจังหวัด</th>
<th>จังหวัด</th>
<th>รหัสอำเภอ</th>
<th>อำเภอ</th>
<th>รหัสตำบล</th>
<th>ตำบล</th>
</tr>
</thead>
<tbody>
<?php
$cnt = (($_GET['pageNo']-1)*$rowPerPage)+1; // <<< ตัวอย่าง เลขหน้าลำดับการ
foreach ($result as $val){?>
<tr>
<td><?php echo $cnt?></td>
<td><?php echo $val['province_code']?></td>
<td><?php echo $val['province_name']?></td>
<td><?php echo $val['district_code']?></td>
<td><?php echo $val['district_name']?></td>
<td><?php echo $val['subdistrict_code']?></td>
<td><?php echo $val['subdistrict_name']?></td>
</tr>
<?php $cnt++;} ?>
</tbody>
</table>
<table border="1" width="800" cellpadding="">
<thead>
<tr>
<th>ลำดับ</th>
<th>รหัสจังหวัด</th>
<th>จังหวัด</th>
<th>รหัสอำเภอ</th>
<th>อำเภอ</th>
<th>รหัสตำบล</th>
<th>ตำบล</th>
</tr>
</thead>
<tbody>
<?php
$cnt = (($_GET['pageNo']-1)*$rowPerPage)+1; // <<< ตัวอย่าง เลขหน้าลำดับการ
foreach ($result as $val){?>
<tr>
<td><?php echo $cnt?></td>
<td><?php echo $val['province_code']?></td>
<td><?php echo $val['province_name']?></td>
<td><?php echo $val['district_code']?></td>
<td><?php echo $val['district_name']?></td>
<td><?php echo $val['subdistrict_code']?></td>
<td><?php echo $val['subdistrict_name']?></td>
</tr>
<?php $cnt++;} ?>
</tbody>
</table>
ตัวอย่างการแบ่งหน้า
ตัวแปร $arrayPage เราจะใช้สำหรับสร้าง Code แบ่งหน้า ตามตัวอย่างด้านล่างนี้
<div style="float:left; font-weight: bold; margin-right: 20px; padding-top: 30px;">หน้า <?php echo $_GET['pageNo']?> / <?php echo ceil($numRows/$rowPerPage)?></div>
<div class="dataTables_paginate paging_simple_numbers mo-paginate" id="data-table_paginate">
<?php $lastPage = count($arrayPage)-1; ?>
<ul class="pagination">
<li class="paginate_button previous" aria-controls="data-table" tabindex="0" id="data-table_previous">
<a href="<?php echo $arrayPage[0]['link']?>" class="<?php echo $arrayPage[0]['disabled']?>">
<?php echo $arrayPage[0]['label']?>
</a>
</li>
<?php foreach ($arrayPage as $key => $value): if($key != 0 && $key != $lastPage ):?>
<li class="paginate_button" aria-controls="data-table" tabindex="0">
<a href="<?php echo $value['link']?>" class="<?php echo ($_GET['pageNo'] == $value['pageNo']) ? 'current': ''?>">
<?php echo $value['label']?>
</a>
</li>
<?php endif; endforeach; ?>
<li class="paginate_button next" aria-controls="data-table" tabindex="0" id="data-table_next">
<a href="<?php echo $arrayPage[$lastPage]['link']?>" class="<?php echo $arrayPage[$lastPage]['disabled']?>">
<?php echo $arrayPage[$lastPage]['label']?>
</a>
</li>
</ul>
</div>
<div class="dataTables_paginate paging_simple_numbers mo-paginate" id="data-table_paginate">
<?php $lastPage = count($arrayPage)-1; ?>
<ul class="pagination">
<li class="paginate_button previous" aria-controls="data-table" tabindex="0" id="data-table_previous">
<a href="<?php echo $arrayPage[0]['link']?>" class="<?php echo $arrayPage[0]['disabled']?>">
<?php echo $arrayPage[0]['label']?>
</a>
</li>
<?php foreach ($arrayPage as $key => $value): if($key != 0 && $key != $lastPage ):?>
<li class="paginate_button" aria-controls="data-table" tabindex="0">
<a href="<?php echo $value['link']?>" class="<?php echo ($_GET['pageNo'] == $value['pageNo']) ? 'current': ''?>">
<?php echo $value['label']?>
</a>
</li>
<?php endif; endforeach; ?>
<li class="paginate_button next" aria-controls="data-table" tabindex="0" id="data-table_next">
<a href="<?php echo $arrayPage[$lastPage]['link']?>" class="<?php echo $arrayPage[$lastPage]['disabled']?>">
<?php echo $arrayPage[$lastPage]['label']?>
</a>
</li>
</ul>
</div>