ดัดแปลงบทความสร้างปฏิทินนะครับ
แต่ในส่วนของการเช็กตรวจสอบว่าครบ 7 คอลัมน์ขึ้นแถวใหม่ ให้ตัดออก เราจะมาสร้างปฏิทินที่แสดงวันที่แถวเดียว เพื่อแสดงยอดของแต่ละวันของเดือนที่เลือกครับ
โดยเวลาส่งค่าวันที่เดือนไหนก็ดึงค่าวันที่เริ่มต้น และวันที่สุดท้ายของเดือนออกมาเก็บไว้ และใช้คำสั่งวนลูป for() ให้ครบตั้งแต่วันที่ 1 จนถึงวันที่สุดท้ายของเดือน ก็จะได้หัวตารางที่แสดงวันที่ทั้งหมดของเดือน
และเราจะกำหนดให้แสดงข้อมูลแต่ละแถว เป็นรายชื่อพนักงานละกันนะครับ โดยจะดึงข้อมูลมาจากฐานข้อมูลยอดขายของเดือนที่กำหนดนี้ออกมาจัดกลุ่มตามรายชื่อพนักงาน ว่าแต่ละวันพนักงานแต่ละคนมียอดขายเท่าไหร่กันบ้าง
สำหรับการเก็บข้อมูลยอดต่างๆ นั้นให้เก็บข้อมูลด้วยอาร์เรย์ครับ
$data[รหัสพนักงาน] = array('วันที่' => จำนวน );
เราจะไม่วนลูปดึงข้อมูลมาแสดงพร้อมกับสร้างตารางนะครับ
เพราะถ้าเดือนหนึ่งๆ มี 30 วัน
และมีพนักงาน 30 คน ถ้าเอามาคูณกัน
30x30 = 900 ครั้งที่จะต้องสั่งคิวรี่ข้อมูลออกมา
ดังนั้นเราจะหายอดออกมาเก็บไว้ก่อน แล้วใช้คีย์เป็นวันที่
และเช็กว่าคีย์ไหนมีข้อมูลก็แสดงออกมาจะทำให้ เราคิวรี่แค่ครั้งเดียว
ตัวอย่างการเก็บข้อมูล
Code (PHP)
1.$data['emp0012'] = array('09' => 453, '10' => 12, '11' => 12);
2.$data['emp0015'] = array('09' => 12, '10' => 12, '11' => 452);
มาเริ่มเขียนโค๊ดกันเลย...
แบบที่ 1. การเขียนแบบตามลำดับขั้น (แบบเดิมที่ผมเคยใช้)
ซอร์สโค๊ด แบบที่ 1
ซอร์สโค๊ด แบบที่ 2
วิเคราะห์โค๊ดแบบที่ 1
คำสั่ง while จะได้รายชื่อพนักงาน 7 คน
คำสั่ง for อยู่ในลูป while จะทำงานอยู่ 7 ครั้ง และแต่ละครั้ง จะวนจนถึงสิ้นเดือนของเดือนนั้นๆ
อย่างต่ำก็ 30 วันต่อเดือนโดยประมาณ
จำนวนการทำงานของ
วิเคราะห์โค๊ดแบบที่ 2
การคิวรี่จะเกิดขึ้นเพียงครั้งเดียว และเก็บข้อมูลทั้งหมดไว้ใน
และเรียกใช้งานในลูปโดยเทียบว่ามีข้อมูลตามคีย์ที่เป็นวันที่ตรงกันหรือไม่
แต่ในส่วนของการเช็กตรวจสอบว่าครบ 7 คอลัมน์ขึ้นแถวใหม่ ให้ตัดออก เราจะมาสร้างปฏิทินที่แสดงวันที่แถวเดียว เพื่อแสดงยอดของแต่ละวันของเดือนที่เลือกครับ
โดยเวลาส่งค่าวันที่เดือนไหนก็ดึงค่าวันที่เริ่มต้น และวันที่สุดท้ายของเดือนออกมาเก็บไว้ และใช้คำสั่งวนลูป for() ให้ครบตั้งแต่วันที่ 1 จนถึงวันที่สุดท้ายของเดือน ก็จะได้หัวตารางที่แสดงวันที่ทั้งหมดของเดือน
และเราจะกำหนดให้แสดงข้อมูลแต่ละแถว เป็นรายชื่อพนักงานละกันนะครับ โดยจะดึงข้อมูลมาจากฐานข้อมูลยอดขายของเดือนที่กำหนดนี้ออกมาจัดกลุ่มตามรายชื่อพนักงาน ว่าแต่ละวันพนักงานแต่ละคนมียอดขายเท่าไหร่กันบ้าง
สำหรับการเก็บข้อมูลยอดต่างๆ นั้นให้เก็บข้อมูลด้วยอาร์เรย์ครับ
$data[รหัสพนักงาน] = array('วันที่' => จำนวน );
เราจะไม่วนลูปดึงข้อมูลมาแสดงพร้อมกับสร้างตารางนะครับ
เพราะถ้าเดือนหนึ่งๆ มี 30 วัน
และมีพนักงาน 30 คน ถ้าเอามาคูณกัน
30x30 = 900 ครั้งที่จะต้องสั่งคิวรี่ข้อมูลออกมา
ดังนั้นเราจะหายอดออกมาเก็บไว้ก่อน แล้วใช้คีย์เป็นวันที่
และเช็กว่าคีย์ไหนมีข้อมูลก็แสดงออกมาจะทำให้ เราคิวรี่แค่ครั้งเดียว
ตัวอย่างการเก็บข้อมูล
Code (PHP)
1.$data['emp0012'] = array('09' => 453, '10' => 12, '11' => 12);
2.$data['emp0015'] = array('09' => 12, '10' => 12, '11' => 452);
มาเริ่มเขียนโค๊ดกันเลย...
แบบที่ 1. การเขียนแบบตามลำดับขั้น (แบบเดิมที่ผมเคยใช้)
- วนลูปดึงข้อมูลรายชื่อพนักงานทั้งหมด จากตารางที่เก็บข้อมูลผู้ใช้ทั้งหมด
- สร้างคอลัมน์ แสดงชื่อ และ วันที่ ตามจำนวนวันของเดือนนั้นๆ
- วนลูปดึงข้อมูลของพนักงานทีละคน โดยเริ่มจากวันที่ 1 ถึง วันที่สุดท้ายของเดือน
- แสดงจำนวนยอดที่พนักงานได้ ลงในแต่ละคอลัมน์ ตามวันที่นั้นๆ
แบบที่ 2. การเขียนแบบพักข้อมูลไว้ในตัวแปรอาร์เรย์ (แบบใหม่ที่อยากจะแนะนำ)
- วนลูปดึงข้อมูลรายชื่อพนักงานขายทั้งหมด
- สร้างคอลัมน์วันที่ ตามจำนวนวันของเดือนนั้นๆ
- เก็บข้อมูลยอดจองของพนักงานแต่ละคน ในแต่ละวัน ไว้ในอาร์เรย์
- วนลูปข้อมูลในอารเรย์ออกมาแสดงในรูปแบบตาราง
อ่านบทความใหม่ PHP + MySQLi Function ได้ >> ที่นี่
ซอร์สโค๊ด แบบที่ 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
| < html > < head > < title >SunZan-Desgin.Com</ title > < meta http-equiv = 'Content-Type' content = 'text/html; charset=utf-8' > < style > .number{ text-align : right;} .number div{ background: #91F7A4; color : #ff0000; } #test_report th{ background-color : #21BBD6; color : #ffffff;} #test_report{ border-right : 1px solid #eeeeee; border-bottom : 1px solid #eeeeee; } #test_report td,#test_report th{ border-top : 1px solid #eeeeee; border-left : 1px solid #eeeeee; padding : 2px; } #txt_year{ width : 70px;} .fail{ color : red;} </ style > </ head > < body > < form method = "POST" action=" <? php echo $_SERVER [ 'PHP_SELF' ]; ?> "> < table > < tr > < td >ระบุเดือน-ปี : </ td > < td > < select name = "txt_month" > < option value = "" >--------------</ option > <? php $month = array ( '01' => 'มกราคม' , '02' => 'กุมภาพันธ์' , '03' => 'มีนาคม' , '04' => 'เมษายน' , '05' => 'พฤษภาคม' , '06' => 'มิถุนายน' , '07' => 'กรกฎาคม' , '08' => 'สิงหาคม' , '09' => 'กันยายน ' , '10' => 'ตุลาคม' , '11' => 'พฤศจิกายน' , '12' => 'ธันวาคม' ); $txtMonth = isset( $_POST [ 'txt_month' ]) && $_POST [ 'txt_month' ] != '' ? $_POST [ 'txt_month' ] : date ( 'm' ); foreach ( $month as $i => $mName ) { $selected = '' ; if ( $txtMonth == $i ) $selected = 'selected="selected"' ; echo '<option value="' . $i . '" ' . $selected . '>' . $mName . '</option>' . "\n" ; } ?> </ select > </ td > < td > < select name = "txt_year" > < option value = "" >--------------</ option > <? php $txtYear = (isset( $_POST [ 'txt_year' ]) && $_POST [ 'txt_year' ] != '' ) ? $_POST [ 'txt_year' ] : date ( 'Y' ); $yearStart = date ( 'Y' ); $yearEnd = $txtYear -5; for ( $year = $yearStart ; $year > $yearEnd ; $year --){ $selected = '' ; if ( $txtYear == $year ) $selected = 'selected="selected"' ; echo '<option value="' . $year . '" ' . $selected . '>' . ( $year +543) . '</option>' . "\n" ; } ?> </ select > </ td > < td >< input type = "submit" value = "ค้นหา" /></ td > </ tr > </ table > </ form > <? php //รับค่าตัวแปรที่ส่งมาจากแบบฟอร์ม HTML $year = isset ( $_POST [ 'txt_year' ]) ? mysql_real_escape_string( $_POST [ 'txt_year' ]) : '' ; $month = isset ( $_POST [ 'txt_month' ]) ? mysql_real_escape_string( $_POST [ 'txt_month' ]) : '' ; if ( $year == '' || $month == '' ) exit ( '<p class="fail">กรุณาระบุ "เดือน-ปี" ที่ต้องการเรียกรายงาน</p>' ); //เปิดการเชื่อมต่อฐานข้อมูล sunzandesign mysql_connect("localhost","root","abcd1234"); //ข้อมูลนี้ได้มาจากตอนติดตั้งเว็บเซิร์ฟเวอร์ mysql_select_db( "sunzandesign" ); mysql_query( "SET NAMES UTF8" ); echo "<table border='0' id='test_report' cellpadding='0' cellspacing='0'>" ; echo '<tr>' ; //เปิดแถวใหม่ ตาราง HTML echo '<th>รายชื่อพนักงาน</th>' ; //วันที่สุดท้ายของเดือน $timeDate = strtotime ( $year . '-' . $month . "-01" ); //เปลี่ยนวันที่เป็น timestamp $lastDay = date ( "t" , $timeDate ); //จำนวนวันของเดือน //สร้างหัวตารางตั้งแต่วันที่ 1 ถึงวันที่สุดท้ายของดือน for ( $day =1; $day <= $lastDay ; $day ++){ echo '<th>' . substr ( "0" . $day , -2) . '</th>' ; } //เรียกข้อมูลการจองของเดือนที่ต้องการ //++ ต้องดึงมาจากฐานข้อมูลผู้ใช้ ++ $strSQL = "SELECT user_code,user_fullname FROM `tb_user` " ; $qry = mysql_query( $strSQL ) or die ( 'ไม่สามารถเชื่อมต่อฐานข้อมูลได้ Error : ' . mysql_error()); while ( $row = mysql_fetch_assoc( $qry )){ echo '<tr>' ; //เปิดแถวใหม่ ตาราง HTML echo '<td>' . $row [ 'user_fullname' ] . '</td>' ; //เรียกข้อมูลการจองของพนักงานแต่ละคน ในเดือนนี้ for ( $j =1; $j <= $lastDay ; $j ++){ $d = substr ( "0" . $j , -2); $strSQL = "SELECT COUNT(*) AS numBook FROM `tb_report_booking` " ; $strSQL .= "WHERE `bk_date` = '$year-$month-$d' AND bk_user_code = '" . $row ['user_code '] ."' "; $strSQL .= "GROUP by DAY(`bk_date`)" ; $qry2 = mysql_query( $strSQL ) or die ( 'ไม่สามารถเชื่อมต่อฐานข้อมูลได้ Error : ' . mysql_error()); $row2 = mysql_fetch_assoc( $qry2 ); $numBook = ( $row2 [ 'numBook' ] > 0) ? '<div>' . $row2 [ 'numBook' ] . '</div>' : 0; echo "<td class='number'>" , $numBook , "</td>" ; } echo '</tr>' ; //ปิดแถวตาราง HTML } echo "</table>" ; mysql_close(); //ปิดการเชื่อมต่อฐานข้อมูล ?> |
ซอร์สโค๊ด แบบที่ 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| < html > < head > < title >SunZan-Desgin.Com</ title > < meta http-equiv = 'Content-Type' content = 'text/html; charset=utf-8' > < style > .number{ text-align : right;} .number div{ background: #91F7A4; color : #ff0000; } #test_report th{ background-color : #21BBD6; color : #ffffff;} #test_report{ border-right : 1px solid #eeeeee; border-bottom : 1px solid #eeeeee; } #test_report td,#test_report th{ border-top : 1px solid #eeeeee; border-left : 1px solid #eeeeee; padding : 2px; } #txt_year{ width : 70px;} .fail{ color : red;} </ style > </ head > < body > < form method = "POST" action=" <? php echo $_SERVER [ 'PHP_SELF' ]; ?> "> < table > < tr > < td >ระบุเดือน-ปี : </ td > < td > < select name = "txt_month" > < option value = "" >--------------</ option > <? php $month = array ( '01' => 'มกราคม' , '02' => 'กุมภาพันธ์' , '03' => 'มีนาคม' , '04' => 'เมษายน' , '05' => 'พฤษภาคม' , '06' => 'มิถุนายน' , '07' => 'กรกฎาคม' , '08' => 'สิงหาคม' , '09' => 'กันยายน ' , '10' => 'ตุลาคม' , '11' => 'พฤศจิกายน' , '12' => 'ธันวาคม' ); $txtMonth = isset( $_POST [ 'txt_month' ]) && $_POST [ 'txt_month' ] != '' ? $_POST [ 'txt_month' ] : date ( 'm' ); foreach ( $month as $i => $mName ) { $selected = '' ; if ( $txtMonth == $i ) $selected = 'selected="selected"' ; echo '<option value="' . $i . '" ' . $selected . '>' . $mName . '</option>' . "\n" ; } ?> </ select > </ td > < td > < select name = "txt_year" > < option value = "" >--------------</ option > <? php $txtYear = (isset( $_POST [ 'txt_year' ]) && $_POST [ 'txt_year' ] != '' ) ? $_POST [ 'txt_year' ] : date ( 'Y' ); $yearStart = date ( 'Y' ); $yearEnd = $txtYear -5; for ( $year = $yearStart ; $year > $yearEnd ; $year --){ $selected = '' ; if ( $txtYear == $year ) $selected = 'selected="selected"' ; echo '<option value="' . $year . '" ' . $selected . '>' . ( $year +543) . '</option>' . "\n" ; } ?> </ select > </ td > < td >< input type = "submit" value = "ค้นหา" /></ td > </ tr > </ table > </ form > <? php //รับค่าตัวแปรที่ส่งมาจากแบบฟอร์ม HTML $year = isset ( $_POST [ 'txt_year' ]) ? mysql_real_escape_string( $_POST [ 'txt_year' ]) : '' ; $month = isset ( $_POST [ 'txt_month' ]) ? mysql_real_escape_string( $_POST [ 'txt_month' ]) : '' ; if ( $year == '' || $month == '' ) exit ( '<p class="fail">กรุณาระบุ "เดือน-ปี" ที่ต้องการเรียกรายงาน</p>' ); //เปิดการเชื่อมต่อฐานข้อมูล sunzandesign mysql_connect("localhost","root","abcd1234"); //ข้อมูลนี้ได้มาจากตอนติดตั้งเว็บเซิร์ฟเวอร์ mysql_select_db( "sunzandesign" ); mysql_query( "SET NAMES UTF8" ); //ดึงข้อมูลพนักงานทั้งหมด $allEmpData = array (); $strSQL = "SELECT user_code,user_fullname FROM `tb_user` " ; $qry = mysql_query( $strSQL ) or die ( 'ไม่สามารถเชื่อมต่อฐานข้อมูลได้ Error : ' . mysql_error()); while ( $row = mysql_fetch_assoc( $qry )){ $allEmpData [ $row [ 'user_code' ]] = $row [ 'user_fullname' ]; } //เรียกข้อมูลการจองของเดือนที่ต้องการ $allReportData = array (); $strSQL = "SELECT bk_user_code, DAY(`bk_date`) AS bk_day, COUNT(*) AS numBook FROM `tb_report_booking` " ; $strSQL .= "WHERE `bk_date` LIKE '$year-$month%' " ; $strSQL .= "GROUP by bk_user_code,DAY(`bk_date`)" ; $qry = mysql_query( $strSQL ) or die ( 'ไม่สามารถเชื่อมต่อฐานข้อมูลได้ Error : ' . mysql_error()); while ( $row = mysql_fetch_assoc( $qry )){ $allReportData [ $row [ 'bk_user_code' ]][ $row [ 'bk_day' ]] = $row [ 'numBook' ]; } echo "<table border='0' id='test_report' cellpadding='0' cellspacing='0'>" ; echo '<tr>' ; //เปิดแถวใหม่ ตาราง HTML echo '<th>รายชื่อพนักงาน</th>' ; //วันที่สุดท้ายของเดือน $timeDate = strtotime ( $year . '-' . $month . "-01" ); //เปลี่ยนวันที่เป็น timestamp $lastDay = date ( "t" , $timeDate ); //จำนวนวันของเดือน //สร้างหัวตารางตั้งแต่วันที่ 1 ถึงวันที่สุดท้ายของดือน for ( $day =1; $day <= $lastDay ; $day ++){ echo '<th>' . substr ( "0" . $day , -2) . '</th>' ; } echo "</tr>" ; foreach ( $allEmpData as $empCode => $empName ){ echo '<tr>' ; //เปิดแถวใหม่ ตาราง HTML echo '<td>' . $empName . '</td>' ; //เรียกข้อมูลการจองของพนักงานแต่ละคน ในเดือนนี้ for ( $j =1; $j <= $lastDay ; $j ++){ $numBook = isset( $allReportData [ $empCode ][ $j ]) ? '<div>' . $allReportData [ $empCode ][ $j ]. '</div>' : 0; echo "<td class='number'>" , $numBook , "</td>" ; } echo '</tr>' ; //ปิดแถวตาราง HTML } echo "</table>" ; mysql_close(); //ปิดการเชื่อมต่อฐานข้อมูล ?> |
ดาวน์โหลดซอร์สโค๊ดตัวอย่าง ที่นี่
วิเคราะห์โค๊ดแบบที่ 1
while
(
$row
= mysql_fetch_assoc(
$qry
)){
echo
'<tr>'
;
//เปิดแถวใหม่ ตาราง HTML
echo
'<td>'
.
$row
[
'user_fullname'
] .
'</td>'
;
//เรียกข้อมูลการจองของพนักงานแต่ละคน ในเดือนนี้
for
(
$j
=1;
$j
<=
$lastDay
;
$j
++){
$qry2
= mysql_query(
$strSQL
)
or
die
(
'ไม่สามารถเชื่อมต่อฐานข้อมูลได้ Error : '
. mysql_error());
}
echo
'</tr>'
;
//ปิดแถวตาราง HTML
}
คำสั่ง while จะได้รายชื่อพนักงาน 7 คน
คำสั่ง for อยู่ในลูป while จะทำงานอยู่ 7 ครั้ง และแต่ละครั้ง จะวนจนถึงสิ้นเดือนของเดือนนั้นๆ
อย่างต่ำก็ 30 วันต่อเดือนโดยประมาณ
จำนวนการทำงานของ
$qry2
จะเท่ากับ 7 x 30 = 210 ครั้ง
วิเคราะห์โค๊ดแบบที่ 2
การคิวรี่จะเกิดขึ้นเพียงครั้งเดียว และเก็บข้อมูลทั้งหมดไว้ใน
$allReportData
และเรียกใช้งานในลูปโดยเทียบว่ามีข้อมูลตามคีย์ที่เป็นวันที่ตรงกันหรือไม่
"PHP ไม่ได้สร้างสุดยอดโปรแกรมแต่ PHP ช่วยให้งานคุณง่ายขึ้นต่างหาก"
PHP CI MANIA - PHP Code Generatorโปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม
สนใจสั่งซื้อเพียง 3,990 บาท
PHP CI MANIA - PHP Code Generator
โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
บทความที่เกี่ยวข้อง
- PHP Calendar : ฝีกสร้างปฏิทินไว้ใช้ในงานต่างๆ
- PHP Calendar : สร้างปฏิทินมุมมองแบบสัปดาห์
- สร้างปฏิทิน รายงานยอดที่พนักงานทำได้ในแต่ละเดือนแบบง่ายๆ
- สร้างตารางเรียน ตารางสอนด้วย PHP
- PHP Calendar : การสร้างปฏิทินเพื่อแสดงสถานะการจองในแต่ละวัน
ความคิดเห็น
แสดงความคิดเห็น