Function fetch_assoc() on a non-object
Одной из самых популярных ошибок, с которой мне и моим ученикам приходится сталкиваться, это "Function fetch_assoc() on a non-object". Регулярно мне присылают вопросы с этой ошибкой и спрашивают, что делать. Давайте с Вами разберём основные причины возникновения данной ошибки.
В оригинале данная ошибка означает, что мы пытаемся вызвать метод fetch_assoc() у не объекта. Например, она возникнет здесь:
<?php
$x = false;
$x->fetch_assoc();
?>
У нас переменная "x" является булевской, поэтому никаких методов у неё нет, о чём и сообщает нам PHP. Но это базовая ошибка, которую вряд ли кто-то допустит. Поэтому чаще всего "Function fetch_assoc() on a non-object" является лишь следствием другой ошибки, на которую PHP не реагирует:
<?php
$result_set = $mysqli->query("SELECT * FROM WHERE `id`='3'");
$row = $result_set->fetch_assoc();
?>
У нас возникает всё та же ошибка, но теперь она не очевидна. Данная ошибка нам сообщает, что переменная "result_set" не является объектом. Движемся дальше, а почему она не является объектом, где мы её определили? Поднимаем глаза выше и видим, что в неё мы должны поместить результат выборки. И вот именно в этой строчке и содержится ошибка. Если бы $mysqli был не объектом, или мы бы ошиблись с написанием метода query(), нам бы PHP об этом сразу сообщил.
Следовательно, вся проблема в строковой переменной с запросом. Разумеется, на содержимое строки PHP никак не реагирует, но в этом запросе содержится ошибка. Внимательно к нему приглядевшись, можно заметить, что там не хватает названия таблицы.
Исправив запрос, ошибка "Function fetch_assoc() on a non-object" исчезнет. Как видите, в большинстве случаев данная ошибка возникает именно из-за неправильного запроса.
Цель данной статьи была не только рассказать об этой ошибке, но и показать, что не надо зацикливаться на той строке, где, как показывает PHP, содержится ошибка.
-
- Михаил Русаков
Комментарии (39):
Здравствуйте, Михаил. Столкнулся с проблемой "Fatal error: Call to a member function query() on a non-object" при выполнении Вашего урока по созданию сайта. Вот код: <?php $mySqli = false; function connectDB() { global $mySqli; $mySqli = new mysqli ("localhost", "root", "", "evpatkurort-local"); $mySqli ->query("SET NAMES 'utf8'"); } function getAllArticles () { global $mysqli; connectDB(); $result_set = $mysqli->query ("SELECT * FROM 'articles'"); closeDB(); return resultSetToArray ($result_set); } function resultSetToArray ($result_set) { $array= array(); while (($row=$result_set->fetch_assoc()) != false); $array[]=$row; return $array; } function closeDB() { global $mySqli; $mySqli->close(); } ?> Названия таблиц написаны верно. В чём может быть проблема?
Ответить
`articles`, а не 'articles'.
Ответить
Спасибо за оперативный ответ, но ничего не изменилось. Ошибка всё также выдаётся
Ответить
Соблюдайте регистр $mysqli. Нельзя писать $MySQL, потом $mySQl, потом $mysql.
Ответить
Добрый день, подскажите пож. как мне решить данную проблему.После урока editprofile возникла ошибка, собственно вот она Fatal error: Call to a member function query() on a non-object in S:\home\mysite.local\www\lib\functions.php on line 103 Вот сама функция: function setPassword($email, $password) { if (($email == "") || ($password == "")) return false; $mysqli = connectDB(); $mysqli->query("UPDATE `users` SET `password`='$password' WHERE `email`='$email'"); closeDB($mysqli); } То же самоу и с уроком allusers Хотелось бы понять причину и самостоятельно исправлять в будущем.
Ответить
Скорее всего проблема в функции connectDB(), которая не возвращает mysqli.
Ответить
Михаил, огромное спасибо за граммотную подсказку, я исправил ошибку и всё заработало "пароль изменён". Но вот с allusers посложнее будет, ошибка изначально такая Fatal error: Call to a member function query() on a non-object in S:\home\mysite.local\www\lib\functions.php on line 110 я внёс изменения function getAllUsers() { global $mysqli; connectDB(); $result_set = $mysqli->query("SELECT * FROM `users` WHERE activation=''"); closeDB($mysqli); return resultToArray($result_set); } И появилась другая ошибка Fatal error: Call to a member function fetch_assoc() on a non-object in S:\home\mysite.local\www\lib\functions.php on line 118 function resultToArray($result_set) { $results = array(); while (($row = $result_set->fetch_assoc()) != false) { $results[] = $row; } return $results; }
Ответить
Прочитайте статью на этой странице.
Ответить
Разобрался спасибо.
Ответить
а как мне это ошибку убрать? Fatal error: Call to a member function fetch_assoc() on a non-object in P:\home\my-bike-site.ru\www\lib\functions.php on line39 вот 39 строка while (($row = $result_set->fetch_assoc()) != false)
Ответить
Перечитайте ещё раз статью.
Ответить
Уже раз 50 прочитал, так и не понял как ее исправить!)
Ответить
Михаил, приветствую! я, признаюсь, чайник, поэтому прошу строго не судить, если не разобрался в статье. У меня есть сайт и с ним возникла проблема после переноса с одного аккаунта на другой в пределах одного хостинг-провайдера - мажордомо. Проблема заключается в следущем: при попытке войти на сайт для редактирования выскакивает ошибка: Fatal error: Call to a member function Exists() on a non-object in /home/u123733/nw-spbru/www/manager/include/_sessions.php on line 61 код функции: function sess_write($key,$val){ global $PHPSECURITYADMIN_PATH,$SESS_SQL,$SESS_LIFE; // Calculate the session end time $expiry=time()+$SESS_LIFE; $value=addslashes($val); $q="select sesskey from ".sessions." where sesskey='$key'"; if($SESS_SQL->Exists($query)){ // If the session exists, update it $query="update ".sessions." set expiry=$expiry, value='$value' where sesskey='$key' and expiry > ".time(); $SESS_SQL->Update($query); }else{ // If the session doesn't exist, create it $query="insert into ".sessions." values('$key',$expiry,'$value')"; $SESS_SQL->Insert($query); } return TRUE; прошу помочь найти и исправить ошибку!
Ответить
$SESS_SQL - вот это не является объектом, поэтому никакие методы вызывать у него нельзя.
Ответить
как понять что должно быть вместо $SESS_SQL?
Ответить
Странный вопрос, если, конечно, Вы этот код откуда-то не скопировали. Если его откуда-то скопировали, то удаляйте и пишите всё сами. Не знаете PHP, тогда вот: http://myrusakov.ru/php-how-study.html
Ответить
При изучении бесплатного курса по основам php, возникла проблема Function fetch_assoc() on a non-object при выводе страниц по get параметру. Ошибка при обращении к базе данных. В моём случае, обращение к базе данных из курса "SELECT * FROM `articles` WHERE `id`='$id' Ошибка была орфографической , допущенная мной. Проблему с запросом решил двумя вариантами через 3 дня )). SELECT articles.* FROM `articles` WHERE articles.id=$id и вложенным запросом SELECT * FROM `articles` WHERE `id` IN (SELECT '$id' ) ,а только потом, нашел свою ошибку "WERE" при написании запроса из курса)). Спасибо Михаилу за бесплатный курс php, очень помог !!!
Ответить
Добрый день, Михаил! Подскажите, пожалуйста, у меня следующая проблема: делаю все по Вашему примеру, но почему-то метод fetch_assoc() выводит лишь указанные в select значения 1-й строки.Хотя, если вернуть значения num_row, то выводиться правильное количество строк БД.
Ответить
Здесь уже ошибка при выводе записей, а сам запрос, скорее всего, правильный.
Ответить
Извините, Михаил, что я еще раз надоедаю с тем же самым вопросом, но я просто не знаю что мне делать. Вот мой запросик (<?php class User { private $db; public function __construct() { $this->db=new mysqli('localhost', 'root', '', 'my'); $this->db->query("SET NAME 'utf8'"); } public function viuser() { $result_set=$this->db->query("SELECT `name_user`, `text_user` FROM `text_for_user`"); while (($row=$result_set->fetch_assoc()) != false) { return $row; } } public function __destruct() { if ($this->db) $this->db->close(); } } $user=new User(); $name_user_row2=$user->viuser(); print_r ($name_user_row2); ?> ). Что можно сделать еще, какие методы применить, чтобы вывелся массив именно ВСЕХ рядов(строк) таблицы. А не последнего введенного или первого. P.S. пробовала метод fetch_array, результат такой же выводится только одна строка БД. Еще раз прошу извинения, за надоедливость.
Ответить
($row=$result_set->fetch_assoc()) != false) { return $row; } - тут return явно не нужен, очевидно же, что при первой же итерации будет выход из функции, и ни о каком переборе идти и речи не может. Нужно эту строку либо добавлять в другой массив, либо можно сделать print_r($row).
Ответить
Спасибо БОЛЬШОЕ, Михаил! Вы мне очень помогли.
Ответить
Здравствуй Михаил, у меня такая настала тупиковая ситуация, повторял по твоим бесплатным урокам все в точности со своим сайтом и застрял на моменте когда стал проверять строкой print_r($articles) ; в блочном файле articles.php и мне вывело на экран вместо списка статей лишь эту запись Array() вместо блоков со статьями, что-то с блоком intro_article.php ,то ли с базой данных денвера не могу сообразить :(
Ответить
Извиняюсь! Пока ждал ответа, еще раз просматривая все на синтаксические ошибки нашел погрешность своей записи, в файле functions.php я ошибся в строчке $arrеy[] = $row; а надо было $array[] = $row; ,теперь все заработало :)
Ответить
Добрый день, Михаил! Может я задаю немного не в том разделе, подскажите пожалуста, в уроке "Вывод всех пользователей на сайте" на вашем блоге вы говорите, что result_set это не совсем массив (и перебираете его в цикле), объясните, пожалуста это по подробнее что хранитв себе переменная result_set. Извините за тупой вопрос , заранее спасибо.
Ответить
Думаю тут рассказано довольно подробно: http://myrusakov.ru/mysql-query.html
Ответить
Вроде ясно, спасибо
Ответить
function resultSetToArray ($result_set) { $array = array(); while (($row = $result_set->fetch_assoc()) != false) $array[] = $row; return $array; } ошибка: Fatal error: Call to a member function fetch_assoc() on a non-object in functions.php on line 19 Пожалуйста подскажите что делать? Все читал статью все комментарии,но все-таки не понял. Заранее БОЛЬШОЕ СПАСИБО!!!
Ответить
В службу поддержки обратитесь пожалуйста.
Ответить
Здравствуйте,я просмотрел ваш видео урок по "cозданию движка на php" и у меня ошибка: Fatal error: Call to a member function action404() on a non-object in route_class.php on line class Route {public static function start() {$ca_names = URL::getControllerAndAction();$controller_name = $ca_names[0]."Controller";$action_name = "action".$ca_names[1];try {if (class_exists($controller_name)) $controller = new $controller_name();if (method_exists($controller, $action_name)) $controller->$action_name();else throw new Exception();} catch (Exception $e) {if ($e->getMessage() != "ACCESS_DENIED") $controller->action404();}}} Подскажите пжл как решить эту задачу,или хотя бы подскажите где смотреть
Ответить
Вам ответили в службе поддержки.Не дублируйте сообщения,пожалуйста
Ответить
прохожу курс движок на PHP и MySQL 2.0, возник вопрос, вылезает ошибка: Fatal error: Call to a member function select() on a non-object in Z:\home\mysite.biz\www\objects\articledb_class.php on line 30. вот код этой строки: $data = self::$db->select($select);. Скажите, что где не так?
Ответить
Здравствуйте, Михаил. Изучал бесплатный курс по основам php, вылезла ошибка Function fetch_assoc() on a non-object, долго ковырялся, причина оказалось в некорректном запросе к БД, есть двойные кавычки, есть одинарные, и есть обратный апостроф, на видео не очень хорошо видно и новички могут запросто перепутать одинарные кавычки и обратный апостроф. Нужен обратный апостроф. Может кому пригодиться.
Ответить
Добрый день Михаил. Я пилю пробный сайт, просмотрев Ваш курс. И вот такая проблема выскочила:Устанавливаю соединение с базой, посылаю запрос, перебираю rezult_set в цикле, но возвращает он всего 1 запись. Если не сложно помогите разобратьсяся. Извеняюсь за глупый вопрос. Вот ссылка на картинку: http://hostingkartinok.com/show-image.php?id=cb1436bffd53dd75ee092224fc3eaa0c .Кодировка в базе ср1251. Большое спасибо.
Ответить
Михаил, доброе время суток. Изучаю ваш бесплатный курс по основам PHP, подумываю купить более полный. У меня закавыка, в уроке по генерации страниц брайзер выдает такую ошибку "Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in Z:\home\mysite.local\www\lib\functions.php on line 17" Не подскажете, где я накосячил, хотя бы в каком направлении искать?
Ответить
Приветствую Михаил!!!пытаюсь учится по вашим урокам....получается с переменным успехом...все из за того что нет к видео урокам исходников....можно выложить их( говорю про бесплатный видеокурс)
Ответить
Доброго времени суток, возникла проблема именно с ошибкой: "Fatal error: Call to a member function fetch_assoc() on a non-object", прочитал статью, но ничего не помогло, даже в комментариях не нашёл ответа. Делал всё по твоему уроку, но ничего не изменилось. Вот код подключения к базе: [code] function connectDB(){ return new mysqli('localhost', 'admin', 'password', 'testsite2'); } [/code] А вот где выдаёт ошибку: [code] function checkUsersLogin($login){ $mysqli = connectDB(); if ($mysqli->connect_errno) { printf("Соединение не удалось: %s\n", $mysqli->connect_error); exit(); } $result_set = $mysqli->query("SELECT * FROM `users` WHERE `login`=$login"); $row = $result_set->fetch_assoc();//тут фатал $result_set->close(); closeDB($mysqli); return $row['login']; } [/code] Как можно заметить, то я делаю проверку после подключения к базе данных, но она молчит, следовательно где то косяк связанный именно с "fetch_assoc()", но я не могу понять где именно, ведь всё вроде бы правильно написано. Что не так? P.S. Не охота увеличивать код в строчках и прибегать к методу, что я использовал на первом тестовом сайте.
Ответить
Здравствуйте, я, конечно, понимаю, что этот вопрос избитый донельзя, но всё-таки выше Вы несколько раз разбираете мою проблему, но код с запросом я прямо внимательно перепроверила, он был заимствован из урока: $result_set = $mysqli->query ("SELECT password FROM users WHERE login ='$login'"); $user = $result_set->fetch_assoc(); помогите, пожалуйста :-(
Ответить
Доброго времени суток не могу разобраться все время ошибка выскакивает function search($words) { $words = htmlspecialchars($words); if ($words === "") return false; $query_search = ""; $arraywords = explode(" ", $words); foreach($arraywords as $key => $value) { if (isset($arraywords[$key - 1])) $query_search .= ' OR '; $query_search .= '`codes` LIKE "%'.$value.'%" OR `title` LIKE "%'.$value.'%"'; } $query = "SELECT * FROM `table-etsng` WHERE $query_search"; echo $query; $con = mysqli_connect($server, $user, $password, $db); $result_set = $con->query($query); $i = 0; while($row = $result_set->fetch_assoc()) { $result_set[$i] = $row; $i++; } return $results; } if (isset($_POST['bsearch'])) { $words = $_POST['words']; $results = search($words); print_r($results); } SELECT * FROM `table-etsng` WHERE `codes` LIKE "%овес%" OR `title` LIKE "%овес%" Fatal error: Call to a member function fetch_assoc() on a non-object in M:\home\proba.ru\www\search.php on line 23
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.