23 ก.พ. 2560

สอน PHP สร้างคลาส CRUD ด้วย PDO


21 ม.ค. 2560

การสลับสีตารางแบบง่ายๆ PHP MySQLi

สำหรับวิธีการสลับสีตารางแบบง่ายๆ ในตัวอย่างนี้ จะเป็นการเปลี่ยนสี bgcolor โดยจะตรวจสอบก่อนว่ารหัสตรงกันหรือไม่ ถ้าตรงกันก็ใช้สีเดิม แต่ถ้ารหัสเปลี่ยนก็ใช้อีกสีสลับกันไป

โค้ด PHP ตัวอย่าง


<?php
$conn = mysqli_connect("localhost","tobedev","abcd.1234", "test");  //ข้อมูลนี้ได้มาจากตอนติดตั้งเว็บเซิร์ฟเวอร์
mysqli_set_charset($conn, "utf8");//ส่วนนี้คือการตั้งค่า encoding แบบสากล ถ้าฐานข้อมูลเป็น tis-620 ก็ต้องเปลี่ยนด้วย
$allData = array();
$strSQL = "SELECT * FROM `example` ";
$qry = mysqli_query($conn, $strSQL) or die('ไม่สามารถเชื่อมต่อฐานข้อมูลได้ Error : '. mysqli_error());
while($row = mysqli_fetch_assoc($qry)){
$allData[] = $row;
}
mysqli_close($conn);//ปิดการเชื่อมต่อฐานข้อมูล
?>
<html>
<head>
<title>SunZanDesgin.Blogspot.Com</title>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
</head>
<body>
<table border="1" width="400">
<tr>
<th>id</th>
<th>code</th>
<th>name</th>
</tr>
<?php
$prev_code = '';
$color1 = '#ffffff';
$color2 = '#cccccc';
$prev_color = $color1;
$bg_color = $color1;
foreach($allData as $row){
if($row['code']==$prev_code){
$bg_color = $prev_color;
}else{
if($prev_color==$color1){
$bg_color = $color2;
}else{
$bg_color = $color1;
}
}
echo "<tr bgcolor='$bg_color'>
<td>$row[id]</td>
<td>$row[code]</td>
<td>$row[name]</td>
</tr>";
$prev_code = $row['code'];
$prev_color = $bg_color;
}
?>
</table>
</body>
</html>




SQL สร้างตารางตัวอย่าง


