Здравствуйте. Я не знаком с программированием, только на уровне чтения ну и основ. Мне нужно реализовать следующее:
В таблице 1 содержатся данные игрового аккаунта, в котором есть полу active и оно принимает значения 0 или 1.
Эта активность берется с двух других таблиц, где сравниваются ИГРОКИ и ИГРЫ, там где ИГРЫ есть дата игры, по ней и будет проходить сравнение, если игрок играл за последний месяц, то должно передаваться значение 1.
Я уже написал основу, разобрался немного, мне осталось составить SQL запрос для сравнения игрока и игр.
Т.е запрос примерно такой: Если "игрок" (stats_gameplayers.gameid, stats_gameplayers.name, stats_gameplayers.spoofedrealm) есть в "играх" за последний месяц (stats_games.id) то условие выполняется, true.
/**
* memberActive Task
*/
class _memberActive extends \IPS\Task
{
/**
* Execute
*
* If ran successfully, should return anything worth logging. Only log something
* worth mentioning (don't log "task ran successfully"). Return NULL (actual NULL, not '' or 0) to not log (which will be most cases).
* If an error occurs which means the task could not finish running, throw an \IPS\Task\Exception - do not log an error as a normal log.
* Tasks should execute within the time of a normal HTTP request.
*
* @return mixed Message to log or NULL
* @throws \IPS\Task\Exception
*/
public function execute()
{
$db = \IPS\sharedstats\DB::get();
$accounts = [];
foreach($db::i('stats')->select('id, status, name, active, server, created', 'stats_forum_connections') as $acc) {
$accounts[$acc['id']] = [
'status' => $acc['status'],
'name' => $acc['name'],
'server' => $acc['server'],
'active' => $acc['active']
];
}
$this->updateAccounts($accounts);
}
/**
* Cleanup
*
* If your task takes longer than 15 minutes to run, this method
* will be called before execute(). Use it to clean up anything which
* may not have been done
*
* @return void
*/
public function cleanup()
{
}
/**
* @param $accounts
*/
protected function updateAccounts($accounts)
{
foreach($accounts as $id => $acc) {
$data = $this->fetchAccount($acc);
$account = \IPS\sharedstats\Records\ForumConnection::load($id);
if(!$data) {
$account->active = '0';
} else {
$account->active = '1';
}
$account->save();
}
}
protected function fetchAccount($acc)
{
$result = true;
if (FALSE === $result) {
return false;
} else {
return json_decode($result, true);
}
}
}
Это готовый таск, он рабочий, данные изменяются где надо. Нужно вместо $result = true; вставить SQL запрос правильный.
Здравствуйте. Я не знаком с программированием, только на уровне чтения ну и основ. Мне нужно реализовать следующее:
В таблице 1 содержатся данные игрового аккаунта, в котором есть полу active и оно принимает значения 0 или 1.
Эта активность берется с двух других таблиц, где сравниваются ИГРОКИ и ИГРЫ, там где ИГРЫ есть дата игры, по ней и будет проходить сравнение, если игрок играл за последний месяц, то должно передаваться значение 1.
Я уже написал основу, разобрался немного, мне осталось составить SQL запрос для сравнения игрока и игр.
Т.е запрос примерно такой: Если "игрок" (stats_gameplayers.gameid, stats_gameplayers.name, stats_gameplayers.spoofedrealm) есть в "играх" за последний месяц (stats_games.id) то условие выполняется, true.
/** * memberActive Task */ class _memberActive extends \IPS\Task { /** * Execute * * If ran successfully, should return anything worth logging. Only log something * worth mentioning (don't log "task ran successfully"). Return NULL (actual NULL, not '' or 0) to not log (which will be most cases). * If an error occurs which means the task could not finish running, throw an \IPS\Task\Exception - do not log an error as a normal log. * Tasks should execute within the time of a normal HTTP request. * * @return mixed Message to log or NULL * @throws \IPS\Task\Exception */ public function execute() { $db = \IPS\sharedstats\DB::get(); $accounts = []; foreach($db::i('stats')->select('id, status, name, active, server, created', 'stats_forum_connections') as $acc) { $accounts[$acc['id']] = [ 'status' => $acc['status'], 'name' => $acc['name'], 'server' => $acc['server'], 'active' => $acc['active'] ]; } $this->updateAccounts($accounts); } /** * Cleanup * * If your task takes longer than 15 minutes to run, this method * will be called before execute(). Use it to clean up anything which * may not have been done * * @return void */ public function cleanup() { } /** * @param $accounts */ protected function updateAccounts($accounts) { foreach($accounts as $id => $acc) { $data = $this->fetchAccount($acc); $account = \IPS\sharedstats\Records\ForumConnection::load($id); if(!$data) { $account->active = '0'; } else { $account->active = '1'; } $account->save(); } } protected function fetchAccount($acc) { $result = true; if (FALSE === $result) { return false; } else { return json_decode($result, true); } } }Это готовый таск, он рабочий, данные изменяются где надо. Нужно вместо $result = true; вставить SQL запрос правильный.