Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
TemKa_SD

Сложно сделать такой так под IPS?

Recommended Posts

Здравствуйте. Вот этот файл отвечает за обновление статистики на моем игровом сервере. Мне нужно сделать его в виде таска на IPS.

BaseW3mmdStats.php

Share this post


Link to post
Share on other sites

Если файл обновления статистики доступен публично, то просто делайте к нему запрос.

Share this post


Link to post
Share on other sites

Не понял

Share this post


Link to post
Share on other sites
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN stats_games g ON g.id = gameid WHERE w3p.category=:c' at line 1

 

    foreach($db::i('stats')->select('g.*', ['stats_w3mmdplayers', 'w3p'], array('INNER JOIN stats_games g ON g.id = gameid
                WHERE w3p.category=:category 
                  AND w3p.gameid NOT IN ( SELECT gameid FROM stats_games_scored)
                  AND g.gamename NOT LIKE %dota%
             GROUP BY w3p.gameid 
             ORDER BY w3p.gameid 
                LIMIT 10'), null, \IPS\Settings::i()->score_calculate_dota_max_games) as $unscored) {
       $scoredGames[] = $unscored['gameid'];

 

чего не таке?

Share this post


Link to post
Share on other sites

Не получается и всё. Пожалуйста, сделайте мне вот такой запрос.

 

SELECT g.*

FROM stats_w3mmdplayers w3p

INNER JOIN stats_games g ON g.id = gameid

WHERE w3p.category=:category

AND w3p.gameid NOT IN ( SELECT gameid FROM stats_games_scored)

AND g.gamename NOT LIKE '%dota%'

GROUP BY w3p.gameid

ORDER BY w3p.gameid

LIMIT 10

 

тут

 

        $gamesQ = \IPS\DB::i('stats')->select('g.*', ['stats_w3mmdplayers', 'w3p'], array('w3p.category=category'), null, 5);
       $gamesQ->join(['stats_games','g'], ['g.id = gameid'], 'INNER');

Share this post


Link to post
Share on other sites

Я разобрался, вроде работает без этого AND g.gamename NOT LIKE '%dota%' как мне правильно вставить NOT LIKE сюда?

 

        $gamesQ = \IPS\DB::i('stats')->select('g.*', ['stats_w3mmdplayers', 'w3p'], array('w3p.category=category AND w3p.gameid NOT IN ( SELECT gameid FROM stats_games_scored)
                  AND g.gamename NOT LIKE '%dota%' GROUP BY w3p.gameid ORDER BY w3p.gameid'), null, 10);
       $gamesQ->join(['stats_games','g'], ['g.id = gameid'], 'INNER');

Share this post


Link to post
Share on other sites

Так. Сутки вожусь, с выше указанными вопросами я справился, сейчас вот застрял и не могу понять в чем проблема, часа 4 копаю одно и тоже. Сразу вопрос, как выводить дебаг?

 

Вот в этом коде идет сохранение данных, выше в функциях мы собирали игры и игроков, сейчас нужно заполнить тамблицу со статистикой.

 

    /**
    * Scores one player
    * @param $player
    * @param $game
    */
   protected function scorePlayer($player, $game)
   {
       try {
           $stats = \IPS\sharedstats\Records\ScoredPlayerW3mmd::load($player['id']);
       } catch(\OutOfRangeException $e) {
           $stats = new \IPS\sharedstats\Records\ScoredPlayerW3mmd;
           $stats->name = $player['name'];
           $stats->server = $player['spoofedrealm'];
       }
           $stats->xp = 10;
           $stats->commends = '123';
       $stats->save();
}

 

Ошибка тут следующая:

 

Column 'name' cannot be null

 

Понятно, что вот это передает пустой результат:

 

$stats->name = $player['name'];

 

Почему?

BaseW3mmdStats.php

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

Карочи заработало, только цикл бесконечный, вместо 10 записей записался миллион, щас буду копать.

Share this post


Link to post
Share on other sites

Всё норм ))) Работаем дальше... Посмотрите по коду, пойдет?

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

Не очень люблю подзапросы типа NOT IN ( SELECT ... ) По мере возможности старался использовать JOIN

 

$db->select( 'g.* ', ['stats_w3mmdplayers', 'w3p'], ['gs.gameid IS NULL AND w3p.category=? AND g.gamename NOT LIKE "%dota%"', $category], null, 10, 'w3p.gameid' )
->join( ['stats_games' 'g'], 'g.id=w3p.gameid', 'INNER' )
->join( ['stats_games_scored', 'gs'], 'gs.gameid=w3p.gameid', 'LEFT' )

  • Upvote 1

Share this post


Link to post
Share on other sites

По мере возможности старался использовать JOIN

Типы нужно писать в верхнем регистре. Это прихоть IPS

Share this post


Link to post
Share on other sites

Поправил. Уже подзабыл.

Share this post


Link to post
Share on other sites

Спасибо

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...