繁体   English   中英

为什么SQL SELECT语句不检索PHP日历的相关日期?

[英]Why is SQL SELECT statement not retrieving relevant dates for PHP calendar?

我正在尝试根据David Walsh的示例在PHP和SQL中构建事件日历。 他的示例相当古老,并使用了不推荐使用的函数,例如mysql_query,因此我尝试使用PDO进行现代化。 到目前为止,我已经设法打印出日历,并且能够选择不同的月份和年份。 我还成功创建了数据库连接。 该表由一个ID(自动递增),标题(varchar)和event_date(日期)组成。 我在表中填充了一些事件,但似乎无法成功检索它们。 我在顶部包含了代码中最相关的部分,但是我将整个代码复制到上下文中。

我对数据库的查询

$events = array();
try {   $results = $db->query("SELECT title, DATE_FORMAT(event_date,'%Y-%m-%d') AS event_date FROM events WHERE event_date LIKE '$year-$month'");
        echo "<pre>";
        var_dump($results);
} catch (Exception $e) {
    echo "cannot get results!";
    exit;
}

$bookings = $results->fetchAll(PDO::FETCH_ASSOC);

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

echo '<pre>';
var_dump($bookings);

我的var_dump对$ results的结果

object(PDOStatement)#2 (1) {
  ["queryString"]=>
  string(105) "SELECT title, DATE_FORMAT(event_date,'%Y-%m-%d') AS event_date FROM events WHERE event_date LIKE '2014-1'"
}

$ bookings上的var_dump说我的数组为空

 array(0) {
    }

上下文的完整代码

<?php 

require('database.php');

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

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

    /* table headings */
    $headings = array('Sontag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag');
    $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"><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>';
                }
            }
            else {
                $calendar.= str_repeat('<p>&nbsp;</p>',2);
            }
        $calendar.= '</div></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>';

    /** DEBUG **/
    $calendar = str_replace('</td>','</td>'."\n",$calendar);
    $calendar = str_replace('</tr>','</tr>'."\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'));

/* 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" class="btn btn-default" value="Go" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$previous_month_link.'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$next_month_link.' </form>';

/* get all events for the given month */
$events = array();
try {   $results = $db->query("SELECT title, DATE_FORMAT(event_date,'%Y-%m-%d') AS event_date FROM events WHERE event_date LIKE '$year-$month'");
        echo "<pre>";
        var_dump($results);
} catch (Exception $e) {
    echo "cannot get results!";
    exit;
}

$bookings = $results->fetchAll(PDO::FETCH_ASSOC);

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

echo '<pre>';
var_dump($bookings);

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 />';

除了喜欢的问题

FetchAll获取整个集合,因此虽然无法正常工作。请使用foreach

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

同样在您使用赋值运算符而不是比较==

我认为您在sql查询字符串中忘记了通配符。

您可以尝试以下方法:

WHERE event_date LIKE '$year-$month%'"

如果将event_date列作为日期而不是文本字段来处理,则效果会更好。

试试这个查询:

SELECT title, 
       DATE_FORMAT(event_date,'%Y-%m-%d') AS event_date 
  FROM events
 WHERE event_date >= DATE(DATE_FORMAT(NOW(),'%Y-%m-01'))
   AND event_date <  DATE(DATE_FORMAT(NOW(),'%Y-%m-01')) + INTERVAL 1 MONTH

这将找到event_date所有event_date值,同时将使用event_date上的MySQL索引进行搜索(如果有的话)。

如果您想要上个月的活动,则可以这样做。

 WHERE event_date >= DATE(DATE_FORMAT(NOW(),'%Y-%m-01')) - INTERVAL 1 MONTH
   AND event_date <  DATE(DATE_FORMAT(NOW(),'%Y-%m-01'))

这是对该主题的介绍。 http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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