0

我正在制作一个会议室预订系统,其中在开始和结束日期内不应该有任何时间,因此理论上验证应该在一个开始和结束日期时间范围内检查没有日期/时间。

我有两个表,我可以将开始日期和结束日期都插入其中,所以我目前唯一感兴趣的列是这些

会议室
|------------------------------------------------|
|- 预订时间-|-预订结束-|

我了解健全性检查背后的原理以及我可以在 psudocode 中进行的检查。这是我到目前为止得到的代码->

p4a_db::singleton()->query("INSERT INTO meetingrooms(location_id, bookingtime, bookingend, merono_id)
                WHERE bookingtime < " . $date . " AND bookingend > " . $date . "
                OR
                bookingdate < " . $date . " AND bookingend > " . $dateend . "
                VALUES(?,?,?,?)",
                array($location, $date, $dateend, $merono));

我不想将数据直接插入到语句中,但在我明白如何做到这一点之前,我被卡住了,所以问题是,

如何在插入数据之前执行完整性检查,以免在预定时间内获得日期。

任何帮助将不胜感激。

4

2 回答 2

2

编辑:

我一直在想我的答案,我意识到旧的解决方案不适用于你的情况,因为你需要时间跨度,比较开始日期和结束日期是没有用的。

我的处理方式是:

  1. 将日期保存为 int,使用 24 小时制(早上 7:40 是 740,晚上 9:50 是 2150)
  2. 检查存储的日期,其中:( Start<NewStart<End)
  3. 检查存储的日期,其中:( Start<NewEnd<End)
  4. 处理多个房间时,只需将房间号+时间存储为int。这样你仍然可以使用 2 和 3 中的方法。

2 和 3 可以在 sql 查询中完成,请查看链接。

旧答案(检查重复)

这是在插入文本之前如何检查重复项(在本例中为电子邮件)的示例:

    $emailexist = $mysqli->prepare("select email from users where email = ?");
    $emailexist->bind_param('s', $email);
    $emailexist->execute();
    $emailexist->store_result();
    if ($emailexist->num_rows > 0) {
        $emailexist->close();
        $mysqli->close();
        return true;
    }
    else {
        $emailexist->close();
        $mysqli->close();
        return false;
    }

它检查是否有包含该字符串的行。如果是这样(如果行数大于 0),则返回 true(这意味着日期已经存在)。

您可以将其调整为您的代码。

但是,您也可以只将列设置为 UNIQUE。然后在尝试插入时出现错误。它更容易,并且您不会遇到并发连接的问题。

于 2012-12-07T14:36:41.623 回答
0

经过长时间的深入搜索,我现在得到了这个方法的一个工作示例,以及一种防止 sql 注入的方法,这是代码;

if ($this->BookingValue == 1)
    {
        $sql = "SELECT COUNT(*) as num FROM meeting_room_bookings
                WHERE
                (
                (? < start_at AND ? > start_at)
                OR
                (? > start_at AND ? < end_at)
                )
                AND
                meeting_room_id = ?";

        $result = p4a_db::singleton()->fetchRow($sql, array($date, $date, $date, $dateend, $merono));

        if ( 0 == $result["num"] )
        {

         p4a_db::singleton()->query("INSERT INTO meeting_room_bookings (start_at, end_at, meeting_room_id)
                    VALUES
                    (?,?,?)", array($date, $dateend, $merono));

            return true;
        }       
        else
        {
         return false;

关于这段代码没有太多解释,但就差异而言,(不包括与表的列名更改)现在在设置值之前准备好查询,然后可以在if语句中使用它,从而允许进行验证以过滤不同日期之间的结果。

AND除此之外,我还添加了验证,以通过将会议室 ID 限制为单个值的语句将其他会议室的日期包含在语句中。

虽然现在,这将导致一个单独的问题是来自该语句的另一个抛出的错误,但我知道插入是正确的,但是这个准备好的语句中的某些东西会导致错误:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens File: Pdo.php, Line: 234

虽然现在我正在研究从准备好的语句中抛出的错误,并且会在有修复时更新此答案,但感谢您的帮助。

于 2012-12-13T09:21:47.343 回答