เหตุเกิดในบรรทัดที่ 15






$today = date('Y-n-j');


$yesterday = date('Y-n-j', time()-86400);



$obj = new xxx();

$obj->finance($
today);












function finance($date){


   $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($data['date']==$date){





ถ้าตรงนี้ใส่เป็นสตริงลงไปเลย if จะเป็นจริงฮะ ถ้ามาจากตัวแปรเป็นเท็จหมดเลย








         if($data['date']=='2011-12-07'){






ก็เลยลองเช็คดู (ในบรรทัดที่ 20) ว่าได้ค่าอะไรมามันถึงเป็นเท็จ




}else{


    echo $data['date'].'======='.$date;


}





ผลที่ได้มันยิ่งทำให้งงว่ามันไม่ตรงกันยังไง



2011-12-07=======2011-12-07





จากโค้ดนี้ใครที่พบข้อบกพร่องรบกวนชี้แนะด้วยฮะ



07 ธ.ค. 2554 5 959

(string)$data['date'] == $date



ถ้ายังไม่ได้ลอง trim($data['date'])





#1

ก่อนอื่น ทำไมโพสแรกมันดูเละเทะอย่างงั้นอ่าาา

เข้าเรื่อง......



$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;

     }

}





ขอบคุณ คุงอามากมายฮะ
#2

ง่า.... ยังแก้ไม่ได้เลยฮะคุงอา หาทางไปไม่เจอเลย (ตายน้ำตื้นอีกแล้ว) T-T
#3

555+++ นึกว่าได้แล้วนะนั่น



ปัญหาอาจเกิดได้จากหลายกรณี เช่น



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') เพื่อป้องกันความผิดพลาด
#4

ลองอีกวิธีครับ ใช้ GMDATE เปลี่ยนค่าทั้งคู่ใหม่ แล้วลองจับมาเทียบกันครับ 
#5
ความคิดเห็น
ไฟล์อัปโหลด ชนิด jpg, jpeg ขนาดไฟล์ไม่เกิน 1024
^