我正在制作一个 session 室预订系统,其中开始和结束日期内不应有时间,因此理论上验证应检查一个开始和结束日期时间范围内是否没有日期/时间。
我有两个表,我可以在其中插入开始日期和结束日期,因此我目前唯一感兴趣的列是这些
session 室
|------------------------------------|
|- 预订时间 - |-预订结束-|
我了解健全性检查背后的原理以及我可以在伪代码中进行的检查。这是我到目前为止得到的代码 - >
p4a_db::singleton()->query("INSERT INTO meetingrooms(location_id, bookingtime, bookingend, merono_id)
WHERE bookingtime < " . $date . " AND bookingend > " . $date . "
OR
bookingdate < " . $date . " AND bookingend > " . $dateend . "
VALUES(?,?,?,?)",
array($location, $date, $dateend, $merono));
我不想将数据直接插入语句中,但在我了解如何执行此操作之前,我陷入困境,所以问题是,
在插入数据之前如何执行健全性检查,这样我就不会在预订时间内获得日期。
任何帮助将不胜感激。
最佳答案
编辑:
我一直在思考我的答案,我意识到旧的解决方案不适用于您的情况,因为您需要时间跨度,比较开始和结束日期是没有用的。
我的处理方式是:
- 将日期保存为 int,使用 24 小时制(上午 7:40 为 740,晚上 9:50 为 2150)
- 检查存储的日期,其中:(
Start<NewStart<End
) - 检查存储的日期,其中:(
Start<NewEnd<End
) - 处理多个房间时,只需将房间号+时间存储为int即可。这样你仍然可以使用2和3中的方法。
2和3可以在sql查询中完成,查看this链接。
旧答案(检查重复项)
这是如何在插入文本之前检查重复项(在本例中为电子邮件)的示例:
$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;
}
它检查是否有包含该字符串的行。如果是这样(如果行数大于 0),则返回 true(这意味着日期已经存在)。
您可以根据您的代码进行调整。
但是,您也可以将列设置为 UNIQUE。然后尝试插入时会出现错误。这更容易,并且您不会遇到并发连接问题。
关于php - MySQL 通过日期时间健全性检查将行插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13765026/