2

免责声明:仍然是初学者。

我正在制作一个小脚本来显示目前应该轮班的人员,按角色过滤。这些班次确实会持续到午夜。截至目前,时间和角色是硬编码的,但我打算允许用户稍后指定两者(因此我不使用 NOW() 等)。

所以给定下面的数据,假设是周一下午 4:30,我想知道什么水果在预定的时间,当这个脚本执行时,它会回显如下:

Apple
Banana

然而,当下面的代码在下表上执行时,它几乎总是选择整个表。我确定查询本身存在问题,但为了彻底,我将其余部分包括在内。我已经测试了只选择日期和角色本身,它工作正常,但是它选择时间的方式错误地评估为真。我会很感激任何建议。

这是我的表的示例:

+----------+-------------+----------+----------+-------------+
| Name     | Days        | Start    | End      | Role        |
+----------+-------------+----------+----------+-------------+
| Apple    | Sun,Mon,Tue | 15:30:00 | 20:00:00 | Fruit       |
| Banana   | Mon,Tue,Wed | 16:00:00 | 20:30:00 | Fruit       |
| Cheese   | Mon,Tue,Wed | 08:30:00 | 10:30:00 | Dairy       |
| Carrot   | Fri,Sat,Sun | 22:00:00 | 07:00:00 | Vegetable   |
+----------+-------------+----------+----------+-------------+

这是我的代码,没有遗漏:

<?php
    date_default_timezone_set('Etc/GMT+6'); // Set default time zone
    $time = date("H:i:s"); // Time with seconds in a 24-hour, leading zero format: i.e. 07:00:00 or 15:30:00
    $today = date("D"); // Today, in a three-letter format: i.e. Mon, Tue
    $role = "Fruit";

    $username="example-username";  
    $password="example-password";
    $database="example-database";

    mysql_connect(localhost,$username,$password);
    @mysql_select_db($database) or die( "Unable to select database");
    $query="SELECT *
    FROM work 
    WHERE `days` LIKE '%$today%'  AND
    `role` LIKE '%$role%' AND 
    (start > end AND ('$time' < end OR '$time' > start)) OR
    ('$time' BETWEEN start AND end)";
    $result=mysql_query($query);

    $num=mysql_numrows($result);

    mysql_close();

    $i=0;
    while ($i < $num) {

    $victim=mysql_result($result,$i,"name");

    echo        "<li>$victim</li>";

    $i++;
    }
?>
4

1 回答 1

2

您的括号错误,您的查询已OR ('$time' BETWEEN start AND end)结束,因此符合此条件的行将忽略角色和天数子句。你想要多一双

((start > end AND ('$time' < end OR '$time' > start)) OR
('$time' BETWEEN start AND end))

一般来说,在数据库中使用逗号分隔的值是违背关系数据库的。如果每个行都有单独的行,事情通常会更好。

于 2013-01-05T22:09:16.957 回答