Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Ошибка Catchable fatal error: Object of class Post could not be converted to string

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Nikita_Barinov
Отправлено: 02 Августа, 2015 - 00:38:15
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Ребят, приветствую!
Хочу реализовать систему вывода комментариев к постам деревом.
Вот первый кусок кода, находящийся в классе Post, наследующий класс Core. Тут у нас получается рекурсивный алгоритм:
PHP:
скопировать код в буфер обмена
  1.  
  2. $content = '';
  3.  
  4. ...
  5.  
  6.  
  7.     $query = $mysqli->query("SELECT `id`, `comment` FROM `comments` WHERE `post_id` = '{$post_id}' AND `id_parent` = 0");
  8.            
  9.             if($query->num_rows > 0) {
  10.                 if($query->num_rows > 0) {
  11.                     while($comment = $mysqli->fetch_assoc($query)) {
  12.                         $id_parent = $comment['id'];
  13.                         $content .= $comment['comment'].'<br>';
  14.                         $this->getCommentsParentDB($mysqli, $id_parent, 1);
  15.                     }              
  16.                 }
  17.             } else {
  18.                 $content .= 'Комментариев нет';
  19.             }
  20.  
  21. ...
  22.  
  23. echo $content;
  24.  

А вот сам метод getCommentsParentDB в классе Core:
PHP:
скопировать код в буфер обмена
  1.  
  2. function getCommentsParentDB($mysqli, $id_parent, $i = 1) {
  3.         global $content;
  4.         $q[$i] = $mysqli->query("SELECT `id`, `comment` FROM `comments` WHERE `post_id` = 8 AND `id_parent` = '{$id_parent}'");
  5.         if($q[$i]->num_rows > 0) {
  6.             while($q[$i + 1] = $mysqli->fetch_assoc($q[$i])) {
  7.                 $id_parent = $q[$i + 1]['id'];
  8.                 for($j = 0; $j < $i; $j++) {
  9. /*185 строка:*/       $content .= '&nbsp;';
  10.                 }
  11.                 $content .= $q[$i + 1]['comment'].'<br>';
  12.                 $this->getCommentsParentDB($mysqli, $id_parent, $i + 2);
  13.             }
  14.         }
  15.     }
  16.  

В итоге мне прилетает вот такая ошибка: Catchable fatal error: Object of class Post could not be converted to string in /Applications/MAMP/htdocs/nn/eng ine/classes/core.class.php on line 185

Сначала пробовал написать процедурно, все прекрасно работает. Переделал под ООП и вот такие дела выскакивают. Никогда с таким не сталкивался. Помогите решить проблему.
 
 Top
Viper
Отправлено: 02 Августа, 2015 - 02:40:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Судя по обрывкам информации, я так понял, что вы хотите получить данные из наследуемого в родительский класс.
global вам тут не поможет. Только замучаетесь потом дебажить.

http://php.net/manual/ru/languag...tic-bindings.php


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Nikita_Barinov
Отправлено: 02 Августа, 2015 - 16:18:59
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Я просто объектно-ориентированным подходом программирую недавно, поэтому возникают такие вот проблемы.

Смотри, вот сейчас у меня в классе Post вот такой код:
PHP:
скопировать код в буфер обмена
  1.  
  2. class Post extends Core {
  3.     function getContent() {
  4.         global $mysqli;
  5.         $content = '';
  6.  
  7.         ... код, выполняя который в переменную $content дописываются данные
  8.  
  9.  
  10. /* 40 строка */        static function getCommentsParentDB($mysqli, $id_parent, $i = 1) {
  11.                 $q[$i] = $mysqli->query("SELECT `id`, `comment` FROM `comments` WHERE `post_id` = 8 AND `id_parent` = '{$id_parent}'");
  12.                 if($q[$i]->num_rows > 0) {
  13.                     while($q[$i + 1] = $mysqli->fetch_assoc($q[$i])) {
  14.                         $id_parent = $q[$i + 1]['id'];
  15.                         for($j = 0; $j < $i; $j++) {
  16.                             $this->content .= '&nbsp;';
  17.                         }
  18.                         $this->content .= $q[$i + 1]['comment'].'<br>';
  19.                         self::getCommentsParentDB($mysqli, $id_parent, $i + 2);
  20.                     }
  21.                 }
  22.             }
  23.            
  24.             $query = $mysqli->query("SELECT `id`, `comment` FROM `comments` WHERE `post_id` = '{$post_id}' AND `id_parent` = 0");
  25.             if($query->num_rows > 0) {
  26.                 if($query->num_rows > 0) {
  27.                     while($comment = $mysqli->fetch_assoc($query)) {
  28.                         $id_parent = $comment['id'];
  29.                         $content .= $comment['comment'].'<br>';
  30.                         self::getCommentsParentDB($mysqli, $id_parent, 1);
  31.                     }              
  32.                 }
  33.             } else {
  34.                 $content .= 'Комментариев нет';
  35.             }
  36.  
  37.         return $content;
  38.     }
  39. }
  40.  


