Tôi đang gỡ lỗi lịch đặt phòng hội nghị do một người không còn làm việc với tôi nữa. Đó là một cơn ác mộng vì có rất nhiều điều sai trái với nó, nhưng tôi đang gặp khó khăn trong việc tìm ra chính xác nguyên nhân gây ra lỗi cuối cùng này. Lịch kiểm tra xem các phòng đã được đặt vào một số thời điểm nhất định và không có vấn đề hiển thị như được đặt vào đúng thời điểm, nhưng nếu ai đó cố gắng đặt cùng một phòng một giờ hoặc ít hơn sau khi phòng trống sau chuyển đến hoặc từ DST, nó cho thấy phòng như được đặt vẫn còn. Ví dụ:Chức năng trong mã Tôi đang gỡ lỗi dường như không tính đến các thay đổi đến và đi từ DST
- Người dùng thấy phòng được đặt trước ngày 29 tháng 11 từ 9 giờ sáng đến 10 giờ sáng.
- Người dùng sau đó cố gắng đặt phòng vào ngày 29 tháng 11 từ 10:30 sáng đến 12:00 tối.
- Lịch hủy yêu cầu thứ hai này và thông báo cho người dùng rằng phòng đã được đặt.
Cần lưu ý rằng điều này không xảy ra bất kỳ lúc nào trước khi chuyển sang DST (ngày 4 tháng 11). Dưới đây là những chức năng mà quyết định nếu căn phòng có sẵn:
function calCheck($starttime, $endtime, $cal_name, $cat_id, $myDB, $myHost, $myUser, $myPass) {
$timezone = 'America/Denver';
date_default_timezone_set ($timezone);
$dset = new DateTime($odate, new DateTimeZone($timezone));
$dset2 = $dset->getOffset();
//$starttime = $starttime + 1;
//$endtime = $endtime - 1;
$starttime = $starttime - $dset2 + 1;
$endtime = $endtime - $dset2 - 1;
$starttime = $starttime;
$endtime = $endtime;
//echo $starttime .'</br>'. $endtime . '</br>';
$db = new myDB($myDB, $myHost, $myUser, $myPass);
$db->myDB_Connect();
//echo 'calcheck</br>';
$ck_query = 'SELECT * FROM vw_cal_chk
WHERE (stime < '. $starttime . ' AND etime > ' . $starttime . ') and Calendar = "' . $cal_name . '" and cat_id = "' .$cat_id . '"
OR (stime < ' . $endtime . ' AND etime > ' . $endtime . ') and Calendar = "' . $cal_name . '" and cat_id = "' .$cat_id . '"
OR (stime >= '. $starttime . ' AND etime < ' . $endtime .') and Calendar = "' . $cal_name . '" and cat_id = "' .$cat_id . '"';
$ck_result = $db->myQuery($ck_query);
$num = mysql_num_rows($ck_result);
//echo $ck_query . '</br>' . $num;
if ($num >> 0){
$avail = 1;
} else {
$avail = 0;
}
return $avail;
}
Tất cả các timestamps của tôi đến thời điểm này là ở tính theo giờ UTC và tôi nhận thấy sự biến $odate
là thực sự không bao giờ instantiated bất cứ nơi nào, nhưng tôi đã không thể xác định những gì giá trị để vượt qua nó để cho bù đắp để hoạt động chính xác. Nếu tôi có thể tìm ra loại ngày mà nó muốn, tôi sẽ có thể làm việc còn lại.
trông giống như $ odate là không được đặt, có nghĩa là cuộc gọi đến DateTime được truyền null mà tôi nghi ngờ (nếu nó hoạt động ở tất cả) phải được xử lý làm mặc định 'hiện tại'. Bạn có thể kiểm tra cho DST sử dụng ngày ('I') và sau đó bù đắp bù trừ của bạn cho phù hợp. – Gavin
Bạn đã thử bật tất cả cảnh báo trên máy chủ chưa? tức là 'error_reporting (-1); ini_set ('display_errors', 'On'); ' –