PHP MYSQLI准备语句比较datetime到GetDate()错误

时间:2016-05-21 15:59:09

标签: php datetime mysqli prepare date-comparison

我使用php和mysqli打开了与我的数据库的连接,并使用准备好的语句进行一些查询,其中一切都工作正常,但在此查询中,我尝试仅选择将来的游乐设施,我莫名其妙地失败了将比较添加到GETDATE()

date_default_timezone_set('America/Denver');

if(!($stmt = $con->prepare("SELECT r.destination, r.startDepartureTime, r.seats, r.priceperseat FROM ride r WHERE r.startZipCode = ? AND r.startDepartureTime > GETDATE()"))) echo "Prepare failed: (" . $stmt->errno . ") " . $stmt->error;

if(!$stmt->bind_param("i", $userZipCode)) echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;

$stmt->execute();

$stmt->store_result();
$stmt->bind_result($destination,$departure,$seats,$price);

while($stmt->fetch()){ 
   echo "Destination : $destination Departure Time : $departure Seats Available : $seats Price Per Seat : $price <br>";
}

$stmt->close();

php错误日志在prepare语句行

上报告

PHP注意:尝试获取非对象的属性

因此我们得到了bind_param行

PHP致命错误:在非对象上调用成员函数bind_param()

我最初尝试使用NOW()但尝试了此线程SQL NOW() function not working properly中的所有解决方案并且没有运气。

当我运行没有r.startDepartureTime&gt;的语句时GETDATE()比较一切正常。

我确保数据库中的startDepartureTime列的类型为datetime。以下是一个示例条目:2016-05-21 10:24:00我已经确定确实大于当前时间并且在相同的邮政编码中以确保我不仅仅是收到一个空集。

1 个答案:

答案 0 :(得分:0)

GETDATE()不是MYSQL函数,NOW()应该是您需要的

也许您的意思是使用少于而不是大于查询r.startDepartureTime < NOW()

如果准备失败,那么您需要做一些更积极的事情,只报告错误。所以这种代码会更好用。

此外,如果准备失败,$stmt设置为false,因此使用$stmt->errno等将无法正常工作,实际上会产生更加混乱的错误消息。因此,在这种情况下,您必须使用连接$con来从

中获取错误
$sql = "SELECT r.destination, r.startDepartureTime, 
               r.seats, r.priceperseat 
        FROM ride r 
        WHERE r.startZipCode = ? 
          AND r.startDepartureTime < NOW()";

$stmt = $con->prepare($sql);

if($stmt === false) {
   echo "Prepare failed: {$con->errno} : {$con->error}";
   exit;
}