Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: VK API Warning: Invalid argument supplied for foreach()
Форумы портала PHP.SU » PHP » Программирование на PHP » VK API Warning: Invalid argument supplied for foreach()

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

1. smit - 21 Октября, 2016 - 03:35:45 - перейти к сообщению
Всем привет! Пытаюсь получить список комментариев из Обсуждений сообществ.
Чтобы не путались, приведу пример обсуждения: https://vk[dot]com/topic-47955426_27735839 (не реклама).

По плану, я вначале должен получить список обсуждений. Потом из них, получить список комментариев. Но что-то идет не так. Список обсуждений возвращается, а вот в комментах, строка: "foreach($GetBoardComments as $boardcomm)" - выдает целых 3 одинаковых ошибки:

Warning: Invalid argument supplied for foreach() in /home/users/k/k37v37/domains/k37 v37.myjino.ru/antispam_moe.php on line 94

Warning: Invalid argument supplied for foreach() in /home/users/k/k37v37/domains/k37 v37.myjino.ru/antispam_moe.php on line 94

Warning: Invalid argument supplied for foreach() in /home/users/k/k37v37/domains/k37 v37.myjino.ru/antispam_moe.php on line 94



Посмотрите плиз, кто поймёт, где засела ошибка? Ниндзя
2 дня уже ищу.

Значения:

tid (в списке обсуждений) - ID темы;
title (в списке обсуждений) - заголовок;
created_by (в списке обсуждений) - создатель.

id (в комментариях) - ID темы;
text (в комментариях) - заголовок;
from_id (в комментариях) - создатель.

PHP:
скопировать код в буфер обмена
  1.  
  2. //Получаем список последних 40 обсуждений  
  3.     $GetBoard = json2array(file_get_contents("https://api.vk.com/method/board.getTopics?group_id={$GroupId}&count=40"));
  4.     $GetBoard = $GetBoard['response'];
  5.     unset($GetBoard[0]);
  6.     foreach($GetBoard as $board){
  7.         if(spamcheck($board['title']) == true){
  8.             $SpamBoardMessages[]=$board['tid'];
  9.             $SpamUID[]=$board['created_by'];
  10.         }
  11.                  //Получаем список последних 40 комментов из обсуждений
  12.         $GetBoardComments = json2array(file_get_contents("https://api.vk.com/method/board.getComments?group_id={$GroupId}&count=40&topic_id={$board['tid']}&need_likes=0&sort=desc"));
  13.         $GetBoardComments = $GetBoardComments['response'];
  14.         unset($GetBoardComments[0]);
  15.         foreach($GetBoardComments as $boardcomm){
  16.             if(spamcheck($boardcomm['text']) == true){
  17.                 $GetBoardComments[]=$boardcomm['id'];
  18.                 $SpamUID[]=$boardcomm['from_id'];
  19.             }
  20.         }
  21.     }
  22.  
2. Sail - 21 Октября, 2016 - 08:59:59 - перейти к сообщению
smit, очевидно, что $GetBoardComments, передаваемый в цикл foreach не является массивом.
Можете проверить, что по ходу дела происходит с этой переменной. Например, используя var_dump($GetBoardComments); после 12-й, 13-й и 14-й строчек.
3. smit - 21 Октября, 2016 - 12:40:05 - перейти к сообщению
Sail пишет:

очевидно, что $GetBoardComments,

А что же это? Массив как массив. В скрипте, выше точно такой же код, но для стены - работает как надо.

Sail пишет:

var_dump($GetBoardComments); после 12-й, 13-й и 14-й строчек.

После 14 - точно NULL выдает. По одному, на каждую ошибку.
Другие - не смотрел.
4. smit - 23 Октября, 2016 - 15:05:44 - перейти к сообщению
ап
5. Мелкий - 23 Октября, 2016 - 15:29:34 - перейти к сообщению
Что "ап"?

Всё уже сказано:
Sail пишет:
очевидно, что $GetBoardComments, передаваемый в цикл foreach не является массивом.

smit пишет:
После 14 - точно NULL выдает.


smit пишет:
А что же это? Массив как массив

NULL это не массив. NULL это NULL.

Судя по api.vk.com и отсутствию явной задержки - скорей всего flood control. Смотрите, что вам апи возвращает и проверьте свою обработку ошибок этого самого апи.
Кстати, у вас не указана версия апи. Через пару месяцев такие запросы работать прекратят.
6. smit - 23 Октября, 2016 - 16:46:59 - перейти к сообщению
Мелкий пишет:

