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