|
|
|
อยากจะแยกข้อมูลในเรคอร์เป็นรายอาทิตย์ ทำอย่างไงค่ะ |
|
|
|
|
|
|
|
classes\test.php
<?php
namespace classes;
use \PDO as PDO;
class test {
private $dns;
private $user;
private $password;
public function __construct() {
$this->dns = 'sqlsrv:Server=localhost\sqlexpress;Database=test;';
$this->user = '';
$this->password = '';
if (!$this->exist())
$this->create();
}
protected function exist() {
$dbh = new PDO($this->dns, $this->user, $this->password);
$query = "IF EXISTS (SELECT * FROM sys.tables WHERE name = 'MyTable') SELECT 'true' ELSE SELECT 'false';";
$stmt = $dbh->prepare($query);
$stmt->execute();
return ($stmt->fetchColumn() === 'true');
}
protected function create() {
if ($this->exist())
$this->drop();
$dbh = new PDO($this->dns, $this->user, $this->password);
$query = 'CREATE TABLE MyTable (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, MyDate SMALLDATETIME, MyValue FLOAT);';
$stmt = $dbh->prepare($query);
$stmt->execute();
$this->fill();
}
protected function drop() {
$dbh = new PDO($this->dns, $this->user, $this->password);
$query = 'DROP TABLE MyTable;';
$stmt = $dbh->prepare($query);
$stmt->execute();
}
protected function fill() {
$dbh = new PDO($this->dns, $this->user, $this->password);
$data = $this->data();
for ($i = 0; $i < sizeof($data); $i++) {
$query = 'INSERT INTO MyTable (MyDate, MyValue) VALUES (:MyDate, :MyValue);';
$stmt = $dbh->prepare($query);
$stmt->execute(array(':MyDate' => $data[$i]['Date'], ':MyValue' => $data[$i]['Value']));
}
}
protected function data() {
$data = array(
array('Date' => '2013-10-1', 'Value' => 1.52),
array('Date' => '2013-10-2', 'Value' => 33.33),
array('Date' => '2013-10-4', 'Value' => 46.97),
array('Date' => '2013-10-7', 'Value' => 0.66),
array('Date' => '2013-10-8', 'Value' => 34.21),
array('Date' => '2013-10-9', 'Value' => 51.97),
array('Date' => '2013-10-12', 'Value' => 13.16),
array('Date' => '2013-10-14', 'Value' => 0.01),
array('Date' => '2013-10-16', 'Value' => 36.06),
array('Date' => '2013-10-16', 'Value' => 48.44),
array('Date' => '2013-10-19', 'Value' => 11.98),
array('Date' => '2013-10-21', 'Value' => 0.05),
array('Date' => '2013-10-23', 'Value' => 35.00),
array('Date' => '2013-10-26', 'Value' => 43.00),
array('Date' => '2013-10-26', 'Value' => 19.00),
array('Date' => '2013-10-28', 'Value' => 0.91),
array('Date' => '2013-10-29', 'Value' => 37.27),
array('Date' => '2013-10-30', 'Value' => 52.27),
array('Date' => '2013-10-31', 'Value' => 9.55));
return $data;
}
public function get($year, $month) {
$dbh = new PDO($this->dns, $this->user, $this->password);
$query = "SELECT MyDate, MyValue FROM MyTable WHERE YEAR(MyDate)=:Year AND MONTH(MyDate)=:Month ORDER BY MyDate ASC;";
$stmt = $dbh->prepare($query);
$stmt->execute(array(':Year' => $year, ':Month' => $month));
return $stmt;
}
}
?>
index.php
<?php
spl_autoload_extensions('.php');
spl_autoload_register();
use \DateTime as DateTime;
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test PHP</title>
</head>
<body>
<table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;">
<?php
$year = 2013;
$month = 10;
$date = new DateTime("$year-$month-1");
$firstDayOfMonth = intval($date->format('w')); // วันอะไร
$daysInMonth = intval($date->format('t')); // เดือนนี้มีกี่วัน
$daysInMonthPlus = $daysInMonth + $firstDayOfMonth;
$weeksInMonth = ($daysInMonthPlus % 7 === 0) ? $daysInMonthPlus / 7 : floor($daysInMonthPlus / 7) + 1;
echo "<tr><th colspan=\"{$weeksInMonth}\" style=\"background-color:LightYellow;\">{$date->format('F')}</th></tr>\n";
echo '<tr>';
for ($i = 0; $i < $weeksInMonth; $i++) {
$first = $i * 7 - $firstDayOfMonth + 1;
$last = $i * 7 + 7 - $firstDayOfMonth;
$firstDayOfWeek = ($first >= 1) ? (intval((new DateTime("$year-$month-$first"))->format('w')) === 0) ? $first + 1 : $first : 1;
$lastDayOfWeek = ($last <= $daysInMonth) ? $last : $daysInMonth;
echo "<th style=\"background-color:LightYellow;\">{$firstDayOfWeek}-{$lastDayOfWeek}</th>";
}
echo "</tr>\n";
$test = new classes\test();
$result = $test->get($year, $month);
$data = array();
$level = 0;
$previous = 0;
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$myDate = new DateTime($row['MyDate']);
$day = intval($myDate->format('j'));
$dayMod = floor(($day + $firstDayOfMonth) / 7);
$week = ($dayMod === 0) ? $dayMod : $dayMod + 1;
if (intval($myDate->format('w')) !== 0) {
$level = ($previous === $week) ? $level + 1 : 1;
$key = 'W' . $week . 'L' . $level;
$data[$key] = number_format($row['MyValue'], 2, '.', ',');
}
$previous = $week;
}
for ($l = 1; $l <= $level; $l++) {
echo '<tr>';
for ($w = 1; $w <= $week; $w++) {
$key = "W" . $w . "L" . $l;
$value = isset($data[$key]) ? $data[$key] : ' ';
echo "<td>{$value}</td>";
}
echo "</tr>\n";
}
?>
</table>
</body>
</html>
|
|
|
|
|
Date :
2013-08-16 10:40:53 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เอาใหม่ ตะกี้ไม่ถูก
index.php
<?php
spl_autoload_extensions('.php');
spl_autoload_register();
use \DateTime as DateTime;
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test PHP</title>
</head>
<body>
<table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;">
<?php
$year = 2013;
$month = 10;
$date = new DateTime("$year-$month-1");
$firstDayOfMonth = intval($date->format('w')); // วันอะไร
$daysInMonth = intval($date->format('t')); // เดือนนี้มีกี่วัน
$daysInMonthPlus = $daysInMonth + $firstDayOfMonth;
$weeksInMonth = ($daysInMonthPlus % 7 === 0) ? $daysInMonthPlus / 7 : floor($daysInMonthPlus / 7) + 1;
echo "<tr><th colspan=\"{$weeksInMonth}\" style=\"background-color:LightYellow;\">{$date->format('F')} {$year}</th></tr>\n";
echo '<tr>';
for ($i = 0; $i < $weeksInMonth; $i++) {
$first = $i * 7 - $firstDayOfMonth + 1;
$last = $i * 7 + 7 - $firstDayOfMonth;
$firstDayOfWeek = ($first >= 1) ? (intval((new DateTime("$year-$month-$first"))->format('w')) === 0) ? $first + 1 : $first : 1;
$lastDayOfWeek = ($last <= $daysInMonth) ? $last : $daysInMonth;
echo "<th style=\"background-color:LightYellow;\">{$firstDayOfWeek}-{$lastDayOfWeek}</th>";
}
echo "</tr>\n";
$test = new classes\test();
$result = $test->get($year, $month);
$data = array();
$level = 0;
$previous = 0;
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$myDate = new DateTime($row['MyDate']);
$day = intval($myDate->format('j'));
$dayPlus = $day + $firstDayOfMonth;
$week = ($dayPlus % 7 === 0) ? floor($dayPlus / 7) : floor($dayPlus / 7) + 1;
if (intval($myDate->format('w')) !== 0) {
$level = ($previous === $week) ? $level + 1 : 1;
$key = 'W' . $week . 'L' . $level;
$data[$key] = $myDate->format('d/m/Y') . ' - ' . number_format($row['MyValue'], 2, '.', ',');
}
$previous = $week;
}
for ($l = 1; $l <= $level; $l++) {
echo '<tr>';
for ($w = 1; $w <= $week; $w++) {
$key = "W" . $w . "L" . $l;
$value = isset($data[$key]) ? $data[$key] : ' ';
echo "<td>{$value}</td>";
}
echo "</tr>\n";
}
?>
</table>
</body>
</html>
|
|
|
|
|
Date :
2013-08-16 10:57:37 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณมากค่ะ แต่ Error มันต้องมีไฟล์เป็น classes ป่าวค่ะ
namespace classes;
Parse error: syntax error, unexpected T_STRING in D:\AppServ\www\test2.php on line 2
use \DateTime as DateTime;
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in D:\AppServ\www\test3.php on line 6
Parse error: syntax error, unexpected T_STRING, expecting T_CONSTANT_ENCAPSED_STRING or '(' in D:\AppServ_2556\www\test3.php on line 6
|
ประวัติการแก้ไข 2013-08-16 11:31:22
|
|
|
|
Date :
2013-08-16 11:31:07 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
classes เป็นชื่อ folder
ให้สร้าง folder ชื่อ classes แล้วเอา test.php ไปวางไว้
|
|
|
|
|
Date :
2013-08-16 11:50:19 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
โค้ดของคุณห้ามตอบฯ เอาไปใช้กับเครื่องคุณ (และโฮสต์ในไทยส่วนใหญ่) ไม่ได้หรอกครับ เพราะ AppServ รุ่นล่าสุด (และโฮสต์ในไทยส่วนใหญ่) ยังใช้ PHP5.2 ยังไม่สนับสนุน namespace ครับ
|
|
|
|
|
Date :
2013-08-16 12:04:51 |
By :
cookiephp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
จริงๆ ด้วย แต่โชคดีที่เขียนแบบ oop ไว้
เลยแก้แค่บรรทัดที่ 38-39 กับตรง while loop ของ index.php
ให้เป็นการ query ก็นายเองก็ได้แล้วแหละ
ตัดตรงส่วน autoload class ด้วยก็ได้ เผื่อมันจะ error
ปล. เรามือใหม่มาเริ่ม php ก็ปาไป version 5.4.14 แล้ว ไม่ค่อยมีความรู้เรื่องโค้ดเก่าๆ เท่าไหร่
|
|
|
|
|
Date :
2013-08-16 12:16:21 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เสียดายเชียว ดูจากที่ คุณ ห้ามตอบเกินวันละ 2 กระทู้ Preview มันใช่ตามที่ต้องการเลย ความหวังมันเมื่อเจือจาง
|
|
|
|
|
Date :
2013-08-16 13:43:13 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
มันก็ใช้ได้นะแก้นิดเดียวเอง เอาส่วน query มาใส่หน้า index ก็ได้แล้ว
แก้ตามนี้นะ
index.php
<?php
//เอาออก
//spl_autoload_extensions('.php');
//spl_autoload_register();
use \DateTime as DateTime;
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test PHP</title>
</head>
<body>
<table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;">
<?php
$year = 2013;
$month = 10;
$date = new DateTime("$year-$month-1");
$firstDayOfMonth = intval($date->format('w')); // วันอะไร
$daysInMonth = intval($date->format('t')); // เดือนนี้มีกี่วัน
$daysInMonthPlus = $daysInMonth + $firstDayOfMonth;
$weeksInMonth = ($daysInMonthPlus % 7 === 0) ? $daysInMonthPlus / 7 : floor($daysInMonthPlus / 7) + 1;
echo "<tr><th colspan=\"{$weeksInMonth}\" style=\"background-color:LightYellow;\">{$date->format('F')} {$year}</th></tr>\n";
echo '<tr>';
for ($i = 0; $i < $weeksInMonth; $i++) {
$first = $i * 7 - $firstDayOfMonth + 1;
$last = $i * 7 + 7 - $firstDayOfMonth;
$firstDayOfWeek = ($first >= 1) ? (intval((new DateTime("$year-$month-$first"))->format('w')) === 0) ? $first + 1 : $first : 1;
$lastDayOfWeek = ($last <= $daysInMonth) ? $last : $daysInMonth;
echo "<th style=\"background-color:LightYellow;\">{$firstDayOfWeek}-{$lastDayOfWeek}</th>";
}
echo "</tr>\n";
//เอาตรงนี้ออก แก้เป็นโค้ด query database อย่าลืม sort ด้วย date นะ
//$test = new classes\test();
//$result = $test->get($year, $month);
$data = array();
$level = 0;
$previous = 0;
while (/* fatch array */) {
$myDate = new DateTime(/*เอา column date มาใส่ */);
$day = intval($myDate->format('j'));
$dayPlus = $day + $firstDayOfMonth;
$week = ($dayPlus % 7 === 0) ? floor($dayPlus / 7) : floor($dayPlus / 7) + 1;
if (intval($myDate->format('w')) !== 0) {
$level = ($previous === $week) ? $level + 1 : 1;
$key = 'W' . $week . 'L' . $level;
$data[$key] = $myDate->format('d/m/Y') . ' - ' . number_format(/*เอา column value มาใส่ */, 2, '.', ',');
}
$previous = $week;
}
for ($l = 1; $l <= $level; $l++) {
echo '<tr>';
for ($w = 1; $w <= $week; $w++) {
$key = "W" . $w . "L" . $l;
$value = isset($data[$key]) ? $data[$key] : ' ';
echo "<td>{$value}</td>";
}
echo "</tr>\n";
}
?>
</table>
</body>
</html>
|
|
|
|
|
Date :
2013-08-16 13:50:17 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Quote:ขออนุมานว่าข้อมูลเป็นดังภาพน่ะครับ ผมใช้วิธีสุ่มตัวเลขขึ้นมา
CREATE TABLE `number` (
`docdate` date default NULL,
`number` decimal(10,2) NOT NULL default '0.00',
UNIQUE KEY `docdate` (`docdate`),
KEY `number` (`number`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Dumping data for table `number`
--
INSERT INTO `number` VALUES ('2013-08-01', 1.79);
INSERT INTO `number` VALUES ('2013-08-02', 7.35);
INSERT INTO `number` VALUES ('2013-08-03', 2.91);
INSERT INTO `number` VALUES ('2013-08-04', 8.77);
INSERT INTO `number` VALUES ('2013-08-05', 0.84);
INSERT INTO `number` VALUES ('2013-08-06', 2.63);
INSERT INTO `number` VALUES ('2013-08-07', 7.39);
INSERT INTO `number` VALUES ('2013-08-08', 1.11);
INSERT INTO `number` VALUES ('2013-08-09', 1.85);
INSERT INTO `number` VALUES ('2013-08-10', 5.78);
INSERT INTO `number` VALUES ('2013-08-11', 0.22);
INSERT INTO `number` VALUES ('2013-08-12', 3.56);
INSERT INTO `number` VALUES ('2013-08-13', 2.24);
INSERT INTO `number` VALUES ('2013-08-14', 11.71);
INSERT INTO `number` VALUES ('2013-08-15', 9.88);
INSERT INTO `number` VALUES ('2013-08-16', 2.62);
INSERT INTO `number` VALUES ('2013-08-17', 0.42);
INSERT INTO `number` VALUES ('2013-08-18', 8.04);
INSERT INTO `number` VALUES ('2013-08-19', 1.54);
INSERT INTO `number` VALUES ('2013-08-20', 3.85);
INSERT INTO `number` VALUES ('2013-08-21', 9.16);
INSERT INTO `number` VALUES ('2013-08-22', 13.19);
INSERT INTO `number` VALUES ('2013-08-23', 11.71);
INSERT INTO `number` VALUES ('2013-08-24', 10.39);
INSERT INTO `number` VALUES ('2013-08-25', 9.39);
INSERT INTO `number` VALUES ('2013-08-26', 1.60);
INSERT INTO `number` VALUES ('2013-08-27', 2.36);
INSERT INTO `number` VALUES ('2013-08-28', 4.62);
INSERT INTO `number` VALUES ('2013-08-29', 4.10);
INSERT INTO `number` VALUES ('2013-08-30', 1.90);
INSERT INTO `number` VALUES ('2013-08-31', 5.40);
|
|
|
|
|
Date :
2013-08-16 13:52:16 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Code (PHP)
<?php
function isSunday($date)
{
return (date('N', strtotime($date)) > 6);
}
function genTable($date)
{
$lastdayofmonth = date('t',strtotime($date));
$lastweek = ceil($lastdayofmonth/7);
$weeks = range(1,$lastweek);
$newdate = new Datetime();
$dateGrouping = array();
list($Y,$m,$d) = explode("-",$date);
$newdate->setDate($Y,$m,'01');
echo "<table id='summary' border='1'><thead><tr><td colspan='$lastweek' style='text-align:center'>",$newdate->format("F Y"),"</td></tr>\n";
echo "<tr>";
$n=1;
for($i = 1; $i <= $lastdayofmonth; ++$i){
$strdate = $newdate->format("Y-m-d");
if( isSunday($strdate) && $i > 1){
$dateGrouping[$n] .= $newdate->format("/m/Y");
$n++;
}elseif($i>1 && strlen($dateGrouping[$n])>0){
$dateGrouping[$n] .= ",$i";
}else{
$dateGrouping[$n] .= "$i";
}
$newdate->modify("+1 day");
}
$dateGrouping[$n] .= $newdate->format("/m/Y");
foreach($weeks as $numweek){
$c = explode("," , $dateGrouping[$numweek]);
$lastc = count($c);
list($c[$lastc-1],,) = explode("/",$c[$lastc-1]);
$c = implode(" ",$c);
$s = explode("," , $dateGrouping[$numweek]);
$last = count($s);
echo "<td width='100px' week='$numweek' class='$c'>",$s[0],"-",$s[$last-1],"</td>";
}
echo "</tr></thead>\n<tbody></tbody></table>";
}
//////////////////////////////////////////////////////////////
// การเรียกใช้งานฟังก์ชั่นครับ
$date = "2013-10-10";
genTable($date);
// เลือกใส่วันที่อะไรก็ได้
/////////////////////////////////////////////////////////////
$lastdayofmonth = date('t',strtotime($date));
$lastweek = ceil($lastdayofmonth/7);
?>
|
ประวัติการแก้ไข 2013-08-16 14:24:36
|
|
|
|
Date :
2013-08-16 14:01:43 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ส่วนนี้จะเป็นโค้ด jquery ทำหน้าที่สร้างตารางส่วนคอนเทนต์และนำข้อมูลที่ดึงจากเดต้าเบสมาเก็บไว้ในตัวแปร javascript แล้วจึงนำมาใส่ในตารางโดยดูจากหัวตารางที่ทำคลาสเป็นกลุ่มของวันที่ในแต่ละคอลัมน์
<script src="http://code.jquery.com/jquery-latest.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<script>
$(document).ready(function(){
var myNumber = [];
var lastNumOfWeek = <?php echo $lastweek; ?>;
<?php
$link = mysql_connect("localhost","root","password") or die(mysql_error());
mysql_select_db("test",$link) or die(mysql_error());
$sql = "select day(docdate) as day,docdate,number from number order by docdate";
$res = mysql_query($sql) or die(mysql_error());
while($data = mysql_fetch_assoc($res)){
echo "myNumber[{$data["day"]}] = '{$data["number"]}';\n";
}
?>
var classStack,classArray,outer,inner,dayperweek = [1,2,3,4,5,6];
var allColumn='';
for(i=1; i <= lastNumOfWeek; ++i)
allColumn += '<td> </td>';
inner = $("#summary tbody");
$.each(dayperweek,function(i){
inner.append("<tr datarow='"+i+"'>"+allColumn+"</tr>");
});
$("table#summary thead tr:nth-child(2) td").each(function(index){
outer = $(this);
classStack = outer.attr("class");
classArray = classStack.split(" ");
$.each(classArray,function(j){
$("tr:nth-child("+(j+1)+") td:nth-child("+(index+1)+")",inner).text(myNumber[classArray[j]]);
});
});
});
</script>
|
ประวัติการแก้ไข 2013-08-16 14:10:29 2013-08-16 14:12:40 2013-08-16 14:36:20
|
|
|
|
Date :
2013-08-16 14:05:18 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
นี่เป็นผลลัพธ์จากการรันครับ
|
|
|
|
|
Date :
2013-08-16 14:08:07 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
สงสัย บรรทัดที่ 32 ที่มีแทบสีแดง ต้องแก้ไขอะไรป่าวค่ะ
|
|
|
|
|
Date :
2013-08-16 14:12:39 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 ไม่ต้องแก้
39-41 (เขียนโค้ด query ใหม่)
47 (fetch assoc)
48 (เอา date ไปใส่)
56 (เอา value ไปใส่)
|
|
|
|
|
Date :
2013-08-16 14:19:35 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เราจะลองรันโค๊ดดูนะค่ะ ขอบคุณมากๆค่ะ คุณ ห้ามตอบเกินวันละ 2 กระทู้ และคุณ Unidentifier
|
|
|
|
|
Date :
2013-08-16 14:21:26 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
คือโค้ดที่ให้ไปใหม่เรายังไม่มีส่วน query น่ะ
เพราะของเก่าเรายัดไว้ใน class แต่พอไม่เรียก class
นายจะต้องเพิ่มส่วนนี้เข้าไปเอง
|
|
|
|
|
Date :
2013-08-16 14:22:08 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เอาโครงสร้างตารางข้อมูลมาลงให้ดูหน่อยซิครับ จะได้ปรับแก้ให้ได้
|
|
|
|
|
Date :
2013-08-16 14:31:32 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แก้ให้เดียวไฟล์เดียวก็ประมาณนี้แหละ ของเก่าที่เป็น class มันตรวจ table ด้วย
ถ้าไม่มี table มันจะสร้างให้ โค้ดมันเลยยาว
index.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test PHP</title>
</head>
<body>
<table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;">
<?php
$year = 2013;
$month = 10;
$date = new DateTime("$year-$month-1");
$thaiYear = $year + 543;
$thaiMonth = array(
'January' => 'มกราคม',
'February' => 'กุมภาพันธ์',
'March' => 'มีนาคม',
'April' => 'เมษายน',
'May' => 'พฤษภาคม',
'June' => 'มิถุนายน',
'July' => 'กรกฎาคม',
'August' => 'สิงหาคม',
'September' => 'กันยายน',
'October' => 'ตุลาคม',
'November' => 'พฤศจิกายน',
'December' => 'ธันวาคม');
$thaiDay = array(
'Sunday' => 'อาทิตย์',
'Monday' => 'จันทร์',
'Tuesday' => 'อังคาร',
'Wednesday' => 'พุธ',
'Thursday' => 'พฤหัสบดี',
'Friday' => 'ศุกร์',
'Saturday' => 'เสาร์');
$firstDayOfMonth = intval($date->format('w')); //0=sun, 6=sat
$daysInMonth = intval($date->format('t'));
$daysInMonthPlus = $daysInMonth + $firstDayOfMonth;
$weeksInMonth = ($daysInMonthPlus % 7 === 0) ? floor($daysInMonthPlus / 7) : floor($daysInMonthPlus / 7) + 1;
echo "<tr><th colspan=\"{$weeksInMonth}\" style=\"background-color:LightYellow;\">{$thaiMonth[$date->format('F')]} {$thaiYear}</th></tr>\n";
echo '<tr>';
for ($i = 0; $i < $weeksInMonth; $i++) {
$week = $i + 1;
$first = $i * 7 - $firstDayOfMonth + 1;
$last = $i * 7 + 7 - $firstDayOfMonth;
$firstDayOfWeek = ($first >= 1) ? (intval((new DateTime("$year-$month-$first"))->format('w')) === 0) ? $first + 1 : $first : 1;
$lastDayOfWeek = ($last <= $daysInMonth) ? $last : $daysInMonth;
echo "<th style=\"background-color:LightYellow;\">สัปดาห์ที่ {$week} ({$firstDayOfWeek}-{$lastDayOfWeek})</th>";
}
echo "</tr>\n";
$data = array();
$level = 0;
$previous = 0;
$dbh = new PDO('sqlsrv:Server=localhost\sqlexpress;Database=test;', '', '');
$query = "SELECT MyDate, MyValue FROM MyTable WHERE YEAR(MyDate)=:Year AND MONTH(MyDate)=:Month ORDER BY MyDate ASC;";
$stmt = $dbh->prepare($query);
$stmt->execute(array(':Year' => $year, ':Month' => $month));
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
$myDate = new DateTime($row->MyDate);
$day = intval($myDate->format('j'));
$dayPlus = $day + $firstDayOfMonth;
$week = ($dayPlus % 7 === 0) ? floor($dayPlus / 7) : floor($dayPlus / 7) + 1;
if (intval($myDate->format('w')) !== 0) {
$level = ($previous === $week) ? $level + 1 : 1;
$key = 'W' . $week . 'L' . $level;
$data[$key] = 'วัน' . $thaiDay[$myDate->format('l')] . 'ที่ ' . $myDate->format('d') . ' - ' . number_format($row->MyValue, 2, '.', ',');
}
$previous = $week;
}
for ($l = 1; $l <= $level; $l++) {
echo '<tr>';
for ($w = 1; $w <= $week; $w++) {
$key = "W" . $w . "L" . $l;
$value = isset($data[$key]) ? $data[$key] : ' ';
echo "<td>{$value}</td>";
}
echo "</tr>\n";
}
?>
</table>
</body>
</html>
|
|
|
|
|
Date :
2013-08-16 14:39:21 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตัวอย่างจาก Excel ค่ะ คุณ Unidentifier
เราลองออกแบบตามนี้ดูค่ะ ขอบคุณนะค่ะ ที่สนใจ
|
|
|
|
|
Date :
2013-08-16 14:47:33 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ชุดข้อมูลอยู่ในอะไรครับ mysql หรือ excel ครับ
|
|
|
|
|
Date :
2013-08-16 14:49:39 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
excel ค่ะ
|
|
|
|
|
Date :
2013-08-16 14:50:53 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Quote:เดี๋ยวผมแปะโค้ดแบบชุดเต็มไม่มีตัดต่อไว้ให้ดีกว่าครับ แล้วคุณ Lola ก็ไปแก้ในส่วนที่ติดต่อกับฐานข้อมูล(Excel)
เอาเองแล้วกันน่ะครับ อาจใช้ฟังก์ชั่น PDO แบบที่คุณ " ห้ามตอบเกินวันละ 2 กระทู้" เขียนไว้ข้างต้นน่ะครับ
กระทู้นี้น่าสนใจเพราะโจทย์มันยากพอสมควรครับ เลยมีสมาชิกอยากลับสมองกันหลายท่าน
Code (PHP)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>https://www.thaicreate.com/php/forum/099140.html</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
</head>
<body>
<?php
function isSunday($date)
{
return (date('N', strtotime($date)) > 6);
}
function genTable($date)
{
$lastdayofmonth = date('t',strtotime($date));
$lastweek = ceil($lastdayofmonth/7);
$weeks = range(1,$lastweek);
$newdate = new Datetime();
$dateGrouping = array();
list($Y,$m,$d) = explode("-",$date);
$newdate->setDate($Y,$m,'01');
echo "<table id='summary' border='1'><thead><tr><td colspan='$lastweek' style='text-align:center'>",$newdate->format("F Y"),"</td></tr>\n";
echo "<tr>";
$n=1;
for($i = 1; $i <= $lastdayofmonth; ++$i){
$strdate = $newdate->format("Y-m-d");
if( isSunday($strdate) && $i > 1){
$dateGrouping[$n] .= $newdate->format("/m/Y");
$n++;
}elseif($i>1 && strlen($dateGrouping[$n])>0){
$dateGrouping[$n] .= ",$i";
}else{
$dateGrouping[$n] .= "$i";
}
$newdate->modify("+1 day");
}
$dateGrouping[$n] .= $newdate->format("/m/Y");
foreach($weeks as $numweek){
$c = explode("," , $dateGrouping[$numweek]);
$lastc = count($c);
list($c[$lastc-1],,) = explode("/",$c[$lastc-1]);
$c = implode(" ",$c);
$s = explode("," , $dateGrouping[$numweek]);
$last = count($s);
echo "<td width='100px' week='$numweek' class='$c'>",$s[0],"-",$s[$last-1],"</td>";
}
echo "</tr></thead>\n<tbody></tbody></table>";
}
$date = "2013-10-10";
genTable($date);
$lastdayofmonth = date('t',strtotime($date));
$lastweek = ceil($lastdayofmonth/7);
?>
<script>
$(document).ready(function(){
var myNumber = [];
var lastNumOfWeek = <?php echo $lastweek; ?>;
<?php
// เชื่อมต่อฐานข้อมูล และดึงข้อมูลมาเก็บไว้ในตัวแปร
$link = mysql_connect("localhost","root","password") or die(mysql_error());
mysql_select_db("test",$link) or die(mysql_error());
$sql = "select day(docdate) as day,docdate,number from number order by docdate";
$res = mysql_query($sql) or die(mysql_error());
while($data = mysql_fetch_assoc($res)){
echo "myNumber[{$data["day"]}] = '{$data["number"]}';\n";
}
?>
var classStack,classArray,outer,inner,dayperweek = [1,2,3,4,5,6];
var allColumn='';
for(i=1; i <= lastNumOfWeek; ++i)
allColumn += '<td> </td>';
inner = $("#summary tbody");
$.each(dayperweek,function(i){
inner.append("<tr datarow='"+i+"'>"+allColumn+"</tr>");
});
$("table#summary thead tr:nth-child(2) td").each(function(index){
outer = $(this);
classStack = outer.attr("class");
classArray = classStack.split(" ");
$.each(classArray,function(j){
$("tr:nth-child("+(j+1)+") td:nth-child("+(index+1)+")",inner).text(myNumber[classArray[j]]);
});
});
});
</script>
</body>
</html>
|
|
|
|
|
Date :
2013-08-16 14:59:45 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอถาม คุณ Unidentifier อีกซักคำถามนะค่ะ
จากเดิม สัปดาห์ที่ 1 ,2 ,3 ,4 ,5 จะเป็น วันจันทร์ - เสาร์
แต่เงื่อนไขนี้ อยากให้ สัปดาห์ที่ 1 ,2 ให้เป็น วันจันทร์ - เสาร์ และ 3 ,4 ,5 เป็น วันจันทร์ - อาทิตย์
พอจะแก้ไขตรงจุดไหนได้บ้างค่ะ
|
ประวัติการแก้ไข 2013-08-16 17:12:05
|
|
|
|
Date :
2013-08-16 17:10:46 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แบบนี้เหรอครับ
|
|
|
|
|
Date :
2013-08-16 17:21:09 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แก้ไขโค้ด 2 ที่ครับ
1.)เพิ่ม 7 ที่ตัวแปร dayperweek ครับ
var classStack,classArray,outer,inner,stackDays = [],dayperweek = [1,2,3,4,5,6,7];
เพิ่มเงื่อนไขตรวจสอบสัปดาห์ครับ
$markSunday=0;
for($i = 1; $i <= $lastdayofmonth; ++$i){
$strdate = $newdate->format("Y-m-d");
if( isSunday($strdate) && $i > 1){
$markSunday++;
if($markSunday <= 2)
$dateGrouping[$n] .= $newdate->format("/m/Y");
else
$dateGrouping[$n] .= ",$i".$newdate->format("/m/Y");
$n++;
}elseif($i>1 && strlen($dateGrouping[$n])>0){
$dateGrouping[$n] .= ",$i";
}else{
$dateGrouping[$n] .= "$i";
}
$newdate->modify("+1 day");
}
|
|
|
|
|
Date :
2013-08-16 17:26:00 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ฉบับเต็มครับ
<?php
function genTable($date)
{
$lastdayofmonth = date('t',strtotime($date));
$lastweek = ceil($lastdayofmonth/7);
$weeks = range(1,$lastweek);
$newdate = new Datetime();
$dateGrouping = array();
list($Y,$m,$d) = explode("-",$date);
$newdate->setDate($Y,$m,'01');
echo "<table id='summary' border='1'><thead><tr><td colspan='$lastweek' style='text-align:center'>",$newdate->format("F Y"),"</td></tr>\n";
echo "<tr>";
$n=1;
$markSunday=0;
for($i = 1; $i <= $lastdayofmonth; ++$i){
$strdate = $newdate->format("Y-m-d");
if( isSunday($strdate) && $i > 1){
$markSunday++;
if($markSunday <= 2)
$dateGrouping[$n] .= $newdate->format("/m/Y");
else
$dateGrouping[$n] .= ",$i".$newdate->format("/m/Y");
$n++;
}elseif($i>1 && strlen($dateGrouping[$n])>0){
$dateGrouping[$n] .= ",$i";
}else{
$dateGrouping[$n] .= "$i";
}
$newdate->modify("+1 day");
}
$dateGrouping[$n] .= $newdate->format("/m/Y");
foreach($weeks as $numweek){
$c = explode("," , $dateGrouping[$numweek]);
$lastc = count($c);
list($c[$lastc-1],,) = explode("/",$c[$lastc-1]);
$c = implode(" ",$c);
$s = explode("," , $dateGrouping[$numweek]);
$last = count($s);
echo "<td width='100px' week='$numweek' class='$c'>",$s[0],"-",$s[$last-1],"</td>";
}
echo "</tr></thead>\n<tbody></tbody></table>";
}
$date = "2013-10-10";
genTable($date);
$lastdayofmonth = date('t',strtotime($date));
$lastweek = ceil($lastdayofmonth/7);
?>
<script>
$(document).ready(function(){
var myNumber = [];
var lastNumOfWeek = <?php echo $lastweek; ?>;
<?php
$link = mysql_connect("localhost","root","@poh5992") or die(mysql_error());
mysql_select_db("test",$link) or die(mysql_error());
$sql = "select day(docdate) as day,docdate,number from number order by docdate";
$res = mysql_query($sql) or die(mysql_error());
while($data = mysql_fetch_assoc($res)){
echo "myNumber[{$data["day"]}] = '{$data["number"]}';\n";
}
?>
var classStack,classArray,outer,inner,stackDays = [],dayperweek = [1,2,3,4,5,6,7];
var allColumn='';
for(i=1; i <= lastNumOfWeek; ++i)
allColumn += '<td> </td>';
inner = $("#summary tbody");
$.each(dayperweek,function(i){
inner.append("<tr datarow='"+i+"'>"+allColumn+"</tr>");
});
$("table#summary thead tr:nth-child(2) td").each(function(index){
outer = $(this);
classStack = outer.attr("class");
classArray = classStack.split(" ");
$.each(classArray,function(j){
$("tr:nth-child("+(j+1)+") td:nth-child("+(index+1)+")",inner).text(myNumber[classArray[j]]);
});
});
});
</script>
|
|
|
|
|
Date :
2013-08-16 17:37:35 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอบความคิดเห็นที่ : 25 เขียนโดย : phoenix10 เมื่อวันที่ 2013-08-16 17:10:46
รายละเอียดของการตอบ ::
ขอบคุณมากค่ะ คุณ Unidentifier
จากที่ลอง เงื่อนไขนี้ อยากให้ สัปดาห์ที่ 1 ,2 ให้เป็น วันจันทร์ - เสาร์ และ 3 ,4 ,5 เป็น วันจันทร์ - อาทิตย์
เราลองนำมาแก้ไข ตามเงื่อนไขใหม่ดู ที่ตรงจุดนี้ดู
***ตัวอย่างคือ เดือน ตุลาคม***
สัปดาห์ที่ 1 ,2
วันจันทร์ - เสาร์
วันที่ 1-5 , 7-12
สัปดาห์ที่ 3 ,4 ,5
วันอาทิตย์ - เสาร์
วันที่ 13-19 , 20-26 , 27-31
แต่ลองแก้ไขตามเงื่อนไขใหม่ของ ***ตัวอย่างคือ เดือน ตุลาคม*** ไม่ได้เลย
Code (PHP)
$markSunday=0;
for($i = 1; $i <= $lastdayofmonth; ++$i){
$strdate = $newdate->format("Y-m-d");
if( isSunday($strdate) && $i > 1){
$markSunday++;
if($markSunday <= 2)
$dateGrouping[$n] .= $newdate->format("/m/Y");
else
$dateGrouping[$n] .= ",$i".$newdate->format("/m/Y");
$n++;
}elseif($i>1 && strlen($dateGrouping[$n])>0){
$dateGrouping[$n] .= ",$i";
}else{
$dateGrouping[$n] .= "$i";
}
$newdate->modify("+1 day");
}
และก็สงสัยในการเรียงลำดับค่ะ เราลองเปลี่ยนมาเป็น number (ASC,DESC) ก็ไม่เรียงให้ เลยสงสัยช่วยอธิบายหน่อยนะค่ะ
โค๊ดที่คุณ Unidentifier ทำให้มันสุดยอดเลยค่ะ ขอบคุณจริงๆที่ช่วยเหลือกัน
Code (PHP)
$sql = "select day(docdate) as day,docdate,number from number order by docdate";
พอจะแก้ไขตรงจุดไหนได้บ้างค่ะ
|
ประวัติการแก้ไข 2013-08-20 10:48:47 2013-08-20 10:50:33 2013-08-20 10:51:41 2013-08-20 10:52:30
|
|
|
|
Date :
2013-08-20 10:47:52 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่ยากคับ ดึงข้อมูลเรียงตามวันที่ มาลูป แยกชุดเอา
function date() มันสามารถดูข้อมูลได้หลายอย่าง
บางทีอ่านโค้ดคนอื่นยิ่งงง ถ้าเขาอุตส่าเขียนมาให้แล้ว ถ้าอ่านไม่เข้าใจ ก็ลองทำเองจะเก่งขึ้นด้วย
|
ประวัติการแก้ไข 2013-08-20 12:38:22
|
|
|
|
Date :
2013-08-20 12:29:53 |
By :
pjgunner.com |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
โค้ดที่เขียนให้จะรันเป็นสัปดาห์ คือ จันทร์ ถึง อาทิตย์
แต่ที่ต้องการจะเป็นการคาบเกี่ยวระหว่างสัปดาห์ คือ อาทิตย์ ถึง เสาร์ แบบนี้คงยากหน่อยล่ะครับ
ถ้ามีเวลาจะกลับมาแก้ไขให้ครับ หรือรอคำแนะนำจากสมาชิกท่านอื่น
|
|
|
|
|
Date :
2013-08-20 12:40:26 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Date :
2013-08-20 13:25:44 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมคิดได้สองวิธีตอนนี้
1. ดึงข้อมูลแบบเรียง แล้วลูป ตรวจสอบด้วย date() etc แล้วจัดเข้ากลุ่มอาเรย์
2. (วิธีลัด) สังเกตุได้จากคุณแสดงข้อมูลเป็นรายเดือน ให้สร้าง ชุดขึ้นมาก่อนโดยลูป 1-31 ของเดือนนั้นๆ ตรวจสอบด้วยว่าเดือนนั้นมีกี่วันเช่น date('t', strtotime('2013-10-1')) คราวนี้ เราจะรู้ว่าวันไหนอยู่ชุดไหนแล้ว คิดว่าอาจงง เดี๋ยวเขียนตัวอย่างให้
Example
<?php
$sql = "select * from number where month(docdate)=8 order by docdate";
$query = mysql_query($sql) or die($sql);
// สร้าง รายการวันที่
$month_days = (int)date('t', strtotime('2013-08-01')); // จำนวนวันในเดือนนี้
$group_of_days = array();
$h = 1; // หมายเลขกลุ่ม
for($i=1; $i <= $month_days; $i++){
$date_str = '2013-08-'.substr('0'.$i, -2);
$group_of_days[$date_str] = $h;
// ตรวจสอบว่าเป็นวันสุดท้ายของสัปดาห์ ให้เลื่อนกลุ่ม w มีค่า 0(อาทิตย์)-6(เสาร์) ถ้าจะเลื่อนวัน ให้ปรับตัวนี้ได้
if (date('w', strtotime($date_str)) == 6)
++$h;
}
// เราได้หมายเลขกลุ่มของแต่ละวันแล้วคือ $group_of_days
// ถึงเวลาแยกกลุ่มจากข้อมูล
$week1 = $week2 = $week3 = $week4 = $week5 = array(); // คงไม่มีกลุ่ม 6 หละมั้ง 555
while($row = mysql_fetch_array($query))
${'week'.$group_of_days[$row['docdate']]}[] = $row['number'];
?>
<h1>week1</h1><?php print_r($week1);?>
<h1>week2</h1><?php print_r($week2);?>
<h1>week3</h1><?php print_r($week3);?>
<h1>week4</h1><?php print_r($week4);?>
<h1>week5</h1><?php print_r($week5);?>
ปล.เลี้ยงไอติมผมด้วยนะ :p
ผลลัพท์
week1
Array ( [0] => 1.79 [1] => 7.35 [2] => 2.91 )
week2
Array ( [0] => 8.77 [1] => 0.84 [2] => 2.63 [3] => 7.39 [4] => 1.11 [5] => 1.85 [6] => 5.78 )
week3
Array ( [0] => 0.22 [1] => 3.56 [2] => 2.24 [3] => 11.71 [4] => 9.88 [5] => 2.62 [6] => 0.42 )
week4
Array ( [0] => 8.04 [1] => 1.54 [2] => 3.85 [3] => 9.16 [4] => 13.19 [5] => 11.71 [6] => 10.39 )
week5
Array ( [0] => 9.39 [1] => 1.60 [2] => 2.36 [3] => 4.62 [4] => 4.10 [5] => 1.90 [6] => 5.40 )
http://www.pjgunner.com
|
ประวัติการแก้ไข 2013-08-20 13:37:08 2013-08-20 13:49:46
|
|
|
|
Date :
2013-08-20 13:35:52 |
By :
pjgunner.com |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 04
|