我在mysql中有一个在线预订系统数据库,我试图使用this tutorial链接到一个可视化的php日历。
每天在日历上用<td>
表示,我使用以下PDO查询来确定每天的背景颜色(如果可用=没有颜色,如果没有则为红色)。
我遇到的一个复杂因素是,我需要在第X天以视觉方式显示1个预订,并在同一天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>
";
}
这适用于在每个预订的开始日期在视觉上显示对角线分割背景图像,每个预约的结束日期但是我无法获得一个预订结束和另一个预订正确开始的日子。
我认为这是因为我的初始查询仅查看一个预订记录 - 我需要它来识别所有这些,任何人都可以帮忙吗?
答案 0 :(得分:0)
您应该在预订bb上进行内部联接bb.enddate = bb2.stsrtdate和bb.booking_id!= bb2.booking_id
LEFT JOIN booking as bb2
ON bb.enddate=bb2.startdate
AND bb.booking_id!=bb2.booking_id
然后,您可以检查bb2.booking_id是否为空。如果不是,则有匹配的开始和结束日期。
但是只有在同一天开始只有1个事件时,这才有效。否则你可能会得到重复的行。