致命错误:在非对象上调用成员函数close()。 MySQLi问题

时间:2012-03-15 14:46:52

标签: php class mysqli

这是我的第一篇文章,所以对我很轻松^ _ ^

当我上传到实时服务器时,我收到以下错误。它在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;
    }

3 个答案:

答案 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表,或者该表缺少一个或多个字段routedaystation。正如cbuckley所说,请检查$connection->error以获取完整的错误消息。

当您上传到服务器时,您是否还记得在服务器上进行任何数据库结构更改?