MySQL使用datetime健全性检查将行插入数据库

时间:2012-12-07 14:26:46

标签: php mysql frameworks

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

我有两个表,我可以使用开始日期和结束日期插入其中,所以我现在感兴趣的唯一列是这些

间会议室
| ------------------------------------ |
| - bookingtime - | -bookingend- |

我理解完整性检查背后的原理和我在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));

我不想直接在声明中插入数据但是直到我明白如何做到这一点我才被卡住,所以问题,

如何在插入数据之前执行完整性检查,这样我就无法在预定时间内获得日期。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

修改

我一直在思考我的回答,并且我意识到旧的解决方案在你的情况下不起作用,因为你需要时间跨度,比较开始和结束日期是无用的。

我的处理方式是:

  1. 将日期保存为int,使用24h系统(上午7:40是740,下午9:50是2150)
  2. 检查存储日期:(Start<NewStart<End
  3. 检查存储日期:(Start<NewEnd<End
  4. 处理多个房间时,只需将房间号+时间存储为int。这样你仍然可以使用2和3中的方法。
  5. 2和3可以在sql查询中完成,请查看this链接。

    旧答案(检查重复项)

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

        $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。然后在尝试插入时出错。它更容易,并且您不会遇到并发连接问题。

答案 1 :(得分: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

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