เนื้อหานี้เป็นแนวทางประยุกต์เพิ่มเติมจากบทความตอนที่แล้ว
สร้างฟอร์ม ส่งค่าวันที่เพื่อแสดงข้อมูลรายเดือนอย่างง่าย
https://www.ninenik.com/content.php?arti_id=758 via @ninenik
รูปแบบสรุปรายการแบบตารางรายเดือนที่เราต้องการจะเป็นดังรูปด้านล่าง

จากบทความที่แล้ว เราได้รู้จักวิธีการสร้างฟอร์ม ส่งข้อมูลวันที่มาใช้งาน ทำให้เราสามารถ
ประยุกต์เพิ่มเติม โดยการนำวันที่จากฟอร์ม มาใช้ในการสร้างตารางรายเดือนในลักษณะ
แสดงรายการที่ต้องการในด้านซ้าย และจำนวนรายการนั้นๆ แยกตามวันที่ในด้านขวาของตาราง
พร้อมรวมค่าของแต่ละรายการในคอลัมน์ขวาสุดของตาราง ดังรูปด้านบนที่แสดง
หลักสำคัญของแนวทางนี้คือ เราจะต้องทำให้ข้อมูลอยู่ในรูปแบบ array ในลักษณะโครงสร้างคล้ายๆ ดังนี้
<?php $data_arr = array( "รายการที่ 1"=>array( "2017-01-10"=>1, "2017-01-13"=>7, "2017-01-15"=>8, "2017-01-16"=>6, "2017-01-18"=>2, "2017-01-19"=>3, "2017-01-20"=>5, ), "รายการที่ 2"=>array( "2017-01-15"=>3, "2017-01-16"=>5, "2017-01-18"=>5, "2017-01-19"=>7, ), "รายการที่ 3"=>array( "2017-01-10"=>2, "2017-01-13"=>4, "2017-01-15"=>6, "2017-01-16"=>8, "2017-01-18"=>10, "2017-01-19"=>11, "2017-01-20"=>13, ), "รายการที่ 4"=>array( "2017-01-13"=>4, "2017-01-15"=>6, "2017-01-16"=>8, "2017-01-18"=>10, ), "รายการที่ 5"=>array( "2017-01-18"=>2, "2017-01-19"=>3, "2017-01-20"=>5, ), "รายการที่ 6"=>array( "2017-01-13"=>4, "2017-01-15"=>6, "2017-01-16"=>8, ), ); ?>
ถ้าในฐานข้อมูลของเรา มีการรวมจำนวนรายการนั้นๆ ในแต่ละวันไว้แล้ว ก็จะสะดวก
ในการนำมาใช้ในการสร้างรูปแบบ array ที่ต้องการ อย่างสมมติเช่น
"รายการที่ 6"=>array( "2017-01-13"=>4, "2017-01-15"=>6, "2017-01-16"=>8, ),
รายการที่ 6 มียอดรวม
วันที่ 13, 15 และ 16 / 01 / 2017 เป็น 4, 6 และ 8 ตามลำดับ
แต่กรณีที่ข้อมูลของเรายังไม่ได้รวมข้อมูลในแต่ละวัน จุดนี้ เราต้องใช้วิธีบวกค่าเพิ่มให้กับข้อมูลก่อน
แล้วจึงนำมาจัดในรูปแบบของโครงสร้าง array ที่ต้องการ
มาดูโครงสร้างข้อมูลในตารางข้อมูลตัวอย่าง อย่างง่าย

