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)の最後にあるため、この基準を満たす行は、role句とdays句を無視します。あなたは周りに余分なペアが欲しい

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

一般的なポイントとして、データベースでコンマ区切りの値を使用することは、リレーショナルデータベースの粒度を損なうことになります。通常、それぞれに別々の行があると、うまくいきます。

于 2013-01-05T22:09:16.957 に答える