PHP.SU

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

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

> Найдено сообщений: 4
anstrem Отправлено: 04 Октября, 2017 - 20:30:05 • Тема: PHP Fatal Error: Call to a member function __toString() on a non-object • Форум: HTTP и PHP

Ответов: 7
Просмотров: 1546
Так с локализацией ошибки более менее разобрался, спасибо подсказавшим выше.
Изначально в ошибке еще цифра была:
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(); вообще Улыбка
anstrem Отправлено: 04 Октября, 2017 - 17:26:39 • Тема: PHP Fatal Error: Call to a member function __toString() on a non-object • Форум: HTTP и PHP

Ответов: 7
Просмотров: 1546
Т.е. ошибка вообще где то в другом файле что ли получается ?
Код то не мой, это 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 дергается в момент ошибки эта функция, чтобы разобраться что там не так... Недовольство, огорчение
anstrem Отправлено: 04 Октября, 2017 - 13:25:08 • Тема: PHP Fatal Error: Call to a member function __toString() on a non-object • Форум: HTTP и PHP

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


Не понял. А поправить то как ?
Код этот юзается часто, а ошибка возникает очень иногда...
Т.е. в какой то момент переменная является не тем чем должна быть, собственно я так понимаю надо просто добавить проверку только вот не пойму на предмет чего ?
Что $key существует или что $key является строкой что ли ?
Или так как это класс объекта, то никак не проверить ?
anstrem Отправлено: 04 Октября, 2017 - 12:14:58 • Тема: PHP Fatal Error: Call to a member function __toString() on a non-object • Форум: HTTP и PHP

Ответов: 7
Просмотров: 1546
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) что то не так ... А как проверку написать чтобы не было ошибки ?

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB