2012-01-20 101 views
0

我有一个php MySql预订日历,它显示了是否按日期预订房间。问题是,它显示了错误的信息。例如,如果我预订了5-6,它应该标记为第五个红色,这意味着它在5日被预订了。它显示6日但6点,12点00分房间将是免费的。另一个例子:如果我预订23-25,它显示24,25为预订,但它应该显示23-25,不知道问题在哪里。php mySQL房间预订日历显示预订日期错误

下面是代码:

function getAllRooms($date,$month,$year) 
{ 
    global $db; 
    $where = ' '; 
    if ($_GET['room_type'] != '') { 
     $where .= " HAVING room_type = '".$_GET['room_type']."'"; 
    } 

    $sql = "SELECT room_type 
      FROM 
       room 
      GROUP BY 
       room_type 
      $where 
      "; 
    /*echo $sql; 
    exit;*/ 
    $result = $db->Execute($sql);; 
    $room = ''; 
    while (!$result->EOF) { 
     $qs  = '?room_type='.$result->fields('room_type').'&month='.$month.'&year='.$year; 
     $total = get_total_rooms_by_type($result->fields('room_type'),$date,$month,$year); 
     $room .= 
     '<div class="'.$result->fields('room_type').'"> 

      <a href="'.BASE_URL.'room_detail.php'.$qs.'"> 
       '.$result->fields('room_type').' ('.$total.') 
      </a> 
     </div>'; 
     $result->MoveNext(); 
    } 
    $result->Close; 
    return $room; 
} 
function get_total_rooms_by_type($room_type,$date,$month,$year) 
{ 
    global $db; 
    $_newdate = $year.'-'.$month.'-'.$date; 
    $sql   = "SELECT room_id FROM room where room_type = '$room_type' "; 
    $room_results = $db->Execute($sql); 
    $room_ids  = array(); 
    while (!$room_results->EOF) { 
     $room_ids[] = $room_results->fields('room_id'); 
     $room_results->MoveNext(); 
    } 
    $room_results_str = implode(',',$room_ids); 
    $where = ' where 1 = 1 '; 
    $available = 1; 
    if ($_GET['booking_status'] == '1') { 
     $where .= ' and (booking_status = 1 or booking_status = 2)'; 
     $available = 0; 
    } else if ($_GET['booking_status'] == '2') { 
     $where .= ' and (booking_status = 2)'; 
     $available = 0; 
    } 
    $sql = "select count(room_id) from bookings 
      $where 
       and checkin <= '$_newdate' 
       and '$_newdate' <= checkout 
       and room_id in ($room_results_str) 
      "; 
    if ($available == 0) { 
     return $db->GetOne($sql); 

    } else { 
     return count($room_ids) - $db->GetOne($sql); 
    } 


} 
function draw_calendar_room($month,$year){ 

    /* draw table */ 
    $calendar = '<table cellpadding="0" cellspacing="0" class="calendar">'; 

    /* table headings */ 
    $headings = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'); 
    $calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>'; 


    /* days and weeks vars now ... */ 
    $running_day = date('w',mktime(0,0,0,$month,1,$year)); 
    $days_in_month = date('t',mktime(0,0,0,$month,1,$year)); 
    $days_in_this_week = 1; 
    $day_counter = 0; 
    $dates_array = array(); 

    /* row for week one */ 
    $calendar.= '<tr class="calendar-row">'; 

    /* print "blank" days until the first of the current week */ 
    for($x = 0; $x < $running_day; $x++): 
     $calendar.= '<td class="calendar-day-np">&nbsp;</td>'; 
     $days_in_this_week++; 
    endfor; 

    /* keep going with days.... */ 
    for($list_day = 1; $list_day <= $days_in_month; $list_day++): 
     $calendar.= '<td class="calendar-day">';; 

      $calendar.= '<div class="day-number" style=" padding:5px 5px 45px;background-color:'.getRoomColor($list_day,$month,$year).'">'.$list_day.'</div>'; 

      /** QUERY THE DATABASE FOR AN ENTRY FOR THIS DAY !! IF MATCHES FOUND, PRINT THEM !! **/ 


     $calendar.= '</td>'; 
     if($running_day == 6): 
      $calendar.= '</tr>'; 
      if(($day_counter+1) != $days_in_month): 
       $calendar.= '<tr class="calendar-row">'; 
      endif; 
      $running_day = -1; 
      $days_in_this_week = 0; 
     endif; 
     $days_in_this_week++; $running_day++; $day_counter++; 
    endfor; 

    /* finish the rest of the days in the week */ 
    if($days_in_this_week < 8): 
     for($x = 1; $x <= (8 - $days_in_this_week); $x++): 
      $calendar.= '<td class="calendar-day-np">&nbsp;</td>'; 
     endfor; 
    endif; 

    /* final row */ 
    $calendar.= '</tr>'; 

    /* end the table */ 
    $calendar.= '</table>'; 

    /* all done, return result */ 
    return $calendar; 
} 
function getRoomColor($date,$month,$year) 
{ 
    global $db; 
    $where = ' '; 
    if ($_GET['room_id'] != '') { 
     $room_id = $_GET['room_id']; 

    } else { 
     $sql = "SELECT room_id 
         FROM 
          room 
         WHERE 
          room_type = '".$_GET['room_type']."' order by room_number asc 
         "; 
     $room_id = $db->GetOne($sql);; 
    } 
    $_newdate = "$year-$month-$date"; 
    $sql = "SELECT booking_status 
      FROM 
       bookings 
      where 
       checkin <= '$_newdate' 
       and 
       '$_newdate' <= checkout 
       and 
       room_id = '$room_id' 
      "; 
    /*echo $sql; 
    exit;*/ 
    $result = $db->GetOne($sql);; 
    if ($result == 1) { 
     return '#FF0'; 
    } else if ($result == 2) { 
     return '#F00'; 
    } else { 
     return '#64C733'; 
    } 

} 
+0

我想$其中 和签<= '$ _newdate' 和 '$ _newdate'<=结账 这个SQL没有得到正确的结果。 –

回答

1

它实际上是时间不匹配的问题。在分贝我设置日期时间作为签入和结帐,但我检查sql与日期检索数据没有时间考虑。

现在还说:

$_newdate = $year.'-'.$month.'-'.$date . " " . "12:00:00"; 

工作就像一个魅力。 !!!!

+0

伟大的工作肯定 – humphrey

1

对不起,没有太多的答案,但..

那么我可以通过你的代码,但我相信你可以自己解决这个问题,因为它的 我相信只是逻辑错误。 你可以做的是打印从开始的所有结果变量,并通过它们调试 。这样你就会知道哪条线给出了问题。

然后,您可以尝试自己解决它或在此处询问更精确的问题。

祝你好运! :)

+0

因为我不善于SQL这就是为什么我没有得到错误导致的东西。 –

+0

只需打印输出值并获取确切的错误行... 获取确切的SQL或变量,这导致问题,我们可以从那里移动 。 考虑一下你的第一个sql培训:D P.S. - 只是一个问题..价值问题..日期被存储在数据库中是正确的?或其检索问题? –

+0

它的检索问题,如果5间客房预订5日至6日在逻辑5应该预订一晚,但它显示第6作为预订第5空闲。 –