PHP.SU

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


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

> Без описания
anstrem
Отправлено: 04 Октября, 2017 - 12:14:58
Post Id


Новичок


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


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




PHP Fatal Error: Call to a member function __toString() on a non-object in file.php : eval()'d code on line 29

Ни черта не пойму, что там не объект и откуда лезет __toString(), которой вообще в файле нет

Код там ниже, line 29 пометил

PHP:
скопировать код в буфер обмена
  1.  
  2. foreach($variables as $key => $value) {
  3.                                 if (strlen($value) && !in_array($key, $remove_parameters)) {
  4.                                         $query_string .= strlen($query_string) ? "&" : "";
  5.                                         $query_string .= urlencode($key) . "=" . urlencode($value);
  6.                                         if ($set_hidden_parameters) {
  7. *line 29*       $hidden_parameters .= "<input type=\"hidden\" name=\"" . htmlspecialchars($key) . "\" value=\"";
  8.                                                 $hidden_parameters .= htmlspecialchars($value) . "\" />";
  9.                                         }
  10.                                 }
  11.                         }
  12.  



Видимо в htmlspecialchars($key) что то не так ... А как проверку написать чтобы не было ошибки ?
 
 Top
MouseZver
Отправлено: 04 Октября, 2017 - 12:45:58
Post Id



Новичок


Покинул форум
Сообщений всего: 46
Дата рег-ции: Июнь 2017  
Откуда: php.ru


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




вы пытаетесь заюзать одну переменную где лежит объект класса как строку, пхп понял вас и пошел юзать в том классе магический метод тостринг. Не обнаружив его, отрыгнул ошибку. да отрыгнул так что видно вы используете гавно функцию ebal
(Добавление)
а насчет данного кода ничего не скажешь, ибо вовсе проблема не тут

(Отредактировано автором: 04 Октября, 2017 - 12:48:57)

 
 Top
anstrem
Отправлено: 04 Октября, 2017 - 13:25:08
Post Id


Новичок


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


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




MouseZver пишет:
вы пытаетесь заюзать одну переменную где лежит объект класса как строку, пхп понял вас и пошел юзать в том классе магический метод тостринг. Не обнаружив его, отрыгнул ошибку. да отрыгнул так что видно вы используете гавно функцию ebal
(Добавление)
а насчет данного кода ничего не скажешь, ибо вовсе проблема не тут


Не понял. А поправить то как ?
Код этот юзается часто, а ошибка возникает очень иногда...
Т.е. в какой то момент переменная является не тем чем должна быть, собственно я так понимаю надо просто добавить проверку только вот не пойму на предмет чего ?
Что $key существует или что $key является строкой что ли ?
Или так как это класс объекта, то никак не проверить ?
 
 Top
Мелкий Супермодератор
Отправлено: 04 Октября, 2017 - 14:21:22
Post Id



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


Покинул форум
Сообщений всего: 11601
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Ошибка у вас в коде, который вы скармливаете в eval


-----
PostgreSQL DBA
 
 Top
anstrem
Отправлено: 04 Октября, 2017 - 17:26:39
Post Id


Новичок


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


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




Т.е. ошибка вообще где то в другом файле что ли получается ?
Код то не мой, это CMS-как какая то редкая довольно...

В этом файле который в сообщении об ошибке указывается действительно есть описание функции с eval:
PHP:
скопировать код в буфер обмена
  1.  
  2. function eval_php_code(&$block_body)
  3.         {
  4.                 if (preg_match_all("/(<\?php|<\?)(.*)\?>/Uis", $block_body, $matches)) {
  5.                         for ($p = 0; $p < sizeof($matches[0]); $p++) {
  6.                                 ob_start();
  7.                                 eval($matches[2][$p]);
  8.                                 $output = ob_get_contents();
  9.                                 ob_end_clean();
  10.                                 $block_body = str_replace($matches[0][$p], $output, $block_body);
  11.                         }
  12.                 }
  13.         }
  14.  


Да и весь этот файл по сути это одни описания функций и он просто инклюдится во многие другие php судя по коду.
И там эти функцию юзаются...


А как же блин понять из какого php дергается в момент ошибки эта функция, чтобы разобраться что там не так... Недовольство, огорчение
 
 Top
andrewkard
Отправлено: 04 Октября, 2017 - 18:31:45
Post Id


Участник


