检查2个日期之间的可用性无效

时间:2016-04-15 09:23:22

标签: php mysqli pdo

我可以订购汽车订购页面。我有2个功能,1个命令1来检查。

我的订单功能:

function reserveer($resvan,$restot,$autoid){
    $con = new Core();
    $con->connect();
    $sql = 'INSERT INTO reservering (resvan, restot,autoid) VALUES (?,?,?)';

    if ($stmt = $con->myconn->prepare($sql))
    {
        $stmt->bind_param('ssi', $resvan, $restot,$autoid);
        $stmt->execute();   
        $stmt->close();
    }
    else{
        die("errormessage: " . $con->myconn->error);
    }
}

我的支票功能:

function check($resvan, $restot,$autoid){
    $con = new Core();
    $con->connect();
    $errmsg = array();
    $sqlres = 'SELECT * FROM reservering WHERE resvan >= ? AND restot <= ? AND autoid=?';
    if($stmt = $con->myconn->prepare($sqlres)){
        $stmt->bind_param('ssi', $resvan, $restot,$autoid);
        $stmt->execute();
        $stmt->store_result();
    }
    if ($stmt->fetch()){
        $errmsg[] = "already exists!";
        return $errmsg;
    }
}

但我的代码存在漏洞。当有人从2001-01-01到2001-01-15订购时,它会被正确插入。当有人从2001-01-02到2001-01-14订购时,它也会被插入。我认为这会奏效。我已经尝试了sql BETWEEN,但这也不起作用。

所以我的问题是,我该如何正确检查呢?我没有错。

我的桌面设置:

Table

1 个答案:

答案 0 :(得分:0)

  

当有人从2001-01-01到2001-01-15订购时,它会被正确插入

我们有

resvan=2001-01-01
restot=2001-01-15

现在查看检查预订的查询

WHERE resvan >= ? AND restot <= ?
  

当有人从2001-01-02到2001-01-14订购时,它也会被插入

当发生这种情况时,您的查询就会变成

WHERE resvan >= 2001-01-02 AND restot <= 2001-01-14

这不会返回重复项,因为不存在此类记录。您现有的记录的日期是从1月1日开始,而不是从1月1日开始。

解决方案非常简单,您不希望在已经预订的日期双重预订汽车,因此只需提供1个日期而不是两者都匹配。即使1场比赛没有重新预订

WHERE (
2001-01-02 BETWEEN resvan AND restot
OR 2001-01-14 BETWEEN resvan AND restot
)
AND autoid=?

现在尝试使用那些新日期