根据预订系统中的可用房间打印HTML表格

时间:2014-06-22 10:36:43

标签: php mysql sql mysqli

大家好日子,

我正在尝试打印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>&nbsp;</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 '>&nbsp;</td>';
        $desde->modify("+1Day");
    }
    echo '</tr>';
}
$conn->close();
?>
</table>

感谢所有提前,希望能找到一些帮助〜

问候!

2 个答案:

答案 0 :(得分:0)

由于您的$desdewhile循环中的运行日期,因此您应该检查

  

如果$ 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可以帮助您处理表之间的数据库和关系。