Страница 28 из 93
Re: [Модуль] Яндекс погода 2018
Добавлено: Чт июн 21, 2018 1:06 am
Dmitriy Wizen
точно такие же ошибки на 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
Недели две уже.
только что удалил объекты и модуль, и поставил заново. Ошибки теже.
Что еще можно попробовать сделать?
Re: [Модуль] Яндекс погода 2018
Добавлено: Чт июн 21, 2018 5:06 am
directman66
Какая версия php у вас стоит?
Re: [Модуль] Яндекс погода 2018
Добавлено: Чт июн 21, 2018 9:38 am
Dmitriy Wizen
Версия, судя по всему 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
Re: [Модуль] Яндекс погода 2018
Добавлено: Чт июн 21, 2018 11:17 am
directman66
У меня таких ошибок почему-то не наблюдается.
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 и т.д...и тестировать уже при наличии этого ворнинга.
Re: [Модуль] Яндекс погода 2018
Добавлено: Чт июн 21, 2018 11:43 am
Dmitriy Wizen
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"

Re: [Модуль] Яндекс погода 2018
Добавлено: Чт июн 21, 2018 12:10 pm
directman66
Видимо ругается на это:
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 на
Re: [Модуль] Яндекс погода 2018
Добавлено: Чт июн 21, 2018 12:42 pm
Dmitriy Wizen
Спасибо!
Попробую, но разве strLen - длинна строки, и count , это одно и тоже? в смысле конечного результата.
PS
ошибка 19 вроде не проявляется больше при "GET UPDATE".
Посмотрим не отвалится ли что-то в другом месте.
Re: [Модуль] Яндекс погода 2018
Добавлено: Чт июн 21, 2018 12:53 pm
fandaymon
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 на
Судя по всему эта функция кэширует значение каких-то свойств объекта. Менять strlen на count не надо, потому что свойства должны быть строковыми. А ошибка возникает скорее всего из-за того, что модуль заносит в свойство не строку, а массив, возможно массив из одного элемента, но он всё равно останется массивом
Re: [Модуль] Яндекс погода 2018
Добавлено: Чт июн 21, 2018 1:03 pm
Dmitriy Wizen
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 на
Судя по всему эта функция кэширует значение каких-то свойств объекта. Менять 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
Последнее обновление модуля "Погода яндекс" установлены.
Re: [Модуль] Яндекс погода 2018
Добавлено: Чт июн 21, 2018 1:05 pm
srvsrvsrv
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