0

我在 mysql 中有一个在线预订系统数据库,我正在尝试使用本教程将其与可视 php 日历链接。

日历上的每一天都由 a 表示<td>,我使用以下 PDO 查询来确定每一天的背景颜色(如果可用 = 无颜色,如果没有则为红色)。

我遇到的一个复杂情况是,我需要直观地显示 1 个预订在 X 天结束,并显示另一个预订在同一天 X 开始。

$query_params = array( 
    ':campervan_id' => $_GET['campervan'],
    ':day' => $date_form.($i - $startday + 1)
);

$query = " 
    SELECT 
        car,
        booking_id,
        DATE_FORMAT(start_date, '%e/%c') AS s_d,
        DATE_FORMAT(end_date, '%e/%c') AS e_d
    FROM 
        bookings as bb 
    INNER JOIN 
        reservation as br ON bb.booking_id=br.bookings_id
    INNER JOIN 
        cars as bc ON br.car_id=bc.car_id
    WHERE 
        bc.campervan_id=:campervan_id AND
        :day BETWEEN bb.start_date AND bb.end_date
"; 

然后与我一起使用以下内容输出表格单元格结果:

if($i < $startday) { 
    echo "
        <td>
        </td>
    ";
}

else {

// IF DAY IS AVAILABLE
if(!$rows) {
    $color = "none";
}
// IF DAY IS UNAVAILABLE
else {
    $color = "#F3747F";
}

$dayMonth = ($i-$startday + 1)."/$cMonth";


// If DAY FALLS ON A START PICK UP DATE
if ($dayMonth == $rows['s_d']) {
        $back = "background-image:url(\"images/morning_back.png\");";
        $color = "none";
}
// If DAY FALLS ON A END DROP OFF DATE
else if($dayMonth == $rows['e_d']) { 
        $back = "background-image:url(\"images/afternoon_back.png\");";
        $color = "none";
}

// **************************************************

// IF FALLS ON BOTH A START AND END DATE????????
else if($dayMonth == ($rows['s_d'] && $rows['e_d'])) { 
        $back = "background-image:url(\"images/full_back.png\");";
        $color = "none";
}

// **************************************************

else {
    $back = "";
}

echo "
    <td align='center' valign='middle' height='100px' width='134' style='color:#FFFFFF; background-color:".$color."; ".$back." border:1px solid white;'>
        ".($i-$startday + 1)."
    </td>
";
}

这适用于在每个预订的开始日期、每个预订的结束日期直观地显示对角分割背景图像,但我无法正确显示一个预订的结束和另一个预订的开始的日期。

我认为这是因为我的初始查询只查看一个预订记录 - 我需要它来识别所有这些记录,有人可以帮忙吗?

4

1 回答 1

0

您应该在 bb.enddate=bb2.stsrtdate 和 bb.booking_id!=bb2.booking_id 的地方对预订 bb 进行内部连接

LEFT JOIN booking as bb2
ON bb.enddate=bb2.startdate 
AND bb.booking_id!=bb2.booking_id

然后您可以检查 bb2.booking_id 是否为空。如果不是,则有一个匹配的开始日期和结束日期。

但这只有在同一天只能有 1 个事件开始时才有效。否则你可能会得到重复的行。

于 2013-03-12T22:57:37.913 回答