Форумы портала PHP.SU » » HTTP и PHP » PHP Fatal Error: Call to a member function __toString() on a non-object

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

1. anstrem - 04 Октября, 2017 - 12:14:58 - перейти к сообщению
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) что то не так ... А как проверку написать чтобы не было ошибки ?
2. MouseZver - 04 Октября, 2017 - 12:45:58 - перейти к сообщению
вы пытаетесь заюзать одну переменную где лежит объект класса как строку, пхп понял вас и пошел юзать в том классе магический метод тостринг. Не обнаружив его, отрыгнул ошибку. да отрыгнул так что видно вы используете гавно функцию ebal
(Добавление)
а насчет данного кода ничего не скажешь, ибо вовсе проблема не тут
3. anstrem - 04 Октября, 2017 - 13:25:08 - перейти к сообщению
MouseZver пишет:
вы пытаетесь заюзать одну переменную где лежит объект класса как строку, пхп понял вас и пошел юзать в том классе магический метод тостринг. Не обнаружив его, отрыгнул ошибку. да отрыгнул так что видно вы используете гавно функцию ebal
(Добавление)
а насчет данного кода ничего не скажешь, ибо вовсе проблема не тут


Не понял. А поправить то как ?
Код этот юзается часто, а ошибка возникает очень иногда...
Т.е. в какой то момент переменная является не тем чем должна быть, собственно я так понимаю надо просто добавить проверку только вот не пойму на предмет чего ?
Что $key существует или что $key является строкой что ли ?
Или так как это класс объекта, то никак не проверить ?
4. Мелкий - 04 Октября, 2017 - 14:21:22 - перейти к сообщению
Ошибка у вас в коде, который вы скармливаете в eval
5. anstrem - 04 Октября, 2017 - 17:26:39 - перейти к сообщению
Т.е. ошибка вообще где то в другом файле что ли получается ?
Код то не мой, это 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 дергается в момент ошибки эта функция, чтобы разобраться что там не так... Недовольство, огорчение
6. andrewkard - 04 Октября, 2017 - 18:31:45 - перейти к сообщению
anstrem пишет:
А как же блин понять из какого php дергается в момент ошибки эта функция, чтобы разобраться что там не так...

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

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

http://php.net/manual/ru/functio...nt-backtrace.php
7. anstrem - 04 Октября, 2017 - 20:30:05 - перейти к сообщению
Так с локализацией ошибки более менее разобрался, спасибо подсказавшим выше.
Изначально в ошибке еще цифра была:
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(); вообще Улыбка
8. Vladimir Kheifets - 07 Октября, 2017 - 19:55:54 - перейти к сообщению
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

 

Powered by ExBB FM 1.0 RC1