เหตุเกิดในบรรทัดที่ 15
$today = date('Y-n-j');
$yesterday = date('Y-n-j', time()-86400);
$obj = new xxx();
$obj->finance($today);
$this->result = $this->query();
if(!$this->result){
$this->_Close();
echo '<div id="message"><h1>ไม่สามารถเชื่อมต่อฐานข้อมูลได้</h1></div>';
exit();
}
$rows = mysql_num_rows($this->result);
if($rows > 0){
while($data = mysql_fetch_array($rows)){
if($data['date']==$date){
$price = $price + $data['price'];
$cost = $cost + $data['cost'];
$profit = $profit + $data['profit'];
}else{
echo $data['date'].'======='.$date;
}
}
$jobToday = $rows;
}else{
return '<div class="noData"><b>ยังไม่มีรายการใดๆ</b></div>';
}
$this->output = '<div class="revenue"><b>'.$price.'</b></div>';
$this->output .= '<div class="expenditure"><b>'.$cost.'</b></div>';
$this->output .= '<div class="profit"><b>'.$profit.'</b></div>';
$this->output .= '<div class="job"><b>'.$jobToday.'</b></div>';
return $this->output;
}
จากโค้ดด้านบนปัญหาในบรรทัดที่ 15 ฮะ
ถ้าตรงนี้ใส่เป็นสตริงลงไปเลย if จะเป็นจริงฮะ ถ้ามาจากตัวแปรเป็นเท็จหมดเลย
if($data['date']=='2011-12-07'){
ก็เลยลองเช็คดู (ในบรรทัดที่ 20) ว่าได้ค่าอะไรมามันถึงเป็นเท็จ
}else{
echo $data['date'].'======='.$date;
}
ผลที่ได้มันยิ่งทำให้งงว่ามันไม่ตรงกันยังไง
2011-12-07=======2011-12-07
จากโค้ดนี้ใครที่พบข้อบกพร่องรบกวนชี้แนะด้วยฮะ
ถ้ายังไม่ได้ลอง trim($data['date'])
เข้าเรื่อง......
$data['date'] == $date;
trim($data['date']) == $date;
trim($data['date']) == trim($date);
ยังคงได้ผลลัพภ์แบบเดียวกันเลย เป็นเท็จหมด
(ปล.ในฐานข้อมูล ฟิลด์ date เป็นชนิด date)
เปลี่ยนแปลงโค้ดเล็กน้อยดังนี้
// บางส่วนของตัวแปรที่เตรียมไว้เรียกใช้
$this->ToDay = date('Y-n-j');
$this->Yesterday = date('Y-n-j', time()-86400);
$this->Last7Day = date('Y-n-j', time()-604800);
$this->Last15Day = date('Y-n-j', time()-1296000);
..............
..............
..............
function statistics(){
$result = mysql_query("SELECT * FROM customer");
if(!$result){
$this->_Close();
$output = '<div id="message"><h1>ไม่สามารถเชื่อมต่อฐานข้อมูลได้</h1></div>';
return $output;
}
if(mysql_num_rows($result) > 0){
while($field = mysql_fetch_array($result)){
if(trim($field['date'])==$this->ToDay){
$price = $price + $field['price'];
$cost = $cost + $field['cost'];
$profit = $profit + $field['profit'];
$job = $job++;
}else{
$noData=true;
}
}
if($noData==true){
$output = '<div class="noData"><b>ยังไม่มีรายการใดๆ</b></div>';
}else{
$output = '<div class="revenue"><b>'.$price.'</b></div>';
$output .= '<div class="expenditure"><b>'.$cost.'</b></div>';
$output .= '<div class="profit"><b>'.$profit.'</b></div>';
$output .= '<div class="job"><b>'.$job.'</b></div>';
}
..............
..............
..............
$this->_Close();
return $output;
}
}
ขอบคุณ คุงอามากมายฮะ
ปัญหาอาจเกิดได้จากหลายกรณี เช่น
1.ชนิดข้อมูลไม่ตรงกัน โดยปกติแล้ว ข้อความที่มาจาก database ในรูปวันที่ อาจต้องแปลงเป็น string ก่อน เช่น (string)$result['date'] และอาจต้องตัดช่องว่างที่องไม่เห็นออกด้วยก็ดี ด้วย trim
ปัญหาด้านบน อาจใช้วิธีตรวจสอบด้วย strlen() ก็ได้ ว่ามันมีค่าอย่างที่เห็นหรือเปล่า
2.อาจมีปัญหาที่การแปลงข้อมูล โดยปกติแล้ว ข้อมูลที่เก็บใน db ที่ตำแหน่ง วันที่ และ เดือน จะมี 2 หลักเสมอ เช่น 01 02 แต่ดูจากคำสั่งวันที่ ที่ใช้ ใช้เป็น Y-n-j ซึ่งจะถูกตัดตัวเลข 0 ออก ซึ่งแน่นอน จะทำให้การตรวจสอบ string ผิดพลาด
ในกรณีที่ทำงานกับวันที่บน MySQL ควรใช้ Y-m-d เสมอครับ หรือ date('d'), date('m') เพื่อป้องกันความผิดพลาด