newbie 1723 08/13/18 12:03 Как-то все запутано. Если игрок с именем (поле name) temka_sd играл на сервере (поле spoofedrealm) GarenaИ другой игрок с таким же именем (поле name) temka_sd играл на сервере (поле spoofedrealm) Rubattle.netТо какую запись Вы будете обновлять в таблице stats_forum_connections? Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/13/18 12:11 Обе, если обе записи там есть и с обоих аккаунтов играли за последние 30 дней. Поделиться сообщением Ссылка на сообщение
newbie 1723 08/14/18 06:22 $names = iterator_to_array(\IPS\Db::i()->select( "CONCAT(stats_gameplayers.name, stats_gameplayers.spoofedrealm)", 'stats_gameplayers', array( 'UNIX_TIMESTAMP(stats_games.datetime)>?', \IPS\DateTime::create()->sub(new \DateInterval('P30D'))->getTimestamp()), null, null, array('stats_gameplayers.name', 'stats_gameplayers.spoofedrealm') )->join( 'stats_games', 'stats_games.id=stats_gameplayers.gameid' )); if (count($names)) { \IPS\Db::i()->update('stats_forum_connections', array('active' => 1), \IPS\Db::i()->in("CONCAT(name, server)", $names)); } 1 Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/14/18 10:26 Так же делал, только без CONCAT. Спасибо, сейчас попробую. Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/14/18 10:34 Почему так не работает 0. public function execute() { $db = \IPS\sharedstats\DB::get(); $names = iterator_to_array($db::i('stats')->select( "CONCAT(stats_gameplayers.name, stats_gameplayers.spoofedrealm)", 'stats_gameplayers', array( 'UNIX_TIMESTAMP(stats_games.datetime)>?', \IPS\DateTime::create()->sub(new \DateInterval('P30D'))->getTimestamp()), null, null, array('stats_gameplayers.name', 'stats_gameplayers.spoofedrealm') )->join( 'stats_games', 'stats_games.id=stats_gameplayers.gameid' )); if (count($names)) { $db::i('stats')->update('stats_forum_connections', array('active' => 1), $db::i('stats')->in("CONCAT(name, server)", $names)); } else { $db::i('stats')->update('stats_forum_connections', array('active' => 0), $db::i('stats')->in("CONCAT(name, server)", $names)); } } Поделиться сообщением Ссылка на сообщение
newbie 1723 08/14/18 11:03 else { $db::i('stats')->update('stats_forum_connections', array('active' => 0), $db::i('stats')->in("CONCAT(name, server)", $names)); }А что Вы тут пытаетесь обновить, если массив $names пуст, и запрос выглядит такUPDATE stats_forum_connections SET active=0 WHERE 1=0 Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/14/18 22:27 Да, массив пусть как и должно быть, т.е за последние 30 дней игры не найдены, и нужно установить active=0. Поделиться сообщением Ссылка на сообщение
newbie 1723 08/15/18 05:09 Да, массив пусть как и должно быть, т.е за последние 30 дней игры не найдены, и нужно установить active=0. Кому Вы собираетесь устанавливать active=0, если в результате запроса получено 0 записей? Устанавливайте всем active=0, а после устанавливайте active=1 юзерам, игравшим за последние 30 дней. Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 05:12 Всё правильно, а если после установки active - 1 игрок не играл в течении 30 дней, нужно вернуть 0. Поделиться сообщением Ссылка на сообщение
newbie 1723 08/15/18 05:38 1. Ставьте всем 02. Ставьте 1 тем, кто играл. В чем проблема? Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 05:42 Проблема в том, что, c 1 на 0 не переключает, если игрок не играл за последние 30 дней. Еще раз, смотрите: изначально у всех стоит 0, затем модуль присваивает 1 тем, кто играл за последние 30 дней, с этим всё в порядке. Проходит еще 2 дня, а игрок не играл, т.е уже 32 дня, модуль не возвращает 0, остается 1. Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 07:32 (изменено) Код таска? Сейчас такой: http://ipbskins.ru/forum/topic15678.html/page__view__findpost__p__104914 Т.е здесь должно быть ИНАЧЕ обновить на 0. Т.е если игрок не играл в течении 30 дней, должен обновить на 0, а он не обновляет ( Изменено 15 августа 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 07:35 Вот так работает вроде, это правильная реализация? public function execute() { $db = \IPS\sharedstats\DB::get(); $names = iterator_to_array($db::i('stats')->select( "CONCAT(stats_gameplayers.name, stats_gameplayers.spoofedrealm)", 'stats_gameplayers', array( 'UNIX_TIMESTAMP(stats_games.datetime)>?', \IPS\DateTime::create()->sub(new \DateInterval('P200D'))->getTimestamp()), null, null, array('stats_gameplayers.name', 'stats_gameplayers.spoofedrealm') )->join( 'stats_games', 'stats_games.id=stats_gameplayers.gameid' )); if (count($names)) { $db::i('stats')->update('stats_forum_connections', array('active' => 1), $db::i('stats')->in("CONCAT(name, server)", $names)); } else { $db::i('stats')->update('stats_forum_connections', array('active' => 0)); } } Поделиться сообщением Ссылка на сообщение
newbie 1723 08/15/18 07:50 Вот так работает вроде, это правильная реализация?Нет. Вы не учитываете старых юзеров. Допустим, что у всех установлено active=0User1 -> active=0User2 -> active=0User3 -> active=0User4 -> active=0User5 -> active=0User6 -> active=0...User100 -> active=0 Задача выполняется и находит юзеров, игравших за последние 30 дней: User1, User2, User3User1 -> active=1User2 -> active=1User3 -> active=1User4 -> active=0User5 -> active=0User6 -> active=0...User100 -> active=0 Задача выполняется и находит юзеров, игравших за последние 30 дней: User1, User2, User3, User4User1 -> active=1User2 -> active=1User3 -> active=1User4 -> active=1User5 -> active=0User6 -> active=0...User100 -> active=0 Если каждый раз будут находиться игроки, то код $db::i('stats')->update('stats_forum_connections', array('active' => 0)); не будет выполняться, но через 31 день у юзеров User1, User2, User3 должен быть active=0. Поделиться сообщением Ссылка на сообщение