我使用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;
}