это мой первый пост, так что легко на меня ^ _ ^
При загрузке на живой сервер я получаю следующую ошибку. Он работает нормально на 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; }
Вы должны положить $stmt
в вас, если предложение. Существует вероятность того, что if (false) и по-прежнему попадет в ваш $stmt->close();
Ваша проблема заключалась в том, что объект $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; }
Переместите вызов 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
для полного сообщения об ошибке.
Когда вы загружались на сервер, не забыли ли вы также изменить структуру базы данных на сервере?