После выполнения скрипта мне выдается такая вот ошибка: Parse error: syntax error, unexpected 'getCommentsParentDB' (T_STRING), expecting '(' in /Applications/MAMP/htdocs/nn/eng ine/classes/post.class.php on line 40

Когда процедурным подходом писал, то все нормально выводилось:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $mysqli = new mysqli('localhost', 'admin', 'admin', 'nn');
  4.  
  5. $query = $mysqli->query("SELECT `id`, `comment` FROM `comments` WHERE `post_id` = 8 AND `id_parent` = 0");
  6.  
  7. $content = '';
  8. if($query->num_rows > 0) {
  9.     while($comment = $query->fetch_assoc()) {
  10.         $id_parent = $comment['id'];
  11.         $content .= $comment['comment'].'<br>';
  12.         getCommentsParentDB($mysqli, $id_parent, 1);
  13.     }
  14. }
  15.  
  16. function getCommentsParentDB($mysqli, $id_parent, $i = 1) {
  17.     global $content;
  18.     $q[$i] = $mysqli->query("SELECT `id`, `comment` FROM `comments` WHERE `post_id` = 8 AND `id_parent` = '{$id_parent}'");
  19.     if($q[$i]->num_rows > 0) {
  20.         while($q[$i + 1] = $q[$i]->fetch_assoc()) {
  21.             $id_parent = $q[$i + 1]['id'];
  22.             for($j = 0; $j < $i; $j++) {
  23.                 $content .= '&nbsp;';
  24.             }
  25.             $content .= $q[$i + 1]['comment'].'<br>';
  26.             getCommentsParentDB($mysqli, $id_parent, $i + 2);
  27.         }
  28.     }
  29. }
  30.  
  31. echo $content;
  32.  


Мне вот нужно именно все полученные данные заносить в переменную $content, по-другому никак.

Буду ОЧЕНЬ благодарен за помощь!

Viper пишет:
Судя по обрывкам информации, я так понял, что вы хотите получить данные из наследуемого в родительский класс.
global вам тут не поможет. Только замучаетесь потом дебажить.

http://php.net/manual/ru/language.oop5.late-static-bindings.php
 
 Top
Viper
Отправлено: 02 Августа, 2015 - 18:01:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Nikita_Barinov пишет:
После выполнения скрипта мне выдается такая вот ошибка: Parse error: syntax error, unexpected 'getCommentsParentDB' (T_STRING), expecting '(' in /Applications/MAMP/htdocs/nn/eng ine/classes/post.class.php on line 40


Открывающую скобку пропустили о чем вам php и сообщил.

А вообще у вас не совсем верно запроектированно.
К примеру у вас есть большой класс для работы с комментариями и вы решили его разделить по выполняемому функционалу. В результате у вас методы дочерних классов должны возвращать готовый для дальнейшей работы результат. А в методах дочерних классов вы спокойно можете обращаться к переменный родительского класса. Что вы собственно и делаете через $this->content.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Nikita_Barinov
Отправлено: 02 Августа, 2015 - 19:13:27
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Viper пишет:
Nikita_Barinov пишет:
После выполнения скрипта мне выдается такая вот ошибка: Parse error: syntax error, unexpected 'getCommentsParentDB' (T_STRING), expecting '(' in /Applications/MAMP/htdocs/nn/eng ine/classes/post.class.php on line 40


Открывающую скобку пропустили о чем вам php и сообщил.

А вообще у вас не совсем верно запроектированно.
К примеру у вас есть большой класс для работы с комментариями и вы решили его разделить по выполняемому функционалу. В результате у вас методы дочерних классов должны возвращать готовый для дальнейшей работы результат. А в методах дочерних классов вы спокойно можете обращаться к переменный родительского класса. Что вы собственно и делаете через $this->content.


В том то и дело, что я ее не пропускал:
PHP:
скопировать код в буфер обмена
  1.  
  2. /* 40 строка */        static function getCommentsParentDB($mysqli, $id_parent, $i = 1) {
  3.  
 
 Top
Viper
Отправлено: 02 Августа, 2015 - 19:29:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Nikita_Barinov можете файл класса прикрепить? Проверю.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Nikita_Barinov
Отправлено: 02 Августа, 2015 - 20:36:08
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Viper пишет:
Nikita_Barinov можете файл класса прикрепить? Проверю.


Д я уже переделал тут немного. Создал класс Comments, который будет отвечать за вывод комментарием, и поместил в отдельный файл, который подключаю.
PHP:
скопировать код в буфер обмена
  1.  
  2. class Comments {
  3.     private $post_id;
  4.     private static $content;
  5.    
  6.     function __construct($post_id, $content) {
  7.         $this->post_id = $post_id;  
  8.         self::$content = $content;  
  9.     }
  10.    
  11.     static function getCommentsParentDB($cont, $post_id, $id_parent, $i) {
  12.         global $mysqli;
  13.         $q[$i] = $mysqli->query("SELECT `id`, `comment` FROM `comments` WHERE `post_id` = '{$post_id}' AND `id_parent` = '{$id_parent}'");
  14.         if($q[$i]->num_rows > 0) {
  15.             while($q[$i + 1] = $mysqli->fetch_assoc($q[$i])) {
  16.                 $id_parent = $q[$i + 1]['id'];
  17.                 for($j = 0; $j < $i; $j++) {
  18.                     $cont .= '&nbsp;';
  19.                 }
  20.                 $cont .= $q[$i + 1]['comment']."<br>";
  21.                 self::$content = $cont;
  22.                 self::getCommentsParentDB(self::$content, $post_id, $id_parent, $i + 1);
  23.             }
  24.         }
  25.     }
  26.    
  27.     function gett() {
  28.         global $mysqli;
  29.         $query = $mysqli->query("SELECT `id`, `comment` FROM `comments` WHERE `post_id` = '{$this->post_id}' AND `id_parent` = 0");
  30.         if($query->num_rows > 0) {
  31.             while($comment = $mysqli->fetch_assoc($query)) {
  32.                 $id_parent = $comment['id'];
  33.                 self::$content .= $comment['comment'].'<br>';
  34.                 self::getCommentsParentDB(self::$content, $this->post_id, $id_parent, 1);
  35.             }
  36.         }
  37.        
  38.         return self::$content;
  39.     }
  40. }
  41.  


А в классе Post я уже создаю объект и обращаюсь к методу gett(). Но опять проблемка вылезла. Вот у меня табличка с комментариями:

Комментария относятся к одному посту, соответственно должны выводится все записи из таблицы. По-сути результат должен быть таким:

Но выводится у меня вот такой результат:

Почему так, непонятно.

(Отредактировано автором: 02 Августа, 2015 - 20:49:07)

 
 Top
Viper
Отправлено: 02 Августа, 2015 - 23:56:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Nikita_Barinov пишет:
Почему так, непонятно
смотрите запросы которые отправляете mysql. Может в логике ошиблись.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Nikita_Barinov
Отправлено: 03 Августа, 2015 - 23:05:32
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Viper пишет:
Nikita_Barinov пишет:
Почему так, непонятно
смотрите запросы которые отправляете mysql. Может в логике ошиблись.


Все, нашел ошибку! Дело не в запросах MySQL было. Нужно было в статистическом методе сохранять полученные данные не в отдельную переменную $cont, а напрямую в self::$content. Теперь все, как надо! Спасибо за то, что натолкнули на статистические свойства и методы!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB