เนื้อหานี้เป็นแนวทางประยุกต์เพิ่มเติมจากบทความตอนที่แล้ว
สร้างฟอร์ม ส่งค่าวันที่เพื่อแสดงข้อมูลรายเดือนอย่างง่าย
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>