Покинул форум
Сообщений всего: 1044
Дата рег-ции: Нояб. 2014  


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




anstrem пишет:
А как же блин понять из какого php дергается в момент ошибки эта функция, чтобы разобраться что там не так...

попробуйте в цикле
anstrem пишет:
foreach($variables as $key => $value) {

проверить, что если $key не является строкой, тогда вызвать

http://php.net/manual/ru/functio...nt-backtrace.php
 
 Top
anstrem
Отправлено: 04 Октября, 2017 - 20:30:05
Post Id


Новичок


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


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




Так с локализацией ошибки более менее разобрался, спасибо подсказавшим выше.
Изначально в ошибке еще цифра была:
PHP Fatal Error: Call to a member function __toString() on a non-object in file.php(1656) : eval()'d code on line 29

Собственно на 1656 как раз стоит eval()
Далее синхронно с этой ошибкой в access логе обнаружил 500-ую ошибку на одной и той же странице.
Это кастомизированная страница которая подгружается из php файла как раз таки этим eval()
и в ней на 29 строке находим наконец ту самую __toString() на которую указывалось в ошибке.

$delivery_city = $xml->ip->city->__toString();

Кусок кода такой:
PHP:
скопировать код в буфер обмена
  1.  
  2. if (!strlen($delivery_city)) {
  3.                 $delivery_city = get_cookie("sl_delivery_city");
  4.                 if (preg_match('#.#u', $delivery_city) != 1) {
  5.                         $delivery_city = iconv("windows-1251", "utf-8", $delivery_city);
  6.                 }
  7.                 if (!strlen($delivery_city)) {
  8.                         include($_SERVER["DOCUMENT_ROOT"]."/includes/geo.php");
  9.                         $my_ip = PMA_getIp();
  10.                         $data = file_get_contents_timeout("http://ipgeobase.ru:7020/geo?ip=".$my_ip);
  11.                         if ($data) {
  12.                                 $xml = simplexml_load_string($data);
  13.                                 $delivery_city = $xml->ip->city->__toString();
  14.                         } else {
  15.                                 try {
  16.                                         $info = geoip_client($my_ip, "7");
  17.                                         $delivery_city = $info[Town];
  18.                                 } catch (Exception $e) {
  19.                                         //echo($e->getMessage());
  20.                                 }
  21.                         }
  22.  
  23. ...
  24.  
  25.  
  26.    if (!strlen($delivery_city)) {
  27.                                 $delivery_city = "Москва"; // Если город не прописан в настройках
  28.    пользователя и никак не определяется по IP - то считаем, что находимся в Москве
  29.                         }
  30.  
  31.  



Можно в этом коде как то избавиться от ошибки с __toString(); ?
Как правильно написать проверку перед $delivery_city = $xml->ip->city->__toString(); ?
Неопределенность самого $delivery_city - по-барабану, там дальше по коду проверяется и если не определен, то присваиваем ему столицу по умолчанию.

Я так понимаю что в каком то случает от http://ipgeobase[dot]ru:7020/geo?ip="[dot]$my_ip прилетает какая то хрень или ничего не прилетает и тогда падаем с ошибкой... т.к. eval не умеет их обрабатывать...
(Добавление)
Вообщем решил вопрос кардинально:
Переделал вызов к ipgeobase немного по другому и убрал __toString(); вообще Улыбка
 
 Top
Vladimir Kheifets
Отправлено: 07 Октября, 2017 - 19:55:54
Post Id



Частый гость


Покинул форум
Сообщений всего: 162
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


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




anstrem пишет:
Изначально в ошибке еще цифра была:
PHP Fatal Error: Call to a member function __toString() on a non-object in file.php(1656) : eval()'d code on line 29
.....
Можно в этом коде как то избавиться от ошибки с __toString(); ?
Как правильно написать проверку перед $delivery_city = $xml->ip->city->__toString(); ?


Добрый вечер!
Написал:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $delivery_city = $xml->ip->city->__toString();

Естественно получил ошибку т.к. $xml не опрелён.
Добавил проверку:
CODE (htmlphp):
скопировать код в буфер обмена
  1. if(is_object( $xml->ip->city))
  2.     $delivery_city = $xml->ip->city->__toString();
  3.  else
  4.     echo "Еrror"

Получил сообщение: Еrror

(Отредактировано автором: 08 Октября, 2017 - 19:53:24)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« HTTP и PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB