我有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,它会给出一个错误信息,表明它已经被订购了。这样才能正常工作。
如果它是第一种方式,我该如何使它能够提供错误信息?
答案 0 :(得分:1)
您需要将查询更改为:
'SELECT * FROM reserveren WHERE (
? <= restot
AND ? >= resvan
) AND accomodatie=?';
我假设第一个参数是开始日期,第二个参数是新预订的结束日期,restot
(结束)和resvan
(开始)相同
这将捕获所有重叠的预订。