ข้ามไปที่เนื้อหาหลัก

สร้างปฏิทิน รายงานยอดที่พนักงานทำได้ในแต่ละเดือนแบบง่ายๆ

ดัดแปลงบทความสร้างปฏิทินนะครับ
แต่ในส่วนของการเช็กตรวจสอบว่าครบ 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. สร้างคอลัมน์ แสดงชื่อ และ วันที่ ตามจำนวนวันของเดือนนั้นๆ
  3. วนลูปดึงข้อมูลของพนักงานทีละคน โดยเริ่มจากวันที่ 1 ถึง วันที่สุดท้ายของเดือน
  4. แสดงจำนวนยอดที่พนักงานได้ ลงในแต่ละคอลัมน์ ตามวันที่นั้นๆ


แบบที่ 2. การเขียนแบบพักข้อมูลไว้ในตัวแปรอาร์เรย์ (แบบใหม่ที่อยากจะแนะนำ)
  1. วนลูปดึงข้อมูลรายชื่อพนักงานขายทั้งหมด
  2. สร้างคอลัมน์วันที่ ตามจำนวนวันของเดือนนั้นๆ
  3. เก็บข้อมูลยอดจองของพนักงานแต่ละคน ในแต่ละวัน ไว้ในอาร์เรย์
  4. วนลูปข้อมูลในอารเรย์ออกมาแสดงในรูปแบบตาราง


อ่านบทความใหม่ 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 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
ราคาสุดคุ้มเพียง 3,990 บาท 
http://www.phpcodemania.com

บทความที่เกี่ยวข้อง

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

แจกฟรี!! ระบบต่างๆที่พัฒนาด้วย PHP สำหรับนำไปใช้ในงานต่างๆ

       สำหรับหลายท่านที่ขอโค้ดเข้ามาทาง Inbox ของเฟซบุ๊กแฟนเพจ หรือถามถึงระบบต่างๆหลังไมค์มานั้น ส่วนใหญ่ก็มีแจกอยู่แล้วในเว็บบอร์ด ThaiCreate.Com นะครับ และด้านล่างนี้ก็เป็นระบบต่างๆที่แจกให้นำไปลองใช้ลองศึกษากันครับ

สอนเขียน PHP แสดงการจองห้องประชุมแบบไฮไลท์ตามช่วงเวลา (แบบเชื่อมต่อฐานข้อมูล MySQL)

ตัวอย่าง ผลลัพธ์ที่ได้จากการจองในฐานข้อมูล ตาราง tb_room สร้างตารางรายชื่อห้องประชุม สำหรับ id นั้นเป็น Primarykey จะกำหนดให้สร้างอัตโนมัติ ทุกครั้งที่เราเพิ่มชื่อห้องประชุมใหม่ -- -- Database: `tobedev_example` -- -- -------------------------------------------------------- -- -- Table structure for table `tb_room` -- CREATE TABLE IF NOT EXISTS `tb_room` (   `id` int(11) NOT NULL,   `name` varchar(30) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- -- Dumping data for table `tb_room` -- INSERT INTO `tb_room` (`id`, `name`) VALUES (1, 'ห้องประชุม 1'), (2, 'ห้องประชุม 2'), (3, 'ห้องประชุม 3'), (4, 'ห้องประชุม 4'), (5, 'ห้องประชุม 5'); -- -- Indexes for dumped tables -- -- -- Indexes for table `tb_room` -- ALTER TABLE `tb_room`   ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `tb_room` -- ALTER TABLE `tb_room`   MODIFY `i...

การนำไอคอน มาแสดงบน Fullcalendar

เนื่องจากมีน้องคนหนึ่งให้ช่วยดูโค้ดเกี่ยวกับ Fullcalendar ให้หน่อย แล้วพอดีช่วงนี้ผมก็กำลังสนใจปฏิทิน Fullcalendar อยู่พอดี จึงลองหาสาเหตุที่ไม่สามารถแสดงข้อมูลจาก MySQL และไม่สามารถแทรก icon เข้าไปใน Fullcalendar ได้ จากที่สังเกตุได้ครั้งแรกคือ Error ที่ Console ของ Firefox เกี่ยวกับฟังก์ชั่นที่เขียนผิด และก็มีการ echo ค้างไว้ในส่วนของไฟล์ getCalendar.php ก็เลยจัดการทดสอบแล้วลบ echo ออกให้เหลือแค่ echo json_encode($event_array); ที่ได้ใช้งานจริงเท่านั้น ขั้นตอนการตรวจสอบความถูกต้องของโค้ด PHP 1) ต้องแน่ใจว่าคำสั่งที่เขียนไว้ สามารถดึงข้อมูลมาแสดงผลได้ด้วยการ echo $sql; 2) นำคำสั่งที่ได้ไปรันในโปรแกรมจัดการฐานข้อมูล ในที่นี้คือ phpMyAdmin 3) เมื่อตรวจสอบดูผลลัพธ์ที่ได้ หากถูกต้องมีข้อมูลก็แสดงว่าการ Query ทำงานได้ 4) มาดูการทำงานของ JavaScript ในส่วนของ jQuery มีการแจ้งเตือนที่ฟังก์ชั่น .on() ซึ่งจะใช้กับ jQuery เวอร์ชั่นใหม่เท่านั้น นั่นหมายถึงเวอร์ชั่น jQuery ที่มากับ Fullcalendar เป็นเวอร์ชั่นเก่า ก็ให้เปลี่ยนไปใช้ .live() แทน ก็จะทำงานได้ปกติ 5) ม...