Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO中的绑定日期参数导致不正确的结果_Php_Mysql_Pdo - Fatal编程技术网

Php PDO中的绑定日期参数导致不正确的结果

Php PDO中的绑定日期参数导致不正确的结果,php,mysql,pdo,Php,Mysql,Pdo,我正在尝试根据预订日期查找可用房间,预订日期存储在我的DB中,带有roomId、开始日期和结束日期。用户将搜索开始和结束日期,我查询该表以查看这些日期内是否有任何现有预订。问题是,我在PDO中得到的结果与phpmyadmin中的结果不一致,或者当我将日期直接硬编码到查询中时,我不知道为什么。我的数据库及其所有表和列都在UTF-8中,PDO连接也是如此。我在检查bookings表的地方分离了代码,所以它是孤立的,但我仍然有问题。一个真实的例子是: 现有预订: ------------------

我正在尝试根据预订日期查找可用房间,预订日期存储在我的DB中,带有roomId、开始日期和结束日期。用户将搜索开始和结束日期,我查询该表以查看这些日期内是否有任何现有预订。问题是,我在PDO中得到的结果与phpmyadmin中的结果不一致,或者当我将日期直接硬编码到查询中时,我不知道为什么。我的数据库及其所有表和列都在UTF-8中,PDO连接也是如此。我在检查bookings表的地方分离了代码,所以它是孤立的,但我仍然有问题。一个真实的例子是:

现有预订:

 ----------------------------------------------
| 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=“从“预订”b中选择“id”、“开始日期”、“结束日期”。
其中(b.开始日期`<'2015-07-18'和b.结束日期`>='2015-07-18')。
“或(b.‘开始日期’‘2015-07-16’”)。

“或(b.`start\u date`>='2015-07-16'和b.`end\u date`除非您使用的是模拟的prepares,否则您不能重复使用占位符名称。您可以发布
变量转储($\u GET)吗?”
输出?当然是^-Marc的评论。添加一些到您的查询和连接中。是的。基本上每个查询和连接都必须是唯一的。如何使它们独特取决于您。如果您可以重复使用它们,我们会很高兴,因为(就像在您的查询中一样)单个值确实需要在各种情况下重复使用。或者,您可以在startfield和endfield之间使用反向的
WHERE:dateval
。然后您只需要3个占位符。
  $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')";