<MyRusakov.ru />

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Видеокурс "Фреймворк Yii 2.0 с нуля. Пример создания сайта" обучит Вас созданию профессиональных сайтов с использованием фреймворка Yii. В курсе есть 2 раздела: теоретический и практический. В теоретическом разделе будут разобраны возможности фреймворка Yii с примерами их использования, а в практической части будет создан сайт Blog.MyRusakov.ru с помощью полученных знаний из теоретического раздела.

Так же почти ко всем урокам идут упражнения для закрепления материала из урока на практике.

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

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

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

Ответить

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