<MyRusakov.ru />

Создание движка на PHP и MySQL 2.0

Создание движка на PHP и MySQL 2.0

Видеокурс "Создание движка на PHP и MySQL 2.0" научит Вас создавать профессиональные движки для сайтов на PHP и MySQL с использованием ООП и паттерна MVC.

В курсе разобрана вся теория по структуре движка: как всё устроено, какие должны быть объекты, какая у них иерархия и как они взаимодействуют между собой.

В практической части будет создан движок с чистого листа. Будет создано ядро, все адаптеры, все вспомогательные классы, а также классы для работы с объектами базы данных. И чтобы курс был максимально полезным, будет создан движок для сайта MyRusakov.ru.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Function fetch_assoc() on a non-object

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, содержится ошибка.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (37):

alexEvp alexEvp 21.01.2013 20:08:47

Здравствуйте, Михаил. Столкнулся с проблемой  "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(); } ?> Названия таблиц написаны верно. В чём может быть проблема?

Ответить

Admin Admin 21.01.2013 20:56:50

`articles`, а не 'articles'.

Ответить

alexEvp alexEvp 21.01.2013 21:44:12

Спасибо за оперативный ответ, но ничего не изменилось. Ошибка всё также выдаётся

Ответить

Admin Admin 22.01.2013 10:36:53

Соблюдайте регистр $mysqli. Нельзя писать $MySQL, потом $mySQl, потом $mysql.

Ответить

serebann serebann 11.03.2013 13:11:12

Добрый день, подскажите пож. как мне решить данную проблему.После урока 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 Хотелось бы понять причину и самостоятельно исправлять в будущем.

Ответить

Admin Admin 11.03.2013 23:08:19

Скорее всего проблема в функции connectDB(), которая не возвращает mysqli.

Ответить

serebann serebann 11.03.2013 23:30:37

Михаил, огромное спасибо за граммотную подсказку, я исправил ошибку и всё заработало "пароль изменён". Но вот с 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; }

Ответить

Admin Admin 12.03.2013 10:16:00

Прочитайте статью на этой странице.

Ответить

serebann serebann 12.03.2013 14:00:27

Разобрался спасибо.

Ответить

vodila vodila 15.03.2013 01:53:56

а как мне это ошибку убрать? 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)

Ответить

Admin Admin 15.03.2013 11:51:18

Перечитайте ещё раз статью.

Ответить

vodila vodila 15.03.2013 21:22:21

Уже раз 50 прочитал, так и не понял как ее исправить!)

Ответить

bas bas 26.06.2013 20:00:26

Михаил, приветствую! я, признаюсь, чайник, поэтому прошу строго не судить, если не разобрался в статье. У меня есть сайт и с ним возникла проблема после переноса с одного аккаунта на другой в пределах одного хостинг-провайдера - мажордомо. Проблема заключается в следущем: при попытке войти на сайт для редактирования выскакивает ошибка: 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; прошу помочь найти и исправить ошибку!

Ответить

Admin Admin 26.06.2013 20:19:53

$SESS_SQL - вот это не является объектом, поэтому никакие методы вызывать у него нельзя.

Ответить

bas bas 26.06.2013 20:44:23

как понять что должно быть вместо $SESS_SQL?

Ответить

Admin Admin 27.06.2013 04:16:42

Странный вопрос, если, конечно, Вы этот код откуда-то не скопировали. Если его откуда-то скопировали, то удаляйте и пишите всё сами. Не знаете PHP, тогда вот: http://myrusakov.ru/php-how-study.html

Ответить

Sergey___ Sergey___ 14.10.2013 14:04:23

При изучении бесплатного курса по основам 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, очень помог !!!

Ответить

tanysha86 tanysha86 03.11.2013 20:55:54

Добрый день, Михаил! Подскажите, пожалуйста, у меня следующая проблема: делаю все по Вашему примеру, но почему-то метод fetch_assoc() выводит лишь указанные в select значения 1-й строки.Хотя, если вернуть значения num_row, то выводиться правильное количество строк БД.

Ответить

Admin Admin 03.11.2013 21:41:44

Здесь уже ошибка при выводе записей, а сам запрос, скорее всего, правильный.

Ответить

tanysha86 tanysha86 06.11.2013 10:08:01

Извините, Михаил, что я еще раз надоедаю с тем же самым вопросом, но я просто не знаю что мне делать. Вот мой запросик (<?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, результат такой же выводится только одна строка БД. Еще раз прошу извинения, за надоедливость.

Ответить

Admin Admin 06.11.2013 11:54:31

($row=$result_set->fetch_assoc()) != false) { return $row; } - тут return явно не нужен, очевидно же, что при первой же итерации будет выход из функции, и ни о каком переборе идти и речи не может. Нужно эту строку либо добавлять в другой массив, либо можно сделать print_r($row).

