[Модуль] Погода Яндекс (yandexweather)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Dmitriy Wizen
Сообщения: 12
Зарегистрирован: Чт июн 21, 2018 12:55 am
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] Яндекс погода 2018

Сообщение Dmitriy Wizen » Чт июн 21, 2018 1:06 am

точно такие же ошибки на RasPi3.
Warning: strlen() expects parameter 1 to be string, array given in C:\_majordomo\htdocs\lib\caching.class.php on line 19
и
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\_majordomo\htdocs\lib\mysqli.class.php on line 227
Недели две уже.
только что удалил объекты и модуль, и поставил заново. Ошибки теже.

Что еще можно попробовать сделать?
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: [Модуль] Яндекс погода 2018

Сообщение directman66 » Чт июн 21, 2018 5:06 am

Какая версия php у вас стоит?
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Dmitriy Wizen
Сообщения: 12
Зарегистрирован: Чт июн 21, 2018 12:55 am
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] Яндекс погода 2018

Сообщение Dmitriy Wizen » Чт июн 21, 2018 9:38 am

Версия, судя по всему 7,0
в логах после каждого запроса погоды вот такое:
Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/scripts/cycle_yandexweather.php:19) in /var/www/html/modules/yandexweather/get.inc.php on line 55

Warning: strlen() expects parameter 1 to be string, array given in /var/www/html/lib/caching.class.php on line 19

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/lib/mysqli.class.php on line 227

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/lib/mysqli.class.php on line 227
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: [Модуль] Яндекс погода 2018

Сообщение directman66 » Чт июн 21, 2018 11:17 am

У меня таких ошибок почему-то не наблюдается.
Dmitriy Wizen писал(а):
Чт июн 21, 2018 9:38 am
Версия, судя по всему 7,0
в логах после каждого запроса погоды вот такое:
Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/scripts/cycle_yandexweather.php:19) in

/var/www/html/modules/yandexweather/get.inc.php on line 55
Попробовал исправить, проверьте.
Dmitriy Wizen писал(а):
Чт июн 21, 2018 9:38 am
Warning: strlen() expects parameter 1 to be string, array given in /var/www/html/lib/caching.class.php on line 19
strlen() видимо из другого проекта, в моем коде его нет.
Dmitriy Wizen писал(а):
Чт июн 21, 2018 9:38 am
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/lib/mysqli.class.php on line 227

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/lib/mysqli.class.php on line 227
причину этого сложно установить.
Эта ошибка - вторичная. И в правильно спроектированном приложении возникать в принципе не должна.

Она лишь сигнализирует о том, что предыдущая функция, которая выполняла SQL запрос, окончилась неудачей, но при этом о причине неудачи никакой информации не несёт.

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

Вызывая функцию mysql_query(), необходимо всегда проверять результат её работы. И если функция вернула не корректный ресурс, а пустоту, то необходимо, во-первых, получить от mysql сообщение об ошибке, а во-вторых, транслировать его в ошибку РНР (это принципиальный момент, которого начинающие пользователи РНР не понимают поголовно). А в-третьих, очень полезно бывает добавить в сообщение об ошибке сам запрос.

За первое отвечает функция mysql_error(), за второе - trigger_error(), а для третьего необходимо всегда сначала присваивать запрос переменной. Таким образом, любой вызов mysql_query() должен выглядеть так:
Эта ошибка возникает, если запрос не может быть выполнен. Функции, которые могут к ней привести:

mysql_fetch_array/mysqli_fetch_array()
mysql_fetch_assoc()/mysqli_fetch_assoc()
mysql_num_rows()/mysqli_num_rows()
Если с запросом всё в порядке, и просто результат его выполнения пустой, то ошибка не возникает. К ошибке приводит только неверный синтаксис SQL.

Как найти источник ошибки
Убедитесь, что на сервере, на котором вы ведёте разработку, включено отображение всех ошибок. Вы можете включить его из PHP, выполнив error_reporting(-1); (можно разместить этот код в конфигурационном файле вашего сайта, например). Если при попытке выполнения запроса будут обнаружены ошибки в синтаксисе, то они будут отображены.

