简体   繁体   中英

php calender goes to march 2013 after february 2012

I have php mysql calneder for my hotel room booking system. but it shows a strange problem I dont know why. it does not go after 2013 year and and after february 2012 it directly goes to march 2013.

Another problem is I make the calender to show if a room is booked or not. if I book room from 23-25 it marks booked 24 and 25 wheather it should be 23 and 24. here are the codes of the calender:

function.php

     function draw_calendar($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">'.$list_day.'</div>';

        /** QUERY THE DATABASE FOR AN ENTRY FOR THIS DAY !!  IF MATCHES FOUND, PRINT THEM !! **/
        $calendar.= getAllRooms($list_day,$month,$year);

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

 }

index.php for prev next function:

     $prev_month = (($month - 1) == 0) ? 12 : $month -1 ;
        $prev_year = ($prev_month == 12) ? $year - 1 : $year;
     ?>
   <h2 class="calender">
     <a href="index.php?month=<?php echo $prev_month ?>&year=<?php echo $prev_year ?>" class="prev"> &gt;&gt;</a>


    <span class="month"><?php echo  date('F',mktime(0,0,0,$month,1,$year)).' '.$year.''; ?></span>
    <?php 
        $next_month = (($month + 1) == 13) ? 1 : $month + 1 ;
        $next_year  = ($prev_month == 1) ? $year + 1 : $year;
     ?>
     <a href="index.php?month=<?php echo $next_month ?>&year=<?php echo $next_year ?>" class="next"> 
        &lt;&lt;</a>

Thanks in advance to all.

I have only looked at the second snippet, but I'm pretty sure this is the problem:

$next_year  = ($prev_month == 1) ? $year + 1 : $year;

In case of February, $prev_month is set to 1, so your $next_year becomes $year + 1 .

I think all you have to do, is change that line to:

$next_year  = ($month == 12) ? $year + 1 : $year;

I can't tell exactly what the error is in your code, but I'm pretty sure it has to do with this year - 2012 - being a leap year.

Make sure your variables such as $days_in_month have an option for 29 days in February.

Should it be this ?

<?php  
    $next_month = (($month + 1) == 13) ? 1 : $month + 1 ; 
    $next_year  = ($prev_month == 12) ? $year + 1 : $year; 
 ?> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM