【问题标题】:Check mysql if date is between dates如果日期在日期之间,请检查 mysql
【发布时间】:2014-05-15 21:06:27
【问题描述】:

我现在正在学习 php,我想制作一个租车系统来挑战自己。

现在我遇到了一个验证问题,我有 5 辆不同的汽车,想检查汽车在用户提交的日期是否可用。

我的数据库表有一个开始日期、结束日期、汽车和一个 ID

这就是我想要开始的工作:

if($_POST){


$date1 = $_POST["startdate"];
$date2 = $_POST["enddate"];
$car= $_POST["car"];

$qry1 = "SELECT * FROM hire WHERE startdate between '{$date1}' and '{$date2}'
UNION
SELECT * FROM hire WHERE enddate between '{$date1}' and '{$date2}'";

$qry2 = "SELECT * from hire WHERE car = '{$car}'";

$results = mysql_query($qry1, $bd);
$results2 = mysql_query($qry2, $bd);
$row  = mysql_num_rows($results);
$row2  = mysql_num_rows($results2);

if ($row && $row2 > 1 ){
   die("it twerks");
}

else {
  //do stuff\
}
}

现在它说它始终可用。

编辑

start 和 enddate 是 DATE 字段格式是 Y-m-d。

【问题讨论】:

  • 首先,如果你正在学习 PHP,你应该使用 MySQLi 的 PDO 来学习,而不是 MySQL,因为它已被弃用。 startdateenddate 是哪些字段类型?您查询它们的方式需要是 DATE 字段,如果不是,您需要将字段名称包装在 DATE() 中以使其成为日期字段。另外,通过 post 变量输入的开始日期和结束日期是什么格式?最后,您的 if 语句在两个变量上都需要 >1,例如if($row > 1 && $row2 > 1) {(请记住,如果每个查询有 两行或多行,那么...
  • 感谢您的评论,我会查看 MySQLi 我已经尝试过但没有使用它,不知道为什么,结束日期和开始日期字段名称是 DATE 字段(将编辑此)。格式为 Y-m-d,您的评论在“then....”之后中断,看不到其余部分。
  • 你说得对,真奇怪。基本上 - 确保那些条件是你想要的。您想要两行或多行还是只需要一行或多行 (>0)?
  • 想我想要两行,一排检查汽车,另一排检查日期,然后结合起来检查汽车在用户填写的日期是否可用

标签: php mysql


【解决方案1】:

您好,抱歉回复晚了。我做过类似的事情,但对于床和早餐,房间预订系统。

请先正确规范您的数据库。

您可以拥有三个表,例如 Car、Hire 或 Person。 你的车表,可以有你车辆的所有描述。 人员表可以包含租车人的所有描述。 您的租用表将引用 car_id 和 person_id。它还将包含您的 start_date 和 end_date。 所以像这样。

  • 汽车桌。

car_id(主键), car_color(文本), Car_make(文本)

**

  • 人员表

** person_id(主键) 人名(文本) person_telephone(文本)

租用桌子 Hire_Id(auto_increment) person_id(外键) car_id(外键) 开始日期(日期) end_date(日期)

$Query="SELECT r.* 来自汽车 WHERE r.car_id 不在 ( 选择 b.car_id 从租 b 不是(b.end_date'2014-08-12')) 按 r.car_id 排序;"

这会返回所有可用的汽车

【讨论】:

    【解决方案2】:

    首先,您希望将所有查询逻辑合并为一个没有联合的查询,以找到重叠的预订。以下应返回指定日期范围内的可用汽车。

    SELECT *
    FROM hire
    WHERE
      startdate  NOT BETWEEN '{$date1}' AND '{$date2}' OR
      enddate    NOT BETWEEN '{$date1}' AND '{$date2}' OR
      '{$date1}' NOT BETWEEN startdate  AND enddate    OR
      '{$date2}' NOT BETWEEN startdate  AND enddate
    

    其次,你不能用这样的逻辑语句走捷径:

    if ( $row && $row2 > 1 )
    

    必须写成这样:

    if ( $row > 1 && $row2 > 1 )
    

    第三,yadda yadda 不要使用mysql_*() 函数。 [在你的问题上查看 cmets 中的迂腐。]

    我推荐 PDO。它支持的数据库系统不仅仅是 mySQL,而且 MySQLi 有一些非常奇怪的语法。

    【讨论】:

    • 感谢您的评论,但仍然显示它始终可用。
    【解决方案3】:

    您也可以直接在 DATETIME 列上使用 MySQL 比较函数:http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#operator_between

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多