我可以订购汽车订购页面。我有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,但这也不起作用。
所以我的问题是,我该如何正确检查呢?我没有错。
我的桌面设置:
答案 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=?
现在尝试使用那些新日期