我正在尝试根据预订日期查找可用房间,这些房间存储在我的数据库中,包含roomId,开始日期和结束日期。用户将搜索开始日期和结束日期,然后查询该表以查看这些日期内是否存在任何预订。麻烦的是,我在PDO中返回的结果与phpmyadmin中的结果不一致,或者当我将日期直接硬编码到查询中时,我无法弄清楚原因。我的数据库及其所有表和列都是UTF-8,我的PDO连接也是如此。我已经拆分了检查预订表的代码,所以它是孤立的,但我仍然遇到问题。一个真实的例子是:
现有预订:
----------------------------------------------
| BookingId | roomId | start_date | end_date |
----------------------------------------------
| 1 | 1 | 2015-07-02 | 2015-07-15 |
----------------------------------------------
| 2 | 1 | 2015-07-20 | 2015-07-30 |
----------------------------------------------
用户在7月16日到7月18日期间查询可用性,并且由于某种原因它返回BookingId 1,它不应该!我的查询中的逻辑对我来说是正确的,并且当我在phpmyadmin中运行相同的查询时返回正确的结果数(即无)。这是代码:
<?php
require_once("connection.php");
require_once("ex_dmp.php");
$con = connect_db();
$arrDate = urldecode($_GET['arr']);
$deptDate = urldecode($_GET['dept']);
$arr = date('Y-m-d',strtotime($arrDate));
$dept = date('Y-m-d',strtotime($deptDate));
$queryStr = "SELECT `id`, `start_date`, `end_date` FROM `bookings` b ".
"WHERE (b.`start_date` < :dept and b.`end_date` >= :dept) ".
"OR (b.`start_date` <= :arr and b.`end_date` > :arr) ".
"OR (b.`start_date` >= :arr and b.`end_date` <= :dept)";
$query = $con->prepare($queryStr);
$query->bindParam(':arr', $arr, PDO::PARAM_STR);
$query->bindParam(':dept', $dept, PDO::PARAM_STR);
$query->execute();
$bookings = $query->fetchAll(PDO::FETCH_ASSOC);
var_dump($bookings);
?>
但是,如果我用硬编码日期替换查询并删除bindParam行,我会得到正确的结果(无)
$queryStr = "SELECT `id`, `start_date`, `end_date` FROM `bookings` b ".
"WHERE (b.`start_date` < '2015-07-18' and b.`end_date` >= '2015-07-18') ".
"OR (b.`start_date` <= '2015-07-16' and b.`end_date` > '2015-07-16') ".
"OR (b.`start_date` >= '2015-07-16' and b.`end_date` <= '2015-07-18')";
任何人都可以看到它的问题,或者知道我可能遇到此问题的其他任何原因吗?
感谢您的帮助