Используйте mysql_error(). Эта функция вернёт строку с текстом ошибки, если таковая возникла при выполнении последнего запроса.

Например:

mysql_connect($host, $username, $password) or die("Ошибка подключения");
mysql_select_db($db_name) or die("Ошибка выбора БД");

$sql = "SELECT * FROM table_name";
$result = mysql_query($sql);

if ($result === false) {
echo mysql_error();
}
в общем нужно понимание, на какое место ругается. В виду того, что в моей конфигурации эта ошибка отсутствует, нужен для анализа php.ini, точную версию php и т.д...и тестировать уже при наличии этого ворнинга.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Dmitriy Wizen
Сообщения: 12
Зарегистрирован: Чт июн 21, 2018 12:55 am
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] Яндекс погода 2018

Сообщение Dmitriy Wizen » Чт июн 21, 2018 11:43 am

directman66 писал(а):
Чт июн 21, 2018 11:17 am
Dmitriy Wizen писал(а):
Чт июн 21, 2018 9:38 am
Warning: strlen() expects parameter 1 to be string, array given in /var/www/html/lib/caching.class.php on line 19
strlen() видимо из другого проекта, в моем коде его нет.
Обновился. посмотрим что будет при очередном автоматическом обновлении погоды.
Но
Warning: strlen() expects parameter 1 to be string, array given in /var/www/html/lib/caching.class.php on line 19
не у меня одного возникает:
Warning: strlen() expects parameter 1 to be string, array given in C:\_majordomo\htdocs\lib\caching.class.php on line 19

Если как то другой проект цепляется, то не совсем пока понятно как и почему.
ошибка эта выскакивает каждый раз, например, при нажатии "GET UPDATE"
Изображение
Вложения
get_update_19.jpg
get_update_19.jpg (98.66 КБ) 3060 просмотров
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: [Модуль] Яндекс погода 2018

Сообщение directman66 » Чт июн 21, 2018 12:10 pm

Видимо ругается на это:
caching.class.php

Код: Выделить всё

function saveToCache($key, $value, $ttl = 60)
{
    global $db;
   if (isset($_SERVER['REQUEST_METHOD']))
   {
      global $memory_cache;
      $memory_cache[$key] = $value;
   }

   if (strlen($value) <= 255)
   {
      $rec = array('KEYWORD' => $key, 'DATAVALUE' => $value, 'EXPIRE' => date('Y-m-d H:i:s', time() + $ttl));
   }
   else
   {
      $rec = array('KEYWORD' => $key, 'DATAVALUE' => '(too big)', 'EXPIRE' => date('Y-m-d H:i:s', time() + $ttl));
   }

   $sqlQuery = "REPLACE INTO cached_values (KEYWORD, DATAVALUE, EXPIRE)
                VALUES ('" . $db->DbSafe1($rec['KEYWORD']) . "',
                        '" . $db->DbSafe1($rec['DATAVALUE']) . "',
                        '" . $rec['EXPIRE'] . "')";
   SQLExec($sqlQuery);
}
попробуйте заменить 19 строку в файле /var/www/lib/caching.class.php на

Код: Выделить всё

if (count($value) <= 255)
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Dmitriy Wizen
Сообщения: 12
Зарегистрирован: Чт июн 21, 2018 12:55 am
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] Яндекс погода 2018

Сообщение Dmitriy Wizen » Чт июн 21, 2018 12:42 pm

Спасибо!
Попробую, но разве strLen - длинна строки, и count , это одно и тоже? в смысле конечного результата.

PS
ошибка 19 вроде не проявляется больше при "GET UPDATE".
Посмотрим не отвалится ли что-то в другом месте.
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: [Модуль] Яндекс погода 2018

Сообщение fandaymon » Чт июн 21, 2018 12:53 pm

directman66 писал(а):
Чт июн 21, 2018 12:10 pm
Видимо ругается на это:
caching.class.php

Код: Выделить всё

