这是我的第一篇文章,所以对我很轻松^ _ ^
当我上传到实时服务器时,我收到以下错误。它在localhost上运行正常,我认为这很奇怪。任何帮助将不胜感激。
Fatal error: Call to a member function close() on a non-object....
它引用的行
$stmt->close();
与DB的连接
$connection=new mysqli($MYSQL_HOST,$MYSQL_USER,$MYSQL_PASS,$DB)or die(mysqli_error($connection));
班级本身。
function getTimes(){ //this method just pulls the results of the query and returns them as an array
global $connection;
$route = $this->route;
$station = $this->station;
$day = $this->day;
// create a prepared statement
if ($stmt = $connection->prepare("select time from timetable where route=? and day=? and station=?")) {
$stmt->bind_param("sss", $route, $day, $station); // bind parameters for markers
$stmt->execute(); //execute query
$stmt->bind_result($col1); //bind result variables
while ($stmt->fetch()){
$results[]=$col1;
}
}
$stmt->close();//close statement
return $results;
}
答案 0 :(得分:3)
您应该将$stmt
放入if if子句中。有可能if(false)仍然可以访问$stmt->close();
答案 1 :(得分:2)
您的问题是$stmt
对象被实例化为if
条件测试的一部分。在它失败的情况下,即当它返回false时,你仍然试图在它上面调用->close()
。我在if
块中移动了方法调用。
现在你需要添加一个else
子句来处理你的脚本无法准备语句的事实,并且假设你说它在本地运行但在你的实时服务器上运行,我建议有一些配置差异导致这里有问题。您需要使用display_errors('1')
和error_reporting(E_ALL)
打开错误处理。不要忘记在让世界处于新剧本之前关闭这些。 :)
function getTimes(){ //this method just pulls the results of the query and returns them as an array
global $connection;
$route = $this->route;
$station = $this->station;
$day = $this->day;
// create a prepared statement
if ($stmt = $connection->prepare("select time from timetable where route=? and day=? and station=?")) {
$stmt->bind_param("sss", $route, $day, $station); // bind parameters for markers
$stmt->execute(); //execute query
$stmt->bind_result($col1); //bind result variables
while ($stmt->fetch()){
$results[]=$col1;
}
$stmt->close();//close statement
}
return $results;
}
答案 2 :(得分:2)
将close()
调用移到if语句中,这样只有在成功创建$stmt
时才会调用它。
// create a prepared statement
if ($stmt = $connection->prepare("select time from timetable where route=? and day=? and station=?")) {
$stmt->bind_param("sss", $route, $day, $station); // bind parameters for markers
$stmt->execute(); //execute query
$stmt->bind_result($col1); //bind result variables
while ($stmt->fetch()){
$results[]=$col1;
}
$stmt->close();//close statement
}
我怀疑您的本地计算机上没有打开错误,但是在您上传到的服务器上,错误已经开启。
此处要解决的根本问题是prepare()
失败的事实。最有可能的问题是服务器上的数据库缺少timetable
表,或者该表缺少一个或多个字段route
,day
或station
。正如cbuckley所说,请检查$connection->error
以获取完整的错误消息。
当您上传到服务器时,您是否还记得在服务器上进行任何数据库结构更改?