PDO中的绑定日期参数会导致错误的结果

时间:2015-05-06 15:03:34

标签: php mysql pdo

我正在尝试根据预订日期查找可用房间,这些房间存储在我的数据库中,包含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')";

任何人都可以看到它的问题,或者知道我可能遇到此问题的其他任何原因吗?

感谢您的帮助

0 个答案:

没有答案