ระบบ แสดง ระยะเวลา ที่ได้จาก วันที-เวลาปัจจุบัน ลบ ด้วย วันที่-เวลา ที่เราบันทึกไว้ แบบ Real-time
Code (PHP)
$unixtime = strtotime( $row['alertDate'] );
echo "<tr><td class='td_time' id='r_$row[id]' data-time='$unixtime' >$row[alertDate]</td><td ..........></tr>";
Code (JavaScript)
<script>
//setTimeout("server_date('<?=$current_server_time?>')",1000);
setInterval( chk_time(), 1000 * 10); // 10 seconds
function chk_time(){
var td = document.getElementByClassName('td_time');
var ln=td.length;
var cur_date=new Date();
for( var i=0; i<ln; i++){
var alertDate=new Date( td.item(i).getAttribute('data-time') );
var timeDiff = Math.abs(cur_date.getTime() - alertDate.getTime());
var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
var diffHour = ?;
var diffMin = ?;
td.item(i).parent.childnodes[2].innerHTML=diffDay +' วัน ' + diffHour + ' ชั่วโมง' ........
// ที่เหลือก็ลอง คิดดูนะครับ จะหา ชั่วโมง นาที ยังไง
}
}
</script>
และถ้าเป็น 0 ชั่วโมง จะให้แสดงแบบไหน
Date :
2015-04-11 20:06:08
By :
Chaidhanan
ขอบคุณพี่ Chaidhanan มากนะครับ
รบกวนพี่ๆทุกท่าน ขอถามเพิ่มหน่อยครับ การกำหนด id='r_$row[id]' และ $row[alertDate] ให้กำหนดอะไรหรอครับ มิอใหม่ และ ไม่เคยใช้ td class อะครับ
อีกอย่าง Code ที่พี่ให้มา ดึงเวลา แรก จาก Server ใช้ไหมครับ
ขอบคุณมากนะครับ
ประวัติการแก้ไข 2015-04-11 21:24:09 2015-04-11 22:30:08
Date :
2015-04-11 21:21:57
By :
jojoecake
แฮะๆ ผมนึกว่า พอเข้าใจคำสั่ง php/mysql ในระดับหนึ่งแล้ว เพราะเห็น ตัดแค่ บางส่วนของโปรแกรมมา
เลยทำตัวอย่างให้แค่นั้นนะครับ
ลองดูตัวอย่างการคิวรี่เพิ่มเติมครับ
ฟีลด์ "รับแจ้ง" และ "สถานะ" ก็แก้ให้ถูกต้องเองนะครับ ผมไม่รู้ชื่่อมัน
ชื่อ ตารางด้วยครับ "table"
Code (PHP)
<table>
<?php
$sql = "select no, `รับแจ้ง` as alertDate, `สถานะ` as status from table";
$rs=mysql_query( $sql ) or die ( mysql_error()."<br>[[$sql]]");
while( $row=mysql_fetch_assoc($rs)){
$date = new DateTime($row['alertDate'], new DateTimeZone('Asia/Bangkok')); // set ตามจริงตาม การเก็บข้อมูลใน database
$timezone=$date->format('Y-m-d H:i:sP');
//$unixtime = strtotime( $row['alertDate'] );
echo "
<tr>
<td class='td_time' id='r_$row[no]' data-time='$timezone' >$timezone</td>
<td></td>
<td>$row[status]</td>
</tr>";
}
?>
</table>
สำหรับ class='td_time' ของ HTML
td_time คือชื่อที่ไว้ อ้างอิง จากคำสั่ง document.getElementsByClassName('td_time');
ถ้าไม่มีชื่อคลาส เราก็ต้องเอาชื่อ id ไม่มีชื่อ id เราก็ต้องใช้ชื่อ tag ต้องหามาสักอันให้เราอ้างอิงได้ครับ
สำหรับ เวลา การทำงาน จาก function chk_time() ใน javascript
ใช้เวลาจากเครื่อง client ครับ
การทำแบบ realtime โดยใช้ javascript เวลาจะเป็นของฝั่ง client
เวลาที่ส่งให้ client ก็ต้อง แปลงมาให้ตรง กับ client ด้วยนะครับ
Date :
2015-04-12 09:51:12
By :
Chaidhanan
พี่่ครับ แบบนี้ถ้า Client แก้เวลา เครื่องของเขา ระยะเวลาดำเนินการ มันก็เปลี่ยนไปใช่ไหม >> มันมีผลต่อ ค่าปรับนะครับ
ถ้าสมุมติว่า เราดึงเวลาจาก server ตอนแรก แล้วให้ java บวก เพิ่มไปเรื่อยๆ แบบ นาฬิกา
เมื่อ จะดู ระยะเวลาดำเนินการ ก็ให้ นำ เวลาแบบ นาฬิกา มาหักลบ กับเวลาแจ้ง แบบนี้ จะปลอดภัยกว่าไหมอะครับ
คือ เวลาที่ Client ไม่มีผล และ ก็ ไม่ทำให้ Server ทำงานหนักเกินไปด้วย
ปม พึ่งหัดเขียนได้ 1 เดือนเองครับ ^^
แฮะๆ ขอบคุณมากนะครับ รบกวนด้วยครับ
Date :
2015-04-12 10:25:04
By :
jojoecake
โปรแกรมที่ผมทำเป็นตัวอยา่งไว้ เป็นการ ทำตามความคิด คห 4 เลยล่ะครับ
คิวรี่เวลาจากฝั่ง server ครั้งเดียวครับ
ส่่วนเวลาจะเสียค่าปรับจริง เราต้องใช้ เวลาจาก database ในการคำนวณครับ
ถ้า user จะโกงหน้าจอ อยากทำอะไรฝั่ง client ก็ทำไป
แต่เวลา เสียเงิน เราเอาแค่ id ไปคิวรี่จาก database จริงครับ
ไม่ต้องให้ client ส่งเวลา หรือจำนวนเงิน ไป ส่วนนั้นต้อง คำนวณจาก server ครับ
ใช้เวลาของ server ในการคำนวณ ค่าปรับ ไม่ใช้เวลา ของ client ในการคำนวณครับ
ใช้ javascript ฝั่ง client Alert แค่แจ้งเตือนครับ
โดยไม่ต้องส่ง request ไปให้ sever ทำงานหนัก แค่แจ้งเตือนโดยใช่เหตุ
Date :
2015-04-12 11:22:49
By :
Chaidhanan
รบกวน ดูให้อีกรอบได้ไหมครับ ไม่ได้อะครับ มันยังไม่ขึ้นคำว่า ทดสอบ ในตารางเลยอะครับ ว่างเปล่า
ขอบคุณครับ
Code (JavaScript)
<script>
setInterval( chk_time(), 1000 * 10); // 10 seconds
function chk_time(){
var td = document.getElementByClassName('td_time');
var ln=td.length;
var cur_date=new Date();
for( var i=0; i<ln; i++){
var alertDate=new Date( td.item(i).getAttribute('data-time') );
var timeDiff = Math.abs(cur_date.getTime() - alertDate.getTime());
var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
td.item(i).parent.childnodes[2].innerHTML="ทดสอบ";
}
}
</script>
Code (PHP)
$sql = "SELECT * FROM maintb ORDER BY no DESC";
$r = mysqli_query($link,$sql);
if (!$r) {echo mysqli_error($link);}
else if (mysqli_num_rows($r)==0) {echo "ไม่มีข้อมูลในตาราง maintb";}
else {
$var = 0;
while($data = mysqli_fetch_array($r)) {
$var = $var+1;
$date = new DateTime($data['tminf'], new DateTimeZone('Asia/Bangkok'));
$timezone=$date->format('Y-m-d H:i:s');
?>
<tr><td align="center"><?php echo $var; ?></td>
<?php echo "<td class='td_time' data-time='$timezone' >$timezone</td>
<td></td>
<td>$data['sts']</td></tr>"; ?>
Date :
2015-04-12 13:00:41
By :
jojoecake
บันทัดที่ 4 ่javascript ขอโทษครับ พิมพ์ ตก s
var td = document.getElementsByClassName('td_time');
Date :
2015-04-12 17:23:00
By :
Chaidhanan
รบกวนพี่อีกรอบ นะครับ จนปัญหา จริงๆๆๆ นี่ Code เต็มๆๆๆ แบบไม่ตัด นะครับ รบกวนด้วยนะครับ
ผมไม่รู้ java ด้วยอะ คือ .parent.childnodes ใช้ยังไง
Code (JavaScript)
<script language="javascript">
setInterval( chk_time(), 1000 * 10); // 10 seconds
function chk_time(){
var td = document.getElementsByClassName('td_time');
var ln=td.length;
var cur_date=new Date();
for( var i=0; i<ln; i++){
var alertDate=new Date( td.item(i).getAttribute('data-time') );
var timeDiff = Math.abs(cur_date.getTime() - alertDate.getTime());
var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
td.item(i).parent.childnodes[2].innerHTML="ทดสอบ";
}
}
</script>
Code (PHP)
<form>
<table border="1" cellspacing="0" cellpadding="5" bordercolorlight="#CCCCCC" bordercolordark="#FFFFFF" id="tbExp">
<tr>
<td align="center">No.</td>
<td align="center">วันที่-เวลา รับแจ้ง</td>
<td align="center">Service No.</td>
<td align="center">ผลกระทบต่ออุปกรณ์</td>
<td align="center">ระยะเวลาดำเนินการ</td>
<td align="center">สถานะ</td>
<td align="center">เส้นทาง</td>
<td align="center">ผลกระทบต่อลูกค้า</td></tr>
<?php
$sql = "SELECT * FROM maintb ORDER BY no DESC";
$r = mysqli_query($link,$sql);
if (!$r) {echo mysqli_error($link);}
else if (mysqli_num_rows($r)==0) {echo "ไม่มีข้อมูลในตาราง maintb";}
else {
$var = 0;
while($data = mysqli_fetch_array($r)) {
$var = $var+1;
$date = new DateTime($data['tminf'], new DateTimeZone('Asia/Bangkok'));
$timezone=$date->format('Y-m-d H:i:s');
?>
<tr><td align="center"><?php echo $var; ?></td>
<?php echo "<td class='td_time' data-time='$timezone'>$timezone</td>"; ?>
<td align="center"><?php echo $data['srvno']; ?></td>
<td align="left"><?php echo $data['pdt']; ?></td>
<td align="left">แสดงระยะเวลาในนี้อะคับพี่</td>
<td align="center"><?php echo $data['sts']; ?></td>
<td align="center">-</td>
<td align="center"><?php echo $data['ctm']; ?></td>
</tr>
<?php
}
echo "</table>";
}
mysqli_close($link);
?>
</form>
Date :
2015-04-12 18:28:29
By :
jojoecake
น่าจะช่วยตัวเองบ้าง ด้วยการค้นหาใน google ก็จะเจอ
ลุงแก ตอบได้หลักการและวิธีการ แต่คำสั่่งเพี้ยนบ่อยๆ ไม่รู้ ตั้งใจหรือเปล่า ฮ่าๆ
parent ต้องใช้ parentNode นะครับ
Date :
2015-04-12 19:09:02
By :
มั่วๆ ไป
ได้แล้วครับ ขอบคุณพี่ Chaidhanan และทุกท่านๆ มากนะครับ
ผมจะเก็บไว้เป็นตัวอย่าง และบทเรียนสอนตัวเองต่อๆไปครับ
Date :
2015-04-12 21:00:55
By :
jojoecake
Load balance : Server 02