大家好日子,
我正在尝试打印HTML表格;给定两个日期(7月1日至7月31日,在示例中),它将在标题上打印日期。然后,每一行都是一个房间。 然后,当那天预订房间时,单元格将具有红色背景颜色,否则,它将保持白色。
我迷失在IF中,检查房间是否应该打印成红色。 到目前为止,我得到了这个输出:http://jsfiddle.net/KatsuroKurosaki/kCkJD/
我正在努力实现这一目标:http://jsfiddle.net/KatsuroKurosaki/kCkJD/1/
基于DataBase查询输出:
SELECT idsRoom, checkin, checkout
FROM bookings
WHERE checkout >= '2014-07-01' AND checkin <= '2014-07-31'
+---------+------------+------------+
| idsRoom | checkin | checkout |
+---------+------------+------------+
| 2 | 2014-06-27 | 2014-07-02 |
| 4 | 2014-07-08 | 2014-07-09 |
| 6,7,8 | 2014-07-18 | 2014-07-22 |
| 14 | 2014-07-31 | 2014-08-02 |
+---------+------------+------------+
4 rows in set (0.00 sec)
是的,每次预订都有签到和结账,并且必须包含至少一个或多个房间(这就是为什么6,7,8)。我使用的是PHP 5.5.13,MySQLi编写的语句和Maria DB 10.0.12。 这是PHP代码段,它将打印输出表:
<?php
/* This will be the received POST date in the future */
$desdeP = "2014-07-01";
$hastaP = "2014-07-31";
/* Database Connection and DateTime objects */
$conn = new MySQLi("localhost","user","password","database"); //Seriusly? Nope ;)
$desde = DateTime::createFromFormat("Y-m-d",$desdeP);
$hasta = DateTime::createFromFormat("Y-m-d",$hastaP);
?>
<!-- Table with date headers -->
<table border="1" cellpadding="0" cellspacing="0" style="min-width:100%;min-height:100%;">
<tr>
<td> </td>
<?php
while($desde<=$hasta){
echo '<td>'.$desde->format("d-m-Y").'</td>';
$desde->modify("+1Day");
}
?>
</tr>
<?php
/* Query all the rooms */
$stmt = $conn->prepare("SELECT id, name FROM rooms ORDER BY id;");
$stmt->execute();
$rooms = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
$stmt->close();
/* Query all the bookings in the given dates */
$stmt = $conn->prepare("SELECT idsRoom, checkin, checkout
FROM bookings
WHERE checkout >= ? AND checkin <= ?;");
$stmt->bind_param("ss",
$desdeP,
$hastaP);
$stmt->execute();
$bookings = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
$stmt->close();
foreach($rooms as $k=>$v){ // Every row is a room
echo '<tr>';
echo '<td>'.$v['name'].'</td>';
$desde = DateTime::createFromFormat("Y-m-d",$desdeP);
$hasta = DateTime::createFromFormat("Y-m-d",$hastaP);
while($desde<=$hasta){ // For every row, check in the bookings list if available or not
echo '<td';
foreach ($bookings as $k2=>$v2){
$checkin = DateTime::createFromFormat("Y-m-d",$v2['checkin']);
$checkout = DateTime::createFromFormat("Y-m-d",$v2['checkout']);
/* HERE remains my question: What mega IF do I need to paint background in red if the room is not available? */
if( (strpos(",".$v2['idsRoom'].",",",".$v['id'].",")!==false) &&
($checkin < $hasta && $checkout > $desde) &&
($checkin >= $desde && $checkout <= $hasta)
){
echo ' style="background-color:red;"';
}
}
echo '> </td>';
$desde->modify("+1Day");
}
echo '</tr>';
}
$conn->close();
?>
</table>
感谢所有提前,希望能找到一些帮助〜
问候!
答案 0 :(得分:0)
由于您的$desde
是while
循环中的运行日期,因此您应该检查
如果$ desde在$ checkin和$ checkout之内,那么房间就被阻止了 (红色)
因此,通过使用此逻辑,这是您需要的唯一条件:
if ((strpos(",".$v2['idsRoom'].",",",".$v['id'].",")!==false) &&
($checkin <= $desde && $checkout > $desde)
){
echo ' style="background-color:red;"';
}
我在我的localhost上运行它,它在你的例子中就像你想要的那样工作。希望它有所帮助。
答案 1 :(得分:0)
在快速查看问题后,我注意到您在id列中有逗号分隔值。这肯定会给你带来麻烦,将来会给你带来更多麻烦。我不是数据库设计专家,当我开始编程时,我也在做同样的事情。我想做一些快速简单的事情,没有太多的关系麻烦,它总是变得一团糟,最终不得不从头开始,并正确地做。
这种设计反模式会使查询变得更加困难,而且,你必须编写大量代码来重新发明丢失的数据库的内置功能(你已经开始这样做了,{{1 }})。
我花了一些时间来重写这个例子。对于日期范围,我使用DatePeriod类。它可以在foreach循环中使用,因此它适用于日历等。此外,这里有两个关联数组(strpos(",".$v2['idsRoom'].",",",".$v['id'].",")!==false
和$rooms
),它们在示例中完全相同。转换$bookings
数组以分隔$bookings
值后,它看起来像:
Array ( [0] => Array ( ... ) [1] => Array ( ... ) [2] => Array ( [idsRoom] => 6 [checkin] => 2014-07-18 [checkout] => 2014-07-22 ) [3] => Array ( [idsRoom] => 7 [checkin] => 2014-07-18 [checkout] => 2014-07-22 ) [4] => Array ( [idsRoom] => 8 [checkin] => 2014-07-18 [checkout] => 2014-07-22 ) [5] => Array (... ) )
最后,循环打印表格:
idsRoom
这里有一个booking design example可以帮助您处理表之间的数据库和关系。