Ответить

tanysha86 tanysha86 07.11.2013 19:19:26

Спасибо БОЛЬШОЕ, Михаил! Вы мне очень помогли.

Ответить

hirurgees hirurgees 10.11.2013 15:29:51

Здравствуй Михаил, у меня такая настала тупиковая ситуация, повторял по твоим бесплатным урокам все в точности со своим сайтом и застрял на моменте когда стал проверять строкой print_r($articles) ; в блочном файле articles.php и мне вывело на экран вместо списка статей лишь эту запись Array() вместо блоков со статьями, что-то с блоком intro_article.php ,то ли с базой данных денвера не могу сообразить :(

Ответить

hirurgees hirurgees 10.11.2013 16:22:05

Извиняюсь! Пока ждал ответа, еще раз просматривая все на синтаксические ошибки нашел погрешность своей записи, в файле functions.php я ошибся в строчке $arrеy[] = $row; а надо было $array[] = $row; ,теперь все заработало :)

Ответить

tanysha86 tanysha86 28.12.2013 20:55:24

Добрый день, Михаил! Может я задаю немного не в том разделе, подскажите пожалуста, в уроке "Вывод всех пользователей на сайте" на вашем блоге вы говорите, что result_set это не совсем массив (и перебираете его в цикле), объясните, пожалуста это по подробнее что хранитв себе переменная result_set. Извините за тупой вопрос , заранее спасибо.

Ответить

alexandrdante alexandrdante 28.12.2013 20:57:48

Думаю тут рассказано довольно подробно: http://myrusakov.ru/mysql-query.html

Ответить

tanysha86 tanysha86 28.12.2013 21:21:11

Вроде ясно, спасибо

Ответить

adilet970113 adilet970113 10.02.2014 15:00:08

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 Пожалуйста подскажите что делать? Все читал статью все комментарии,но все-таки не понял. Заранее БОЛЬШОЕ СПАСИБО!!!

Ответить

tikkiwiki tikkiwiki 12.02.2014 12:19:04

В службу поддержки обратитесь пожалуйста.

Ответить

Ruslan2210 Ruslan2210 24.01.2015 07:36:58

Здравствуйте,я просмотрел ваш видео урок по "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();}}} Подскажите пжл как решить эту задачу,или хотя бы подскажите где смотреть

Ответить

alexandrdante alexandrdante 24.01.2015 09:13:12

Вам ответили в службе поддержки.Не дублируйте сообщения,пожалуйста

Ответить

korsar328 korsar328 28.01.2015 16:22:53

прохожу курс движок на 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);. Скажите, что где не так?

Ответить

shokin shokin 27.03.2015 08:57:22

Здравствуйте, Михаил. Изучал бесплатный курс по основам php, вылезла ошибка Function fetch_assoc() on a non-object, долго ковырялся, причина оказалось в некорректном запросе к БД, есть двойные кавычки, есть одинарные, и есть обратный апостроф, на видео не очень хорошо видно и новички могут запросто перепутать одинарные кавычки и обратный апостроф. Нужен обратный апостроф. Может кому пригодиться.

Ответить

S S 01.06.2015 23:58:21

Добрый день Михаил. Я пилю пробный сайт, просмотрев Ваш курс. И вот такая проблема выскочила:Устанавливаю соединение с базой, посылаю запрос, перебираю rezult_set в цикле, но возвращает он всего 1 запись. Если не сложно помогите разобратьсяся. Извеняюсь за глупый вопрос. Вот ссылка на картинку: http://hostingkartinok.com/show-image.php?id=cb1436bffd53dd75ee092224fc3eaa0c .Кодировка в базе ср1251. Большое спасибо.

Ответить

arslawa arslawa 08.02.2016 17:50:39

Михаил, доброе время суток. Изучаю ваш бесплатный курс по основам 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" Не подскажете, где я накосячил, хотя бы в каком направлении искать?

Ответить

art art 10.07.2016 17:07:28

Приветствую Михаил!!!пытаюсь учится по вашим урокам....получается с переменным успехом...все из за того что нет к видео урокам исходников....можно выложить их( говорю про бесплатный видеокурс)

Ответить

ZiP ZiP 01.10.2016 03:48:21

Доброго времени суток, возникла проблема именно с ошибкой: "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. Не охота увеличивать код в строчках и прибегать к методу, что я использовал на первом тестовом сайте.

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.