Sail пишет:
очевидно, что $GetBoardComments, передаваемый в цикл foreach не является массивом.

Так а что это, если не массив?


Мелкий пишет:

NULL это не массив. NULL это NULL.

Это здесь вообще к чему?
7. Мелкий - 23 Октября, 2016 - 16:53:34 - перейти к сообщению
smit пишет:
Так а что это, если не массив?

Так сами же написали, что var_dump($GetBoardComments); говорит NULL.
NULL так NULL, есть такой тип значений в PHP. И это не массив. Это NULL.
8. smit - 23 Октября, 2016 - 17:06:01 - перейти к сообщению
Мелкий пишет:
Так сами же написали, что var_dump($GetBoardComments); говорит NULL.
NULL так NULL, есть такой тип значений в PHP. И это не массив. Это NULL.

Я понимаю что NULL - это такое значение.
Я не понимаю, почему $GetBoardComments - это не массив?
9. Мелкий - 23 Октября, 2016 - 20:01:57 - перейти к сообщению
Вот теперь правильный вопрос.
Смотрим откуда эта переменная берётся.

smit пишет:
$GetBoardComments = $GetBoardComments['response'];

Может здесь стать NULL? Да, может. В некоторых случаях может не быть даже пресловутого E_NOTICE. Sail об этом уже говорил, когда просил поставить var_dump после этой строки.

smit пишет:
$GetBoardComments = json2array(file_get_contents(

Может здесь быть NULL? Может, конечно. Вы же не привели листинг вызываемой функции.
И если функция отдаст NULL, то это как раз один из вариантов, когда последующая строка не даст даже E_NOTICE. И об этом Sail тоже сказал, предложив посмотреть var_dump сразу после этой строки.
Может ли одна и та же функция возвращать результат парой строк ранее и не возвращать тут? Может, разумеется. Даже если она не изменяет состояние системы, у неё есть как минимум 1 аргумент. Тем более поскольку этот аргумент напрямую зависит от внешней системы.
10. smit - 26 Октября, 2016 - 01:09:31 - перейти к сообщению
В общем сейчас протестил "var_dump($GetBoardComments);":
После 12:
array(1) { ["error"]=> array(3) { ["error_code"]=> int(100) ["error_msg"]=> string(78) "One of the parameters specified was missing or invalid=> topic_id is undefined" ["request_params"]=> array(7) { [0]=> array(2) { ["key"]=> string(5) "oauth" ["value"]=> string(1) "1" } [1]=> array(2) { ["key"]=> string(6) "method" ["value"]=> string(17) "board.getComments" } [2]=> array(2) { ["key"]=> string(8) "group_id" ["value"]=> string(9) "131106281" } [3]=> array(2) { ["key"]=> string(5) "count" ["value"]=> string(2) "40" } [4]=> array(2) { ["key"]=> string(8) "topic_id" ["value"]=> string(0) "" } [5]=> array(2) { ["key"]=> string(10) "need_likes" ["value"]=> string(1) "0" } [6]=> array(2) { ["key"]=> string(4) "sort" ["value"]=> string(4) "desc" } } } }

После 13, 14: NULL

Я понял что ругается на topic_id и еще на что-то:
array(1) { ["error"]=> array(3)
["error_code"]=> int(100)
["error_msg"]=> string(78)

Вот что за ошибки?
11. Sail - 26 Октября, 2016 - 09:43:27 - перейти к сообщению
smit, в 4-й строчке забыли ещё на уровень топиков спуститься.
Надо:
PHP:
скопировать код в буфер обмена
  1. $GetBoard = $GetBoard['response']['topics'];
12. Мелкий - 26 Октября, 2016 - 11:41:33 - перейти к сообщению
smit пишет:
Вот что за ошибки?

Открываете вклонтактик в разделе для разработчиков и читаете. В отличии от некоторых, у них описание документации с реальностью обычно совпадает. А, только читать надо обязательно русскоязычное зеркало. Англоязычное - не соответствует действительности.

И включите error_reporting в нормальные E_ALL. Даже некоторых известных особенностей приведения типов не понадобилось, вы просто игнорируете E_NOTICE.

 

Powered by ExBB FM 1.0 RC1