【问题标题】:Compare date/time from form to dates/times in database比较表格中的日期/时间与数据库中的日期/时间
【发布时间】:2014-01-28 13:37:58
【问题描述】:

更新

我编辑了我的代码,所以现在时间检查正确:

while($row = mysqli_fetch_array($result)){
  $rid = $row['roomid'];
  $begin = $row['start'];
  $bval = strtotime($begin);
  $einde = $row['end'];
  $eval = strtotime($einde);

  $staco = strtotime($start); //starttime posted from form
  $endco = strtotime($end);  //stoptime posted from form


  $abegin = array(sta => $bval);
  $aeinde = array(sto => $eval);
  // print_r($abegin);
  // print_r($aeinde);
  foreach($aeinde as $sto) {
  if($staco <= $sto) {$checksto = 1;}
  else {$checksto = 0;}
  }

  foreach($abegin as $sta) {
  if($endco <= $sta) {$checksta = 1;}
  else {$checksta = 0;}
  }


  if($checksta == $checksto) {$ok = 1;} else {$ok = 0;}  

  print_r($ok);

  }
  }
}

那么现在:我如何检查 $ok 是否包含一个或多个 0(不预订房间)或所有 1(预订房间)。

$roomstate = array(state =&gt; $ok) 产生多个数组:

Array ( [state] => 0 ) Array ( [state] => 1 ) Array ( [state] => 1 )

我做错了什么,因为我认为应该可以将所有不同的$ok 放在一个数组中,然后

if(in_array(0,$roomstate)) { echo "Do not book";} else {$bookitsql = "INSERT INTO reservations ...";}
更新:我的原始逻辑中存在一个缺陷,即检查需要首先解决的房间的可用性:现在房间没有检查正确,因此无法回答这个问题,因为没有显示正确的数据。我很抱歉。 对于预订房间的系统,如果房间目前已经被预订,我需要检查新的预订。预订使用表格,然后将表格中的结果与该房间在该日期的数据库中的内容进行比较。 而($row = mysqli_fetch_array($result)){ $rid = $row['roomid']; $begin = $row['start']; $bval = strtotime($begin); $staco = strtotime($start); $einde = $row['end']; $eval = strtotime($einde); $endco = strtotime($end); $abegin = 数组(sta => $bval); $aeinde = 数组(sto => $eval); foreach($abegin as $sta) { if($staco $checksta,checkstop => $checksto); print_r($meh); } 更好的问题: 现在我得到了 `$staco` 和 `$endco`,它们是表单的开始和停止时间。 我还得到了 `$sta` 和 `$sto`,它们是来自数据库的多个开始和停止时间。 例子: 现有保留: 斯塔斯托 1:0800 0959 2:1130 1259 所以现在当我得到 `$staco = 1000` 和 `$endco = 1114` 时,它检查不正确。 它仅在新预订晚于数据库中的所有其他预订时才有效。我该如何解决这个问题?

【问题讨论】:

  • 旁注: 不再支持mysql_* 函数,它们是officially deprecated,不再维护,将来会是removed。您应该使用PDOMySQLi 更新您的代码,以确保您的项目在未来的功能。
  • 一次检查所有值。现在它检查数据库中每一行(在那个日期和房间)的 $checksta 和 $checksto。所以现在我有时会得到结果Array ( [checkstart] =&gt; 1 [checkstop] =&gt; 0 ) Array ( [checkstart] =&gt; 0 [checkstop] =&gt; 0 ),所以它不能添加预订。但是由于第二个数组,它会认为无论如何都可以预订房间
  • @AmalMurali 我的 sql 语句现在可以与 mysqli 一起使用。

标签: php mysql


【解决方案1】:

您的目标伪代码表明您希望它全部为 0。$meh 是一个数组。 因此,您现在要做的是在 $meh 上使用 foreach,然后在出现 1 时将其标记为已占用。如果这没有发生,您可以假设 $meh 是免费的,然后您预订。

$roomState = 0;
foreach($meh as $mehValue){
  if($mehValue == 1){
    $roomState = 1;
  }
}
if($roomState == 1){
  print_r("room is occupied");
} else {
  //insert stuff
}

【讨论】:

  • 这实际上不起作用,因为 $meh 实际上是多个数组。 print_r($meh) 给我同样的输出:Array ( [checkstart] =&gt; 1 [checkstop] =&gt; 1 ) Array ( [checkstart] =&gt; 0 [checkstop] =&gt; 0 )(取决于该房间在该日期的数据库中已有多少预订)。
  • 如果我做对了。 $meh 是一个包含这 2 个“checkstart”和“checkstop”值的数组的数组?如果是这样,您也可以对它们进行迭代,或者如果它们一致,您也可以使用密钥进行 2 次检查。 (硬代码变体) if( $mehValue[checkstart] || $mehValue[checkstop]){ its dedicated} 应该可以工作,因为如果它为 1,则解释为 true,如果为 0,则应解释为 false。
  • 是的,你没看错,但我现在看到我的原始逻辑有一个错误,所以这根本行不通(我的原始代码)。从表格中检查可用性的方式是完全错误的。如果我知道如何正确执行此操作,我会更新。
  • @lennert_h 您现在想比较日期。假设您可以比较数字(如果您有前导 0,则情况并非如此),您需要找到 2 个值之间的空间: -- 小于表格中的开始时间的最高停止时间 // 最低开始时间高于表格中的停止时间 -- -- 用布尔值(真、假)标记这两个检查,您可以再次检查两个条件是否满足。如果这可以解决您的问题,请发表评论,以便我可以将其添加到给定的解决方案中
  • 比较日期始终是计划,但我错误地认为我的原始代码已经涵盖了这一点。现在不太确定,但考虑一下,现在如何比较日期。在日期时间格式中,我使用前导零,但它们被转换为时间戳。够了吗?
【解决方案2】:

通过检查我的 sql 语句中的日期,采取了不同的方法。 因此,表单会发布 $start 和 $end(当用户想要进行预订时)。 现在我的代码看起来像这样(我认为它看起来不错):

//form and other errormessages like username==0; $start>$end etcetera
else {
  $reservationsql = "SELECT * FROM reservations WHERE roomid = '$roomid' AND ('$start' between start AND end) OR ('$end' between start AND end) OR ('$start' >= start AND '$end' <= end) OR ('$start' <= start AND '$end' >= end)";
  $result = mysqli_query($link,$reservationsql) or die(mysql_error());
  $num = mysqli_num_rows($result);

  if($num>0) {"Error: room already booked at that moment";}
  else {//$query = "INSERT INTO ..."}
}
}mysqli_close();

感谢这里的所有帮助并与我一起思考。

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2019-09-26
    • 2016-09-19
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多