Я просто пытаюсь выполнить PDO, и я получаю эту ошибку. Fatal error: вызов функции-члена функции fetch () для не-объекта, но разве он уже не находится в объекте $ this-> db?
class shoutbox { private $db; function __construct($dbname, $username, $password, $host = "localhost" ) { # db conections try { $this->db = new PDO("mysql:host=".$hostname.";dbname=".$dbname, $username, $password); } catch(PDOException $e) { echo $e->getMessage(); } } function getShouts() { $sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, time FROM shouts WHERE pmuserid == 0'); return $sql_shouts->fetch(PDO::FETCH_OBJ); } }
Посмотрите внимательно на документацию для PDO :: query , в частности раздел «Возвращаемые значения»:
PDO :: query () возвращает объект PDOStatement или FALSE при сбое.
Важным битом является «FALSE on failure». FALSE не является объектом, поэтому вызов -> fetch () – плохая новость.
Вероятно, ошибка связана с использованием оператора сравнения «==». В SQL это просто «=».
Вы должны проверить, что $sql_shouts
не является ложным, а затем сделать что-то умное с ошибкой, если оно есть:
<?PHP $sql_shouts = $this->db->query('...'); if ($sql_shouts === false){ $errorInfo = $this->db->errorInfo(); //log the error or take some other smart action } return $sql_shouts->fetch(PDO::FETCH_OBJ);
Я бы сказал, что ваш запрос не выполняется из-за неправильного синтаксиса. Вы действительно должны проверить статическую функцию errorinfo PDO, чтобы увидеть, был ли запрос вычеркнут или нет.
Вот потенциальный правильный оператор SQL:
$sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, `time` FROM shouts WHERE pmuserid = 0');
Я считаю, что время – это зарезервированное слово в MySQL. Я бы рекомендовал использовать другое имя, но включение его в обратные ссылки облегчит эту проблему. 1 знак равенства используется для mysql, а не для двух. Но да, загляните в функцию errorinfo, чтобы определить, завершился ли ваш запрос из-за синтаксической ошибки и обработал ее изящно.
Это происходит, когда таблица также не существует. убедитесь, что он на самом деле существует, и не только является держателем в базе данных из-за ошибок жесткого диска.
Когда это произойдет, я предлагаю вам воссоздать базу данных / таблицу.
Я получил это сообщение об ошибке из-за глупой ошибки с помощью скобок. Он был вложен внутри оператора if и просто не видел его.
db_query("SELECT thing FROM table WHERE var=:var", array(":var" => $var)->fetchField());
Мне потребовалось некоторое время, чтобы понять, что я не закрыл консоль db_query в нужном месте. Может быть, это помогает кому-то еще взглянуть на это удивление wth. Верный:
db_query("SELECT thing FROM table WHERE var=:var", array(":var" => $var))->fetchField();