ตัวอย่างส่วนของโค้ดที่ดึงข้อมูลสร้างเป็น array เพื่อใช้งาน กรณีเพิ่มข้อมูลทีละ 1
//////////// ตัวอย่าง array ข้อมูล แบบดึงจากฐานข้อมูล
$sql = "
SELECT * FROM tbl_sale WHERE
sale_date>='".$start_date_check."' AND
sale_date<='".$end_date_check."'
ORDER BY sale_item,sale_date
";
echo $sql;
$result = $mysqli->query($sql);
if($result){
while($row = $result->fetch_assoc()){
// ถ้ามีตัวแปร array ของข้อมูลของวันที่นั้นแล้ว ให้เพิ่มค่าทีละ 1
if(isset($data_arr[$row['sale_item']][$row['sale_date']])){
$data_arr[$row['sale_item']][$row['sale_date']]+=1;
}else{ // ถ้ายังไม่มีให้เท่ากับ 1
$data_arr[$row['sale_item']][$row['sale_date']]=1;
}
}
}
ตัวอย่างส่วนของโค้ดที่ดึงมาสร้างเป็น array กรณีใช้ค่าข้อมูลที่มีอยู่แล้ว
//////////// ตัวอย่าง array ข้อมูล แบบดึงจากฐานข้อมูล กรณีใช้ค่าข้อมูลจากฐานข้อมูล
$sql = "
SELECT * FROM tbl_sale WHERE
sale_date>='".$start_date_check."' AND
sale_date<='".$end_date_check."'
ORDER BY sale_item,sale_date
";
echo $sql;
$result = $mysqli->query($sql);
if($result){
while($row = $result->fetch_assoc()){
// ถ้ามีตัวแปร array ของข้อมูลของวันที่นั้นแล้ว ให้เพิ่มค่าตามค่าฟิลด์ที่ต้องการ
if(isset($data_arr[$row['sale_item']][$row['sale_date']])){
$data_arr[$row['sale_item']][$row['sale_date']]+=$row['sale_qty'];
}else{ // ถ้ายังไม่มีให้เท่ากับค่าฟิลด์ที่ต้องการ
$data_arr[$row['sale_item']][$row['sale_date']]=$row['sale_qty'];
}
}
}
ไฟล์ dbconnect.php
<?php
$mysqli = new mysqli("localhost", "root","","test");
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
if(!$mysqli->set_charset("utf8")) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
exit();
}
ตัวอย่างโค้ดทั้งหมด
<?php
//require_once("dbconnect.php");
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<?php
$thai_month_arr=array(
"0"=>"",
"1"=>"มกราคม",
"2"=>"กุมภาพันธ์",
"3"=>"มีนาคม",
"4"=>"เมษายน",
"5"=>"พฤษภาคม",
"6"=>"มิถุนายน",
"7"=>"กรกฎาคม",
"8"=>"สิงหาคม",
"9"=>"กันยายน",
"10"=>"ตุลาคม",
"11"=>"พฤศจิกายน",
"12"=>"ธันวาคม"
);
?>
<br>
<div style="margin:auto;width:1000px;">
<form method="post" action="">
เลือกเดือน
<select name="month_check" id="month_check">
<?php for($i=1;$i<=12;$i++){ ?>
<option value="<?=sprintf("%02d",$i)?>" <?=((isset($_POST['month_check']) && $_POST['month_check']==sprintf("%02d",$i)) || (!isset($_POST['month_check']) && date("m")==sprintf("%02d",$i)))?" selected":""?> >
<?=$thai_month_arr[$i]?>
</option>
<?php } ?>
</select>
ปี
<select name="year_check" id="year_check">
<?php
$data_year=intval(date("Y",strtotime("-2 year")));
?>
<?php for($i=0;$i<=5;$i++){ ?>
<option value="<?=$data_year+$i?>" <?=((isset($_POST['year_check']) && $_POST['year_check']==intval($data_year+$i)) || (!isset($_POST['year_check']) && date("Y")==intval($data_year+$i)))?" selected":""?> >
<?=intval($data_year+$i)+543?>
</option>
<?php } ?>
</select>
<input type="submit" name="showData" id="showData" value="แสดงข้อมูล" />
</form>
<br>
<br>
<?php
// ถ้าไม่มีการส่งเดือนและปีมา ให้ใช้เดือนและปีในขณะปัจจุบันนั้น เป้นตัวกำหนด
if(!isset($_POST['month_check']) && !isset($_POST['year_check'])){
$date_data_check=date("Y-m-");// จัดรูปแบบปีและเดือนของวันปัจจุบันในรูปแบบ 0000-00-
$num_month_day=date("t"); // หาจำนวนวันของเดืนอ
$use_month_check = $date_data_check;
$start_date_check = $date_data_check."01";
$end_date_check = $date_data_check.$num_month_day;
echo $use_month_check."<br>";
echo $start_date_check."<br>"; // ได้ตัวแปรวันที่เริ่มต้นของเดือนไปใช้งาน
echo $end_date_check."<br>"; // ได้ตัวแปรวันที่สิ้นสุดของเดือนไปใช้งาน
}else{ // ถ้ามีการส่งข้อมูล เดือนและปี มา ให้ใช้เดือนและปี ของค่าที่ส่งมาเป้นตำกำหนด
$date_data_check=$_POST['year_check']."-".$_POST['month_check']."-"; // จัดรูปแบบปีและเดืนอที่ส่งมาในรูปแบบ 0000-00-
$num_month_day=date("t",strtotime($_POST['year_check']."-".$_POST['month_check']."-01")); // หาจำนวนวันของเดืนอ
$use_month_check = $date_data_check;
$start_date_check = $date_data_check."01";
$end_date_check = $date_data_check.$num_month_day;
echo $use_month_check."<br>";
echo $start_date_check."<br>"; // ได้ตัวแปรวันที่เริ่มต้นของเดือนไปใช้งาน
echo $end_date_check."<br>"; // ได้ตัวแปรวันที่สิ้นสุดของเดือนไปใช้งาน
}
?>
<style type="text/css">
.header_row{
background: #EFE4B0;
text-align: center;
font-size:12px;
}
.header_row .col_50{
width: 50px;
}
.header_row .col_100{
width: 100px;
}
.header_row .col_200{
width: 200px;
}
.data_row{
background: #EBEAE4;
text-align: center;
font-size:12px;
}
</style>
<?php
$data_arr = array();
//////////// ตัวอย่าง array ข้อมูล
$data_arr = array(
"รายการที่ 1"=>array(
"2017-01-10"=>1,
"2017-01-13"=>7,
"2017-01-15"=>8,
"2017-01-16"=>6,
"2017-01-18"=>2,
"2017-01-19"=>3,
"2017-01-20"=>5,
),
"รายการที่ 2"=>array(
"2017-01-15"=>3,
"2017-01-16"=>5,
"2017-01-18"=>5,
"2017-01-19"=>7,
),
"รายการที่ 3"=>array(
"2017-01-10"=>2,
"2017-01-13"=>4,
"2017-01-15"=>6,
"2017-01-16"=>8,
"2017-01-18"=>10,
"2017-01-19"=>11,
"2017-01-20"=>13,
),
"รายการที่ 4"=>array(
"2017-01-13"=>4,
"2017-01-15"=>6,
"2017-01-16"=>8,
"2017-01-18"=>10,
),
"รายการที่ 5"=>array(
"2017-01-18"=>2,
"2017-01-19"=>3,
"2017-01-20"=>5,
),
"รายการที่ 6"=>array(
"2017-01-13"=>4,
"2017-01-15"=>6,
"2017-01-16"=>8,
),
);
//////////// ตัวอย่าง array ข้อมูล แบบดึงจากฐานข้อมูล
/*$sql = "
SELECT * FROM tbl_sale WHERE
sale_date>='".$start_date_check."' AND
sale_date<='".$end_date_check."'
ORDER BY sale_item,sale_date
";
echo $sql;
$result = $mysqli->query($sql);
if($result){
while($row = $result->fetch_assoc()){
// ถ้ามีตัวแปร array ของข้อมูลของวันที่นั้นแล้ว ให้เพิ่มค่าทีละ 1
if(isset($data_arr[$row['sale_item']][$row['sale_date']])){
$data_arr[$row['sale_item']][$row['sale_date']]+=1;
}else{ // ถ้ายังไม่มีให้เท่ากับ 1
$data_arr[$row['sale_item']][$row['sale_date']]=1;
}
}
}*/
?>
<table border="0" cellpadding="0" cellspacing="2">
<tr class="header_row">
<td class="col_50">#</td>
<td class="col_200">Item</td>
<?php for($i=1;$i<=$num_month_day;$i++){?>
<td class="col_50"><?=$i?></td>
<?php } ?>
<td class="col_100">Total</td>
</tr>
<?php
if($data_arr){
$total_data = count($data_arr);
foreach($data_arr as $k_item=>$v_data){
$row_total = 0;
?>
<tr class="data_row">
<td></td>
<td><?=$k_item?></td>
<?php for($i=0;$i<$num_month_day;$i++){?>
<td>
<?php
$key_date = date("Y-m-d",strtotime($start_date_check." +$i day"));
// echo $key_date;
if(isset($v_data["$key_date"])){
echo $v_data["$key_date"];
$row_total += $v_data["$key_date"];
}
?>
</td>
<?php } ?>
<td><?=$row_total?></td>
</tr>
<?php
}
}
?>
</table>
</div>
</body>
</html>