Help With PHP Calender Code


Baseband Member
I've been hitting my head against a wall trying to figure out how to make every event that is rendered on the calendar change color based on the value of "ad_type" which is stored in a mysql database that's currently connected to this calendar. It works fine with loading the events for the calendar, so i know it's connecting to the DB I just can't get it to change the color of the event based on the value in the DB.

The IF statement (which is at about line 40 in the php code i've included below) that I have that is supposed to be doing that is always executing to false, so i think the problem may have something to do with correctly getting that variable from the DB. Any help would be greatly appreciated, thank you!

/* draws a calendar */

function draw_calendar($month,$year,$events = array()){

    /* 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"> </td>';

    /* keep going with days.... */
    for($list_day = 1; $list_day <= $days_in_month; $list_day++):
        $calendar.= '<td class="calendar-day"><div style="position:relative;height:100px;">';
            /* add in the day number */
            $calendar.= '<div class="day-number">'.$list_day.'</div>';
            $event_day = $year.'-'.$month.'-'.$list_day;
            if(isset($events[$event_day])) {
                foreach($events[$event_day] as $event) {
                $query = "SELECT ad_type, DATE_FORMAT(display_date,'%Y-%m-%e') AS event_date FROM paidads WHERE display_date LIKE '$year-$month%'";
                if (($row['ad_type']) == 'sidebar'){
                      $calendar.='<div class="event" style="background-color:#FFb2b2;">'.$event['title'].'</div>';
                    elseif (($row['ad_type']) == '728x90') {
                      $calendar.='<div class="event" style="background-color:#b2b2ff;">'.$event['title'].'</div>';
                        else {
                      $calendar.='<div class="event" style="background-color:#ff99ff;">'.$event['title'].'</div>';
                    /* OLD $calendar.= '<div class="event">'.$event['title'].'</div>';*/
            else {
                $calendar.= str_repeat('<p> </p>',2);
        $calendar.= '</div></td>';
        if($running_day == 6):
            $calendar.= '</tr>';
            if(($day_counter+1) != $days_in_month):
                $calendar.= '<tr class="calendar-row">';
            $running_day = -1;
            $days_in_this_week = 0;
        $days_in_this_week++; $running_day++; $day_counter++;

    /* 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 style="background-color:#ffffff;" class="calendar-day-np"> </td>';

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

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

    /** DEBUG **/
    $calendar = str_replace('</td>','</td>'."\n",$calendar);
    $calendar = str_replace('</tr>','</tr>'."\n",$calendar);
    /* all done, return result */
    return $calendar;

function random_number() {
    return (rand() % 7);

/* date settings */
$month = (int) ($_GET['month'] ? $_GET['month'] : date('m'));
$year = (int)  ($_GET['year'] ? $_GET['year'] : date('Y'));

/* select month control */
$select_month_control = '<select name="month" id="month">';
for($x = 1; $x <= 12; $x++) {
    $select_month_control.= '<option value="'.$x.'"'.($x != $month ? '' : ' selected="selected"').'>'.date('F',mktime(0,0,0,$x,1,$year)).'</option>';
$select_month_control.= '</select>';

/* select year control */
$year_range = 7;
$select_year_control = '<select name="year" id="year">';
for($x = ($year-floor($year_range/2)); $x <= ($year+floor($year_range/2)); $x++) {
    $select_year_control.= '<option value="'.$x.'"'.($x != $year ? '' : ' selected="selected"').'>'.$x.'</option>';
$select_year_control.= '</select>';

/* "next month" control */
$next_month_link = '<span style="width:230px; padding-left:500px; text-align: right; font-size:16px; font-weight:bold;"><a href="?month='.($month != 12 ? $month + 1 : 1).'&year='.($month != 12 ? $year : $year + 1).'" class="control">Next >></a></span>';

echo '<h3 style="text-align:center; padding-right:30px;">'.date('F',mktime(0,0,0,$month,1,$year)).' '.$year.'</h3>';

/* "previous month" control */
$previous_month_link = '<span style="width:230px; padding-left: 170px; font-size:16px; font-weight:bold;"><a href="?month='.($month != 1 ? $month - 1 : 12).'&year='.($month != 1 ? $year : $year - 1).'" class="control"><<     Previous</a></span>';

/* bringing the controls together */

$controls = '<form method="get">'.$previous_month_link.''.$next_month_link.' </form>'; 

/* get all events for the given month */
$ad_type = $_POST['ad_type'];
$month = str_pad($month,2,'0', STR_PAD_LEFT);
$events = array();
$query = "SELECT ad_name AS title, ad_type, DATE_FORMAT(display_date,'%Y-%m-%e') AS event_date, ad_type FROM paidads WHERE display_date LIKE '$year-$month%'";

echo "<br/>";
$result = mysql_query($query,$db_link) or die('Cannot get Results!');
while($row = mysql_fetch_assoc($result)) {
    $events[$row['event_date']][] = $row;

echo '<div style="float:left;">'.$controls.'</div>';
echo '<div style="clear:both;"></div>';
echo draw_calendar($month,$year,$events);
echo '<br /><br />';
Yes, i can. But what that IF statement that is supposed to figuring out which entries to highlight in what color is always coming up as "False" which highlights everything in the same color which doesn't help. I've attached a screenshot of what's happening, hopefully that will help
I understand what you're trying to do, unfortunately I can't debug through the code from my end due to not having the DB etc. Your best bet is to print the variable that you're checking (ad_type) and ensure the value is one that you're expecting.
Lol exactly. If you want it done right, do it yourself and learn. Don't copy someone else's code when you might just do it better and more efficiently yourself.
Personally, I'd make something that hasn't been done to death. There are so many calendars out there that already do everything you'd want to do. Google has a nice one that integrates with Alexa.
Lol exactly. If you want it done right, do it yourself and learn. Don't copy someone else's code when you might just do it better and more efficiently yourself.
Personally, I'd make something that hasn't been done to death. There are so many calendars out there that already do everything you'd want to do. Google has a nice one that integrates with Alexa.

:facepalm: They're asking a forum for help with their code, bit different from asking for recommendations for an OTS solution.
A computer forum isn't just for hardware issues buddy.[/QUOTE]

Lol is that how you read that? Might need some more practice for better comprehension.
What was said is it might be a better choice.
I suspect that the issue is:
if, else if , else should be if, else if, else if where you are sorting out your formatting.
(and that's why if either if statement is not satisfied, (and they cannot both be satisfied since they are different) the colour choice of the last else criteria is applied, and not what you wanted.

generally to trouble shoot.
For sure I'd follow what Joe said and just print out the stuff you retrieved from the table to make sure what is in the table, and what you are getting back are the same. (also bear in mind differences in the character encoding sets can make two characters that "look" the same "be" different. -and that should show up when you print out the results returned).

you can just add it into the stuff you;re printing like this:
 if (($row['ad_type']) == 'sidebar'){
                      $calendar.='<div class="event" style="background-color:#FFb2b2;">'.$event['title']. '(' . $row['ad_type'] .')</div>';
                    elseif (($row['ad_type']) == '728x90') {
                      $calendar.='<div class="event" style="background-color:#b2b2ff;">'.$event['title']. '(' . $row['ad_type'] .')</div>';
                        else {
                      $calendar.='<div class="event" style="background-color:#ff99ff;">'.$event['title']. '(' . $row['ad_type'] .')</div>';

something else...

personally I hate, if, else if, else nesting like that. especially inline with the stuff that you're actually trying to print out.

I'd prefer either to do all checking up front, and then you have everything setup before printing anything to screen.

so (either) set a variable to nothing, then change it, and if at the end it is not changed, then set to a default.
$format = "0";
if ($var = 1) { $format = #FFb2b2; }
if ($var = 2) { $format = #b2b2ff; }
if ($format = "0") { $format = #ff99ff; }
or start off wither it set to whatever the default is, and then change it if some condition is true.
$format = "#ff99ff";
if ($var = 1) { $format = #FFb2b2; }
if ($var = 2) { $format = #b2b2ff; }

then you're just doing
$row['ad_type']) == 'sidebar'){
                      $calendar.='<div class="event" style="background-color: . ' $format . ';">'.$event['title']. '(' . $row['ad_type'] .')</div>';
rather than all that nested if stuff. when it comes to the actual printing to screen.

or, (more preferably) use a switch/case statement.

PHP: switch - Manual

Technician, if you cannot help, and do not know the subject area, then just don't comment.
Top Bottom