Jestem debugowania kalendarza rezerwacji sali konferencyjnej, który został złożony przez kogoś, który już ze mną nie pracuje. To był koszmar, ponieważ było w nim tak wiele problemów, ale mam problem z ustaleniem przyczyny tego ostatniego błędu. Kalendarz sprawdza, czy pokoje zostały już zarezerwowane w określonych godzinach i czy nie mają problemu z rezerwacją w odpowiednim czasie, ale jeśli ktoś spróbuje zarezerwować ten sam pokój godzinę lub krócej po opuszczeniu pokoju po przesunięcie do lub z DST, pokazuje pokój jako zarezerwowany jeszcze. Przykład:Funkcja w kodzie I debugowanie wydaje się nie uwzględniać zmian do iz DST
- Użytkownik widzi, że pokój jest zarezerwowany na 29 listopada od 9:00 do 10:00.
- Użytkownik próbuje następnie zarezerwować pokój 29 listopada od 10:30 do 12:00.
- Kalendarz anuluje to drugie żądanie i informuje użytkownika, że pokój jest już zarezerwowany.
Należy zauważyć, że tak się nie stanie w żadnym momencie przed przejściem na DST (4 listopada). Oto funkcja, która określa, czy pokój jest dostępny:
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;
}
Wszystkie moje znaczników czasu do tej pory są w UTC i zauważam zmienna $odate
faktycznie nigdy wystąpienia w dowolnym miejscu, ale nie byli w stanie określić, jaką wartość przesłać, aby offset działał poprawnie. Jeśli uda mi się ustalić, jakiego rodzaju dnia chce, powinienem móc odpracować resztę.
wygląda mi $ Odate jest wyłączony, co oznacza wezwanie do DateTime jest przekazywana zerowy, który podejrzewam (jeśli działa w ogóle) musi być przetwarzany jako domyślny "teraz". Możesz przetestować DST, używając daty ("I"), a następnie odpowiednio zrównoważyć swoje przesunięcia. – Gavin
Czy próbowałeś włączyć wszystkie ostrzeżenia na swoim serwerze? tj. 'error_reporting (-1); ini_set ('display_errors', 'On'); ' –