--
-- Table structure for table `example`
--
CREATE TABLE `example` (
  `id` int(11) NOT NULL,
  `code` varchar(2) NOT NULL,
  `name` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Dumping data for table `example`
--
INSERT INTO `example` (`id`, `code`, `name`) VALUES
(1, '01', 'Apple'),
(2, '01', 'Mango'),
(3, '02', 'Pen'),
(4, '02', 'Ruler'),
(5, '03', 'Pan'),
(6, '03', 'Pot'),
(7, '03', 'Cup');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `example`
--
ALTER TABLE `example`
  ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `example`
--
ALTER TABLE `example`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;



14 ม.ค. 2560

สร้างตารางแสดงยอดจองในแต่ละเดือน PHP + mysqli

จากบทความเมื่อหลายปีก่อน สร้างปฏิทิน รายงานยอดที่พนักงานทำได้ในแต่ละเดือนแบบง่ายๆ จนถึงทุกวันนี้ฟังก์ชั่น mysql_xxx() ก็เริ่มเลิกใช้กันแล้ว เพราะเว็บโฮสติ้งรองรับ PHP 5.5 ได้เป็นอย่างต่ำก็เลยต้องปรับปรุงโค้ดกันสักหน่อย

ในครั้งนี้ก็จะนำเสนอเป็นวิดีโอเพื่อให้เห็นภาพการทำงานที่ชัดเจนขึ้น
ท่านสามารถเปิดเข้าไปดูได้ตามด้านล่างนี้เลยครับ






คำสั่ง SQL สำหรับสร้างตารางที่ใช้ในตัวอย่าง

--
-- Table structure for table `tb_report_booking`
--
CREATE TABLE IF NOT EXISTS `tb_report_booking` (
  `bk_id` int(13) NOT NULL AUTO_INCREMENT,
  `bk_user_code` bigint(10) NOT NULL,
  `bk_date` date NOT NULL,
  `bk_customer_code` bigint(10) NOT NULL,
  `bk_customer_name` varchar(40) NOT NULL,
  `bk_remark` varchar(225) NOT NULL,
  PRIMARY KEY (`bk_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;
--
-- Dumping data for table `tb_report_booking`
--
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(1, 2556020001, '2013-07-01', 2147483647, 'Mr.Brain', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(2, 2556020001, '2013-07-04', 32123, 'Mr.BomBae', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(3, 2556020001, '2013-07-05', 2147483647, 'Mr.Brain', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(4, 2556020001, '2013-07-17', 32123, 'Mr.BomBae', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(5, 2556020001, '2013-07-04', 25560, 'Mr.Brain', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(6, 2556020001, '2013-07-05', 121212, 'Mr.Brain333', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(7, 2556020002, '2013-07-05', 32123, 'asdfasdf', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(8, 2556020003, '2013-07-02', 20002, 'Mr.Brain44', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(9, 2556020005, '2013-07-25', 5601249, 'Mr.Lee JungKi', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(10, 2556020005, '2013-07-10', 5601249, 'Mr.Jang Okjong', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(11, 2556020005, '2013-07-10', 5601249, 'Mr.Jang Okjong', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(12, 2556020005, '2013-07-10', 5601249, 'Mr.Jang Okjong', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(13, 2556020001, '2013-07-10', 5601249, 'Mr.Jang Okjong', '');
INSERT INTO `tb_report_booking` (`bk_id`, `bk_user_code`, `bk_date`, `bk_customer_code`, `bk_customer_name`, `bk_remark`) VALUES(14, 2556020003, '2013-07-21', 5601249, 'Mr.Jang Okjong', '');
-- --------------------------------------------------------
--
-- Table structure for table `tb_user`
--
CREATE TABLE IF NOT EXISTS `tb_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'อัตโนมัติ',
  `user_code` varchar(20) NOT NULL COMMENT 'รหัสสมาชิก',
  `user_name` varchar(30) NOT NULL COMMENT 'ชื่อล็อกอิน',
  `user_password` varchar(60) NOT NULL COMMENT 'รหัสผ่าน',
  `user_fullname` varchar(100) NOT NULL COMMENT 'ชื่อนามสกุล',
  `user_nickname` varchar(30) NOT NULL COMMENT 'ชื่อเล่น',
  `user_school` varchar(50) NOT NULL COMMENT 'โรงเรียน',
  `user_level` int(1) NOT NULL COMMENT 'ระดับ',
  `user_active_status` int(1) NOT NULL COMMENT 'สถานะ',
  PRIMARY KEY (`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='ข้อมูลสมาชิก' AUTO_INCREMENT=8 ;
--
-- Dumping data for table `tb_user`
--
INSERT INTO `tb_user` (`user_id`, `user_code`, `user_name`, `user_password`, `user_fullname`, `user_nickname`, `user_school`, `user_level`, `user_active_status`) VALUES(6, '2556020006', 'sunzandesign6', 'abc123', 'นายณัฐพงษ์ คงรี', '', '', 2, 1);
INSERT INTO `tb_user` (`user_id`, `user_code`, `user_name`, `user_password`, `user_fullname`, `user_nickname`, `user_school`, `user_level`, `user_active_status`) VALUES(5, '2556020005', 'sunzandesign5', 'abc123', 'นางสาวอรทัย ใจเย็น', '', '', 2, 1);
INSERT INTO `tb_user` (`user_id`, `user_code`, `user_name`, `user_password`, `user_fullname`, `user_nickname`, `user_school`, `user_level`, `user_active_status`) VALUES(4, '2556020004', 'sunzandesign4', 'abc123', 'นางสาวสุวิมล สุดใจ', '', '', 2, 1);
INSERT INTO `tb_user` (`user_id`, `user_code`, `user_name`, `user_password`, `user_fullname`, `user_nickname`, `user_school`, `user_level`, `user_active_status`) VALUES(3, '2556020003', 'sunzandesign3', 'abc123', 'นางสาวรุ่งนภา พงษ์พันธ์', '', '', 2, 1);
INSERT INTO `tb_user` (`user_id`, `user_code`, `user_name`, `user_password`, `user_fullname`, `user_nickname`, `user_school`, `user_level`, `user_active_status`) VALUES(2, '2556020002', 'sunzandesign2', 'abc1234', 'นายรณพีร์ พณรี', '', '', 2, 1);
INSERT INTO `tb_user` (`user_id`, `user_code`, `user_name`, `user_password`, `user_fullname`, `user_nickname`, `user_school`, `user_level`, `user_active_status`) VALUES(1, '2556020001', 'sunzandesign', 'abc123', 'ซันซาน ดีไซน์', '', '', 1, 1);
INSERT INTO `tb_user` (`user_id`, `user_code`, `user_name`, `user_password`, `user_fullname`, `user_nickname`, `user_school`, `user_level`, `user_active_status`) VALUES(7, '2556020007', 'sunzandesign7', 'abc123', 'นายนิคม  บุญส่ง', '', '', 2, 1);


คำสั่งในไฟล์ PHP สำหรับแสดงผล

<?php
//เปิดการเชื่อมต่อฐานข้อมูล sunzandesign
//mysql_connect("localhost","root","abcd1234");  //ข้อมูลนี้ได้มาจากตอนติดตั้งเว็บเซิร์ฟเวอร์
$conn = mysqli_connect("localhost","tobedev","abcd.1234", "sunzandesign");  //ข้อมูลนี้ได้มาจากตอนติดตั้งเว็บเซิร์ฟเวอร์
mysqli_set_charset($conn, "utf8");//ส่วนนี้คือการตั้งค่า encoding แบบสากล ถ้าฐานข้อมูลเป็น tis-620 ก็ต้องเปลี่ยนด้วย
?>
<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']) ? mysqli_real_escape_string($conn, $_POST['txt_year']) : '';
$month = isset($_POST['txt_month']) ? mysqli_real_escape_string($conn, $_POST['txt_month']) : '';
if($year == '' || $month == '') exit('<p class="fail">กรุณาระบุ "เดือน-ปี" ที่ต้องการเรียกรายงาน</p>');


//ดึงข้อมูลพนักงานทั้งหมด
//ในส่วนนี้จะเก็บข้อมูลโดยใช้คีย์ เป็นรหัสพนักงาน และ value คือชื่อพนักงาน
$allEmpData = array();
$strSQL = "SELECT user_code,user_fullname FROM `tb_user` ";
$qry = mysqli_query($conn, $strSQL) or die('ไม่สามารถเชื่อมต่อฐานข้อมูลได้ Error : '. mysqli_error());
while($row = mysqli_fetch_assoc($qry)){
$allEmpData[$row['user_code']] = $row['user_fullname'];
}
/*
echo "<pre>";
print_r($allEmpData);
echo "</pre>";
*/
//เรียกข้อมูลการจองของเดือนที่ต้องการ
$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 = mysqli_query($conn, $strSQL) or die('ไม่สามารถเชื่อมต่อฐานข้อมูลได้ Error : '. mysqli_error());
while($row = mysqli_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);   //จำนวนวันของเดือน
echo "$timeDate";
//สร้างหัวตารางตั้งแต่วันที่ 1 ถึงวันที่สุดท้ายของดือน
for($day=1;$day<=$lastDay;$day++){
echo '<th>' . substr("0".$day, -2) . '</th>';
}
echo "</tr>";
//วนลูปเพื่อสร้างตารางตามจำนวนรายชื่อพนักงานใน Array
foreach($allEmpData as $empCode=>$empName){
echo '<tr>';//เปิดแถวใหม่ ตาราง HTML
echo '<td>'. $empName .'</td>';
//เรียกข้อมูลการจองของพนักงานแต่ละคน ในเดือนนี้
for($j=1;$j<=$lastDay;$j++){
//ตรวจสอบว่าวันที่แต่ละวัน $j ของ พนักงานแต่ละรหัส  $empCode มีข้อมูลใน  $allReportData หรือไม่ ถ้ามีให้แสดงจำนวนในอาร์เรย์ออกมา ถ้าไม่มีให้เป็น 0
$numBook = isset($allReportData[$empCode][$j]) ? '<div>'.$allReportData[$empCode][$j].'</div>' : 0;
echo "<td class='number'>", $numBook, "</td>";
}
echo '</tr>';//ปิดแถวตาราง HTML
}
echo "</table>";
/*
echo "<pre>";
print_r($allReportData);
echo "</pre>";
*/
mysqli_close($conn);//ปิดการเชื่อมต่อฐานข้อมูล
?>

Translate