Неустранимая ошибка: вызов функции-члена close () для необъекта.Проблема MySQLi - PullRequest
3 голосов
/ 15 марта 2012

это мой первый пост, так что будьте осторожны со мной ^ _ ^

Я получил следующую ошибку при загрузке на живой сервер.Это работает нормально на localhost, который я думал, было странно.Любая помощь будет принята с благодарностью.

Fatal error: Call to a member function close() on a non-object....

Строка, к которой она относится

$stmt->close();

Соединение с БД

$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 ]

3 голосов
/ 15 марта 2012

Вы должны положить $stmt в вас, если предложение.Есть вероятность, что если (ложно) и все равно добраться до вашего $stmt->close();

2 голосов
/ 15 марта 2012

Переместите вызов 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 для полного сообщения об ошибке.

Когда вы загружали на сервер, вы не забыли также внести какие-либо изменения в структуру базы данных на сервере?

2 голосов
/ 15 марта 2012

Ваша проблема заключалась в том, что объект $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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...