【问题标题】:Why are no events showing on calendar after successful query?为什么查询成功后日历上没有显示事件?
【发布时间】:2016-12-19 17:45:15
【问题描述】:

像我在这里读到的许多其他人一样,我正在尝试使用 Davild Walsh's calendar tutorial 的更新形式制作基于 php/sql 的事件日历。

看来我可以很好地连接到数据库,甚至可以填充 $bookings 和 $events 数组。但是我的日历网格中没有显示任何事件。有人可以帮我看看我错过了什么以及为什么日历没有填充事件吗?在这一点上,我什至没有做一个复杂的选择语句......我只是选择了所有事件......成功......所以我认为它必须是一些小事情,一些微小的细节丢失或扔掉了东西。任何帮助都感激不尽。参考代码如下:

使用 PDO 成功连接数据库,但发布以供参考:

 try {
 $bdd = new PDO('mysql:host=*****;dbname=*****', '*****', '***');
 } catch(Exception $e) {
  exit('Unable to connect to database.');
 }

像这样查询数据库:

$events = array();
 $query = "SELECT * FROM oipevents";
 try {
 $result = $bdd->query($query) or die(print_r($bdd->errorInfo()));
 } catch (Exception $e) {
     echo "no results";
     exit;
 }
 $bookings = $result->fetchAll(PDO::FETCH_ASSOC);

 foreach ($bookings as $row) {
     $events[$row['event_date']][] = $row;
 } 

然后使用以下代码绘制日历(注意,带有控件的日历显示得很好,只是没有显示任何事件):

/* draws a calendar */
function draw_calendar($month,$year,$events = array()){

    /* draw table */
    $calendar = '<div class="cal_table">';

    /* table headings */
    $headings = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
    $calendar.= '<div class="cal_table_cell theme_blue_secondary">'.implode('</div><div class="cal_table_cell theme_blue_secondary">',$headings).'</div></div><!-- #cal_table -->';

    /* 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.= '<div class="cal_table">';

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

    /* keep going with days.... */
    for($list_day = 1; $list_day <= $days_in_month; $list_day++):
        $calendar.= '<div class="cal_table_cell"><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) {
                //  $calendar.= '<div class="event">'.$event['title'].'</div>';
                    $calendar.='<div class="event"><a href="?event='.$event['title'].'">'.$event['start'].' - '.$event['tijdtot'].'</span></a></div>';
                }
            }
            else {
                $calendar.= str_repeat('',2);
            }
        $calendar.= '</div></div><!-- #cal_table_cel -->';
        if($running_day == 6):
            $calendar.= '</div><!-- #cal_table -->';
            if(($day_counter+1) != $days_in_month):
                $calendar.= '<div class="cal_table">';
            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.= '<div class="cal_table_cell">&nbsp;</div><!-- #cal_table_cell -->';
        endfor;
    endif;

    /* final row */
    $calendar.= '</div><!-- #cal_table -->';



    /** DEBUG **/
    $calendar = str_replace('</div>','</div>'."\n",$calendar);


    /* all done, return result */
    return $calendar;
}

function random_number() {
    srand(time());
    return (rand() % 7);
}

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

    if($month < 10){
        $month = '0'.$month;
    }
/* 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 = '<a href="?month='.($month != 12 ? $month + 1 : 1).'&year='.($month != 12 ? $year : $year + 1).'" class="control">Next Month &gt;&gt;</a>';

/* "previous month" control */
$previous_month_link = '<a href="?month='.($month != 1 ? $month - 1 : 12).'&year='.($month != 1 ? $year : $year - 1).'" class="control">&lt;&lt;    Previous Month</a>';


/* bringing the controls together */
$controls = '<form method="get">'.$select_month_control.$select_year_control.'&nbsp;<input type="submit" name="submit" value="Go" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$previous_month_link.'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$next_month_link.' </form>';


echo '<h2 style="float:left; padding-right:30px;">'.date('F',mktime(0,0,0,$month,1,$year)).' '.$year.'</h2>';
echo '<div style="float:left;">'.$controls.'</div>';
echo '<div style="clear:both;"></div>';
echo draw_calendar($month,$year,$events);
echo '<br /><br />'; 

有人知道为什么这些活动没有出现在日历上吗? 当我执行 print_r($bookings) 和 print_r($events) 时,我可以看到填充的数组——那么发生了什么?我也应该发布数组以供参考吗?好的 ... 来自 print_r($bookings) 的 $bookings 数组:

数组 ( [0] => 数组 ( [id] => 1 [title] => 测试事件 [event_date] => 2016-07-27 09:30:00 [结束] => 2016-07-27 10:00:00 [url] => http://www.auburn.edu [allDay] => false [description] => 测试事件 [部门] => 校友 ) ... )

来自 print_r($events) 的事件数组:

数组 ( [2016-07-27 09:30:00] => 数组 ( [0] => 数组 ( [id] => 1 [title] => 测试活动 [event_date] => 2016-07-27 09:30:00 [end] => 2016-07-27 10:00:00 [url] => http://www.auburn.edu [allDay] => false [描述] => 测试事件 [部门] => 校友 ) ) .. )

请帮忙,谢谢!

【问题讨论】:

  • 你证明MySQL没有错吗?如果是这样,请删除该标签。
  • 如果你转储函数输出会发生什么? print_r(draw_calendar($month,$year,$events));
  • 好问题 - 它绘制日历......没有事件。德普。
  • 嗯,另外,我不确定我是否已经证明 Mysql 没有缺陷 - 我的意思是,正在填充数组,但可能不正确,或者我没有处理在 fetch 或 foreach 或行分配中使用数据。但我还是把标签去掉了——我认为问题出在 php 上。
  • 嗯,正在考虑设置它...使用该站点连接到数据库时出现问题...但如果我设置它,我会发布一个链接。

标签: php pdo calendar


【解决方案1】:

这似乎是一个错误的阵列访问问题。您的$events 数组具有日期和时间的键,但您可以通过没有时间组件的$event_day 变量访问它。此外,您自己将日期字符串拼凑在一起,并且日期不是零填充的,因此它会查找 '2016-8-1' 数组键并且找不到它,因为您的数据库结果显示为 '2016- 08-01'。

为了进一步调试,将以下内容放入if(isset($events[$event_day])) {else 部分,您将看到会发生什么:

echo $event_day . ' key not found in ' . print_r(array_keys($events), true);

【讨论】:

  • 谢谢!您是否愿意提供有关如何正确编写代码的建议?如果没有,请不要担心,继续并将其标记为正确并奖励赏金和所有。但这将不胜感激。无论哪种方式,这绝对为我指明了正确的方向——非常感谢!
  • 好吧,对于一个你可以做foreach ($bookings as $row) { $date = substr($row['event_date'], 0, 10); $events[$date][] = $row; } 然后为$event_day 计算一个正确的ISO-8601 格式的日期,而不是连接它的部分。既然你已经使用了datemktime 的组合,我相信你能弄明白。
  • 谢谢,终于可以使用 foreach 语句了 - 不需要更改 $event_day :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
相关资源
最近更新 更多