【问题标题】:Overlap of time slot时隙重叠
【发布时间】:2015-05-27 08:36:20
【问题描述】:

我已经建立了一个预订系统,用户可以在其中选择时间段输入开始和结束时间并将这些值保存到 MySql 中。现在我发现了一个问题,用户 A 预订了 3-4 的时间段。现在用户 B 想要预订时间段 2.30-4.30。目前它允许用户 B 选择我不想要的时间段。尝试为它编写代码但没有得到想要的结果。 请帮忙!

<?php
session_start();
$host="localhost"; // Host name
$username="root"; // Mysql username
$password=""; // Mysql password
$db_name="testmra"; // Database name

// Connect to server and select databse.
$conn=mysqli_connect($host,$username,$password) or die("cannot connect");

mysqli_select_db($conn,$db_name);
$sname=$_SESSION['usr_name'];


$room = mysqli_real_escape_string($conn, $_POST['txtrname']);
$name = mysqli_real_escape_string($conn, $_POST['txtname']);
$purpose = mysqli_real_escape_string($conn, $_POST['txtpurpose']);
$attendee = mysqli_real_escape_string($conn, $_POST['attendee']);
$date = mysqli_real_escape_string($conn, $_POST['txtdate']);
$btime = mysqli_real_escape_string($conn, $_POST['btime']);
$etime = mysqli_real_escape_string($conn, $_POST['etime']);

$query="SELECT starttime,endtime FROM bookingdetails WHERE date = '$date' AND room='$room' ";
$result=mysqli_query($query);
$num=mysqli_num_rows($result);

$i=0;
  while ($i <= $num)
  {
    $MinValue=mysqli_result($result,$i,"starttime");
    $MaxValue=mysqli_result($result,$i,"endtime");
   if (($btime < $MaxValue) && ($MinValue < $etime)) {
        $overflowed=true;
    }
    $i++;
   }

   if ($overflowed)
   {
       //Error message
      header("location:karma.php");
       echo '<script language="javascript">';
    echo 'alert(" Time Slot is overlapping.Change the time slot")';
    echo '</script>';
    }
   else
   {
      //Save to database
             $sql="INSERT INTO bookingdetails  (room,name,purpose,attendee,date,starttime,endtime,status_id)VALUES('$room','$name','$purpose','$attendee','$date','$btime','$etime','2')";
     }


    if (mysqli_query($conn,$sql))
      {
        echo "Record added";

        }
    else
    {
        die('Error: ' . mysqli_error());
    }
  ?>

【问题讨论】:

标签: php mysql


【解决方案1】:

您可以执行计算现有重叠的 sql 请求:

SELECT count(*) WHERE $requested_start < endtime
AND $requested_end > starttime
AND date = $date
AND status_id = 2;

您现在可以使用此结果来检查时隙是否可用:

$overlappings = mysqli_fetch_row($result);

// If there is no overlapping
if($overlappings[0] <= 0){
  // time slot is available
}

【讨论】:

  • 不需要先检查,但如果要先检查,则需要作为交易的一部分进行。
  • 我的错误,使用带有 count() 的结果的 num_rows 将返回 1。让我编辑我的答案。
  • 先生只是想问我是否正确编写了代码?因为我使用了上面的代码,所以它也没有将值插入到 db 中。
  • 使用您当前的代码,$overlappings 始终等于 1,因此您的插入查询永远不会被执行。
  • 那么我需要做些什么改变?
【解决方案2】:
<?php  
 $sql = "select room_no FROM roominfo WHERE room_no NOT IN (SELECT roomno FROM guestrocordtransac WHERE '".$format_checkin."' between checkin AND checkout and roomtype='".$roomtype."' UNION SELECT roomno FROM guestrocordtransac WHERE '".$format_checkout."' BETWEEN checkin AND checkout and roomtype='".$roomtype."') and roomtype='".$roomtype."' ";
 $retval = mysql_query( $sql, $conn );
 if(mysql_num_rows($retval)== 0 ||mysql_num_rows($retval)== null )
{
  ?>
 <script type="text/javascript">
alert("Please select another date/Type")</script>
 <?php
 }
 else{   ///inserrt code///}

这是一个示例代码...用您的时间替换格式检查...我认为这可能会对您有所帮助..

【讨论】:

  • 会尝试这个但很困惑。 1. 你为什么用 room_no 和 guestrocordtransac 是什么意思
  • 预订详细信息中除了开始时间和结束时间之外,您还有哪些其他字段...您有唯一的 ID 吗
  • 先生你误会了。此页面仅用于检查特定房间的时间段重叠
  • SELECT starttime,endtime FROM bookingdetails WHERE room NOT IN (SELECT room FROM bookingdetails WHERE '".$btime."' between starttime and endtime UNION SELECT room FROM bookingdetails WHERE '".$etime."'在 starttime 和 endtime 之间)和 room='$room' 和 date = '$date'"; 你必须像这样更改你的代码
  • 好的 会试试的。谢谢你的帮助。但是你认为这会成功吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 2020-05-24
相关资源
最近更新 更多