Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

Дизайн и модификация Invision Community

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

Помогите исправить Whoops\Exception\ErrorException: Invalid argument supplied for foreach() (2)

Здравствуйте. Разрабатывал модуль в обычной версии, потом добавил DEV версию, включил и появилась ошибка.

 

Whoops\Exception\ErrorException: Invalid argument supplied for foreach() (2)

#0 /var/www/dev/data/www/dev.wc3.games/applications/sharedstats/sources/DbIntegration/Db.php(229): Whoops\Run->handleError(2, 'Invalid argumen...', '/var/www/dev/da...', 229, Array)

#1 /var/www/dev/data/www/dev.wc3.games/system/Helpers/Table/Table.php(485): IPS\sharedstats\DbIntegration\_Db->getRows(Array)

#2 /var/www/dev/data/www/dev.wc3.games/applications/sharedstats/modules/front/stats/recentGames.php(112): IPS\Helpers\Table\_Table->__toString()

#3 /var/www/dev/data/www/dev.wc3.games/system/Dispatcher/Controller.php(96): IPS\sharedstats\modules\front\stats\_recentGames->manage()

#4 /var/www/dev/data/www/dev.wc3.games/applications/sharedstats/modules/front/stats/recentGames.php(33): IPS\Dispatcher\_Controller->execute()

#5 /var/www/dev/data/www/dev.wc3.games/system/Dispatcher/Dispatcher.php(146): IPS\sharedstats\modules\front\stats\_recentGames->execute()

#6 /var/www/dev/data/www/dev.wc3.games/index.php(13): IPS\_Dispatcher->run()

#7 {main}

 

При этом, ошибка проявляется на стандартной версии без моих дополнений от другого разработчика, который пилил этот модуль еще на 4.1 а потом забросил. Соответственно, если он делал в DEV версии то у него всё работало, может быть это связанно из-за разницы в линейках IPS?

 

В стандартном режиме работы форума всё в порядке, ошибок нет.

post-60255-0-09948600-1534310468_thumb.png

Рекомендованные сообщения

В foreach должен быть массив или объект

 

Вообще код похож на \IPS\Helpers\Table\Db

 

Видимо автор часть кода скопировал из родительского класса. Посмотрите, как там сейчас сейчас.

  • Автор

Да, код немного другой.

 

У меня:

 

        if( $this->onlySelected !== NULL )
       {
           foreach( $this->onlySelected as $column )
           {
               $selects[] = $column;
           }

           if( $this->group !== NULL )
           {
               $this->group = is_array( $this->group ) ? $this->group : array( $this->group );
               $this->group = array_unique( array_merge( $this->group, $this->onlySelected ) );
           }
       }
       else
       {
           if ( count( $this->joins ) )
           {
               foreach( $this->joins as $join )
               {
                   if ( isset( $join['select'] ) )
                   {
                       $selects[] = $join['select'];
                   }
               }
           }
       }

 

В исходнике:

 

		if ( count( $this->joins ) )
	{
		foreach( $this->joins as $join )
		{
			if ( isset( $join['select'] ) )
			{
				$selects[] = $join['select'];
			}
		}
	}

  • Автор

Ну и ниже в некоторых места у меня добавлена переменная:

 

$this->group

 

Таким образом, у меня:

 

        /* Now get column headers */
       $query = \IPS\Db::i($this->connection)->select( $this->onlySelected ? implode( ', ', $selects ) : '*', $this->table, $where, NULL, array( 0, 1 ), $this->group );

 

В исходнике:

 

		/* Now get column headers */
	$query = \IPS\Db::i()->select( ( count( $selects ) ) ? $this->table . '.*, ' . implode( ', ', $selects ) : '*', $this->table, NULL, NULL, array( 0, 1 ) );

$this->onlySelected не используется

$this->group тоже удалена в последних версиях

  • Автор

Просто вставить код из новой версии Db? Зачем вообще идет подключение этого файла, если он есть в движке?

Изменено пользователем TemKa_SD

Разница в

$query = \IPS\Db::i($this->connection)

$query = \IPS\Db::i()

 

В первом варианте подключается сторонняя бд

  • Автор

А, понял. Спасибо.

  • Автор

Я убрал код от $this->group, теперь не подключается к внешней БД, использует БД IPS.

 

SELECT count(*) FROM `stats_scoredgames`
IPS\Db\Exception: Table 'dev_ips.stats_scoredgames' doesn't exist (1146)
#0 /var/www/dev/data/www/dev.wc3.games/system/Db/Select.php(378): IPS\_Db->preparedQuery('/*IPS\\sharedsta...', Array, true)
#1 /var/www/dev/data/www/dev.wc3.games/system/Db/Select.php(440): IPS\Db\_Select->runQuery()
#2 /var/www/dev/data/www/dev.wc3.games/system/Db/Select.php(361): IPS\Db\_Select->rewind()
#3 /var/www/dev/data/www/dev.wc3.games/applications/sharedstats/sources/DbIntegration/Db.php(250): IPS\Db\_Select->first()
#4 /var/www/dev/data/www/dev.wc3.games/system/Helpers/Table/Table.php(485): IPS\sharedstats\DbIntegration\_Db->getRows(Array)
#5 /var/www/dev/data/www/dev.wc3.games/applications/sharedstats/modules/front/stats/recentGames.php(114): IPS\Helpers\Table\_Table->__toString()
#6 /var/www/dev/data/www/dev.wc3.games/system/Dispatcher/Controller.php(96): IPS\sharedstats\modules\front\stats\_recentGames->manage()
#7 /var/www/dev/data/www/dev.wc3.games/applications/sharedstats/modules/front/stats/recentGames.php(35): IPS\Dispatcher\_Controller->execute()
#8 /var/www/dev/data/www/dev.wc3.games/system/Dispatcher/Dispatcher.php(146): IPS\sharedstats\modules\front\stats\_recentGames->execute()
#9 /var/www/dev/data/www/dev.wc3.games/index.php(13): IPS\_Dispatcher->run()
#10 {main}

 

Не пойму, всё перекопал, везде всё норм.

Изменено пользователем TemKa_SD

Значит что-то лишнее удалили.

  • Автор

Блин, еще раз удалил, и всё в порядке. Бред. Ладно, вроде всё работает, большое спасибо.

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.