PHP MYSQLI准备的语句将datetime与GetDate()进行比较



我使用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(()函数无法正常工作,因此运气不佳。

当我运行没有r.startDepartmentTime>GETDATE()比较的语句时,一切都很好。

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

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;
}

最新更新