function saveToCache($key, $value, $ttl = 60)
{
    global $db;
   if (isset($_SERVER['REQUEST_METHOD']))
   {
      global $memory_cache;
      $memory_cache[$key] = $value;
   }

   if (strlen($value) <= 255)
   {
      $rec = array('KEYWORD' => $key, 'DATAVALUE' => $value, 'EXPIRE' => date('Y-m-d H:i:s', time() + $ttl));
   }
   else
   {
      $rec = array('KEYWORD' => $key, 'DATAVALUE' => '(too big)', 'EXPIRE' => date('Y-m-d H:i:s', time() + $ttl));
   }

   $sqlQuery = "REPLACE INTO cached_values (KEYWORD, DATAVALUE, EXPIRE)
                VALUES ('" . $db->DbSafe1($rec['KEYWORD']) . "',
                        '" . $db->DbSafe1($rec['DATAVALUE']) . "',
                        '" . $rec['EXPIRE'] . "')";
   SQLExec($sqlQuery);
}
попробуйте заменить 19 строку в файле /var/www/lib/caching.class.php на

Код: Выделить всё

if (count($value) <= 255)
Судя по всему эта функция кэширует значение каких-то свойств объекта. Менять strlen на count не надо, потому что свойства должны быть строковыми. А ошибка возникает скорее всего из-за того, что модуль заносит в свойство не строку, а массив, возможно массив из одного элемента, но он всё равно останется массивом
Dmitriy Wizen
Сообщения: 12
Зарегистрирован: Чт июн 21, 2018 12:55 am
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] Яндекс погода 2018

Сообщение Dmitriy Wizen » Чт июн 21, 2018 1:03 pm

fandaymon писал(а):
Чт июн 21, 2018 12:53 pm
directman66 писал(а):
Чт июн 21, 2018 12:10 pm
Видимо ругается на это:
caching.class.php

Код: Выделить всё

function saveToCache($key, $value, $ttl = 60)
{
    global $db;
   if (isset($_SERVER['REQUEST_METHOD']))
   {
      global $memory_cache;
      $memory_cache[$key] = $value;
   }

   if (strlen($value) <= 255)
   {
      $rec = array('KEYWORD' => $key, 'DATAVALUE' => $value, 'EXPIRE' => date('Y-m-d H:i:s', time() + $ttl));
   }
   else
   {
      $rec = array('KEYWORD' => $key, 'DATAVALUE' => '(too big)', 'EXPIRE' => date('Y-m-d H:i:s', time() + $ttl));
   }

   $sqlQuery = "REPLACE INTO cached_values (KEYWORD, DATAVALUE, EXPIRE)
                VALUES ('" . $db->DbSafe1($rec['KEYWORD']) . "',
                        '" . $db->DbSafe1($rec['DATAVALUE']) . "',
                        '" . $rec['EXPIRE'] . "')";
   SQLExec($sqlQuery);
}
попробуйте заменить 19 строку в файле /var/www/lib/caching.class.php на

Код: Выделить всё

if (count($value) <= 255)
Судя по всему эта функция кэширует значение каких-то свойств объекта. Менять strlen на count не надо, потому что свойства должны быть строковыми. А ошибка возникает скорее всего из-за того, что модуль заносит в свойство не строку, а массив, возможно массив из одного элемента, но он всё равно останется массивом
Спасибо!, так и предполагал. Вернул Strlen обратно, тем более что замена не помогла глобально.
в логе все равно ошибки после автообновления данных о погоде:

12:55:19 running cycle_yandexweather.php

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/scripts/cycle_yandexweather.php:19) in /var/www/html/modules/yandexweather/get.inc.php on line 21

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/lib/mysqli.class.php on line 227

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/lib/mysqli.class.php on line 227

Последнее обновление модуля "Погода яндекс" установлены.
srvsrvsrv
Сообщения: 29
Зарегистрирован: Пн дек 11, 2017 9:15 am
Благодарил (а): 11 раз
Поблагодарили: 9 раз

Re: [Модуль] Яндекс погода 2018

Сообщение srvsrvsrv » Чт июн 21, 2018 1:05 pm

pi3
уведомления, кнопка "сохранить":
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/lib/mysqli.class.php on line 227

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/lib/mysqli.class.php on line 227
Ответить