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

Php MySQL使用datetime健全性检查将行插入数据库,php,mysql,frameworks,Php,Mysql,Frameworks,我正在制作一个会议室预订系统,在该系统中,开始日期和结束日期内不应有时间,因此理论上,验证应检查一个开始日期和结束日期时间范围内是否没有日期/时间 我有两个表,我可以插入其中,包括开始日期和结束日期,所以我现在感兴趣的列只有这些 会议室 |------------------------------------||-bookingtime-|-bookingend-| 我理解健全性检查背后的原理以及我可以在psudocode中执行的检查。这是我到目前为止得到的代码- > p4a\u db::si

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

我有两个表,我可以插入其中,包括开始日期和结束日期,所以我现在感兴趣的列只有这些

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

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

p4a\u db::singleton()->query(“插入到会议室(位置id、预订时间、预订id、梅罗诺id))
其中bookingtime<“$date.”和BookingAnd>“$date.”
或
bookingdate<“$date.”和BookingAnd>“$dateend.”
值(?,,,?)“,
数组($location、$date、$dateend、$merono));
我不想直接在语句中插入数据,但在我理解如何插入数据之前,我一直被卡住,所以问题是

如何在插入数据之前执行健全性检查,以便在预定时间内不获取日期

任何帮助都将不胜感激

编辑:

我一直在过度思考我的答案,我意识到旧的解决方案在您的案例中不起作用,因为您需要时间跨度,比较开始和结束日期是无用的

我的处理方法是:

  • 将日期保存为int,使用24小时制(上午7:40为740,晚上9:50为2150)

  • 检查存储日期,其中:(
    Start经过长时间的密集搜索,我现在得到了一个此方法的工作示例,以及一个防止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($this->BookingValue==1)
    {
    $sql=“选择COUNT(*)作为会议室预订中的num
    哪里
    (
    (?start_at)
    或
    (?>起始点和<结束点)
    )
    及
    会议室会议id=?“;
    $result=p4a_db::singleton()->fetchRow($sql,array($date,$date,$date,$dateend,$merono));
    如果(0==$result[“num”])
    {
    p4a_db::singleton()->查询(“插入会议室预订(开始、结束、会议室id))
    价值观
    (?,?,?)”,数组($date,$dateend,$merono));
    返回true;
    }       
    其他的
    {
    返回false;
    
    关于这段代码没有太多的解释,但是根据差异(不包括表中列名的更改),现在在设置值之前就准备好了查询,然后可以在
    if
    语句中使用它,从而允许在不同日期之间进行验证以过滤结果

    除此之外,我还添加了验证,以通过
    语句(其中会议室id限制为单个值)停止包含在该语句中的其他会议室的日期

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

    SQLSTATE[HY093]:参数编号无效:绑定变量的编号与令牌的编号不匹配
    文件:Pdo.php,第234行


    虽然现在我正在调查从准备好的声明中抛出的错误,并将在出现修复时更新此答案,但感谢您的帮助。

    您是否可以先进行查询?从预订开始时间的会议室中选择*我不知道这就是为什么我要问XD请解释的原因?抱歉,我太快按了“回车”键。请参阅我的编辑。Helpful?你能给我一个答案让我想象一下吗(例如写一个示例代码)我将列设置为唯一的问题是,我有几个会议室,所有的列都可能重叠,这一点我完全忘记了,直到你提到:P我想我知道如何排序,但我不知道,直到我尝试:P哦,我在使用php框架,所以大部分我需要删除才能开始工作,我会回到你这里=]试试看,有很多方法可以解决这个问题:)(例如,存储房间号码和时间的组合)让if-else方法发挥作用,而不是其他任何方法(现在)人力资源管理我想知道我将如何获得结果的数量,我将查看文档,看看是否能找到任何东西。感谢帮助=]我想我知道你的意思,尽管通常你的任务是思考我给你的一些想法,请查看编辑后的答案:)下次一定要只问具体问题,而不是整个过程。
        $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;
        }
    
    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;