检查日期订购是否无法正常工作

时间:2016-04-20 14:00:27

标签: php mysqli pdo

我有2个功能和一个预订页面。

我的支票功能:

    $sqlres = 'SELECT * FROM reserveren  WHERE (
        ? BETWEEN resvan AND restot
        OR ? BETWEEN resvan AND restot
        ) AND accomodatie=?';

    if($stmt = $con->myconn->prepare($sqlres)){
        $stmt->bind_param('ssi', $resvan, $restot,$accomodatie);
        $stmt->execute();
        $stmt->store_result();
    }
    if ($stmt->fetch()){
        $errmsg[] = "already reserveerd!";
        return $errmsg;
    }

我的订单功能:

    $sql = 'INSERT INTO reserveren (accomodatie,land_id,personen,userid,resvan,restot,park) VALUES (?,?,?,?,?,?,?)';

    if ($stmt = $con->myconn->prepare($sql))
    {
        $stmt->bind_param('sisisss', $accomodatie,$landid,$personen,$userid,$resvan, $restot,$park);
        $stmt->execute();
        $stmt->close();
    }
    else{
        die("errormessage: " . $con->myconn->error);
    }

我的订单页面:

if (isset($_POST['res']) && $_POST['res'] === 'reserveer') {
    $personen = $_POST['personen'];
    $resvan = $_POST['resvan'];
    $restot = $_POST['restot'];
    $accomodatie = $_POST['accomodatie'];
    $park = $_POST['park'];
    $userid = $_SESSION['userid'];
    $landid = $_POST['landid'];
    $errorMsgs = $user->check($resvan, $restot,$accomodatie);
    if (empty($errorMsgs)) {
        $user->reserveer($accomodatie,$landid,$personen,$userid,$resvan, $restot,$park);
        echo '<div class="alert alert-success"  role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">x</span></button>You have succesfully made a reservation.</div>';
        exit;
    }

    foreach ($errorMsgs as $msg) {
        echo '<li>'. $msg. '</li>';
    }

}

一切正常但我的代码中有一个缺陷。

第一

假设有人在2001-01-15到2001-01-15之间进行了预订,它会给出一条成功的消息并保留。然后有人在2001-01-14到2001-01-16之间进行预订,它会给出一个成功的消息并且它也会被保留。虽然15日已有预订,但不应保留。

第二

如果它以相反的方式发生在14到16之间,然后从15到15,它会给出一个错误信息,表明它已经被订购了。这样才能正常工作。

如果它是第一种方式,我该如何使它能够提供错误信息?

1 个答案:

答案 0 :(得分:1)

您需要将查询更改为:

'SELECT * FROM reserveren  WHERE (
    ? <= restot
    AND ? >= resvan 
    ) AND accomodatie=?';

我假设第一个参数是开始日期,第二个参数是新预订的结束日期,restot(结束)和resvan(开始)相同

这将捕获所有重叠的预订。