[Stats MySQL] Проверка кода, вопросы

Сообщения
1,032
Реакции
828
Помог
10 раз(а)
d3m37r4, Tranquillity, благодарю, в пиратки как я понял такого кеша нету? Ну я про 4554 билд который
24 Мар 2019
Кстати из всего мне придется экранировать только < остальное спец символы отобразились нормально в топе.
24 Мар 2019
Можно узнать версию клиента при коннекте?
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Лучше все экранировать
Скорее всего, но результат мне показал иначе, пока буду решать проблема по мере их поступления
(Занимаюсь само****, не буду ругаться)
24 Мар 2019
Снова проблема, на старенький билдиках. Не пойму, почему практически одинаковый код отображается в мотд по разному, а именно ширина таблицы во всю длинну.

Топ игроков отказался растягиваться.
2019-03-24_150610.png

А вот топ играющих живет нормально

2019-03-24_150545.png

Стиль одинаковый тык

Вывод мотд-окна вроде тоже одинаковый, если конечно снова не туплю на ровно месте.
Код корявый, шибко пока не ругайте =D Пока надо с мотд решить вопрос.

C++:
public ClCmdTop(const id) {
    formatex(g_sSQLQuery, charsmax(g_sSQLQuery),
        "SELECT * FROM %s ORDER BY Skill DESC",
        SQL_TABLE
    );
 
    new aData[2]; aData[0] = SQL_GETTOP; aData[1] = id;
    SQL_ThreadQuery(g_hSQLTuple, "QueryHandler", g_sSQLQuery, aData, sizeof(aData));
}
C++:
        case SQL_GETTOP: {
            Logging(g_sLogsDir, "stats_inform_", "^"[SQL_GETTOP] Queue Time %f^"", fQueueTime);
         
            new sMotd[MOTD_STRLEN], sTableRowClass[TABLE_ROW_CLASS_STRLEN], iLen, iPos;
         
            iLen = formatex(sMotd[iLen], charsmax(sMotd),
                "<meta charset=utf-8> \
                <link href=^"http://filestorage.gmforce.ru/game-force/players_stats/stats.css^" rel=stylesheet type=text/css> \
                <body> \
                <div>Топ лучших игроков</div></br> \
                <table> \
                <tr> \
                <th width=3%%># \
                <th width=37%%>Игрок \
                <th width=12%%>Убийств \
                <th width=12%%>Смертей \
                <th width=12%%>В голову \
                <th width=12%%>Скилл \
                <th width=12%%>Уровень"
            );
         
            while(SQL_MoreResults(hQuery)) {
                new sPlayerName[PLAYER_NAME_STRLEN * 3], iKills, iDeaths, iHead, Float:fSkill;
             
                SQL_ReadResult(hQuery, 1, sPlayerName, charsmax(sPlayerName));
             
                iKills = SQL_ReadResult(hQuery, 2);
                iDeaths = SQL_ReadResult(hQuery, 3);
                iHead = SQL_ReadResult(hQuery, 4);
                SQL_ReadResult(hQuery, 5, fSkill);
             
                iPos++;
                sTableRowClass = (iPos % 2) ? "b" : "";
             
                new sSkillName[SKILL_NAME_STRLEN];
                sSkillName = GetSkillName(fSkill);
                replace(sSkillName, SKILL_NAME_STRLEN, "+", "p");
                replace(sSkillName, SKILL_NAME_STRLEN, "-", "m");
             
                replace(sPlayerName, charsmax(sPlayerName), "<", "&lt;");
             
                iLen += formatex(sMotd[iLen], charsmax(sMotd) - iLen,
                    "<tr class=%s><td>%d<td>%s<td>%d<td>%d<td>%d<td>%.0f<td class=%s>",
                    sTableRowClass, iPos, sPlayerName, iKills, iDeaths, iHead, fSkill, sSkillName
                );
                SQL_NextRow(hQuery);
            }
            new id = aData[1];
            show_motd(id, sMotd, "Топ игроков");
        }

C++:
public ClCmdHot(const id) {
    formatex(g_sSQLQuery, charsmax(g_sSQLQuery),
        "SELECT * FROM %s ORDER BY Skill DESC",
        SQL_TABLE
    );
 
    new aData[2]; aData[0] = SQL_GETHOT; aData[1] = id;
    SQL_ThreadQuery(g_hSQLTuple, "QueryHandler", g_sSQLQuery, aData, sizeof(aData));
}
C++:
        case SQL_GETHOT: {
            Logging(g_sLogsDir, "stats_inform_", "^"[SQL_GETHOT] Queue Time %f^"", fQueueTime);
         
            new sMotd[MOTD_STRLEN], sTableRowClass[TABLE_ROW_CLASS_STRLEN], iLen, iPos, iRank;
         
            iLen = formatex(sMotd[iLen], charsmax(sMotd),
                "<meta charset=utf-8> \
                <link href=^"http://filestorage.gmforce.ru/game-force/players_stats/stats.css^" rel=stylesheet type=text/css> \
                <body> \
                <div>Топ играющих игроков</div></br> \
                <table> \
                <tr> \
                <th width=3%%># \
                <th width=37%%>Игрок \
                <th width=12%%>Убийств \
                <th width=12%%>Смертей \
                <th width=12%%>В голову \
                <th width=12%%>Скилл \
                <th width=12%%>Уровень"
            );
         
            new aPlayersID[MAX_PLAYERS], iPlayersNum;
            get_players_ex(aPlayersID, iPlayersNum, GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV);
         
            while(SQL_MoreResults(hQuery)) {
                new sAuthID[AUTHID_STRLEN], sAuthIDTemp[AUTHID_STRLEN], sPlayerName[PLAYER_NAME_STRLEN * 3], iKills, iDeaths, iHead, Float:fSkill;
                SQL_ReadResult(hQuery, 0, sAuthID, charsmax(sAuthID));
             
                iRank++;
             
                for(new i; i < iPlayersNum; i++) {
                    get_user_authid(aPlayersID[i], sAuthIDTemp, charsmax(sAuthIDTemp));
                 
                    if(equal(sAuthID, sAuthIDTemp)) {
                        iPos++;
                     
                        SQL_ReadResult(hQuery, 1, sPlayerName, charsmax(sPlayerName));
                        iKills = SQL_ReadResult(hQuery, 2);
                        iDeaths = SQL_ReadResult(hQuery, 3);
                        iHead = SQL_ReadResult(hQuery, 4);
                        SQL_ReadResult(hQuery, 5, fSkill);
                     
                        sTableRowClass = (iPos % 2) ? "b" : "";
                     
                        new sSkillName[SKILL_NAME_STRLEN];
                        sSkillName = GetSkillName(fSkill);
                        replace(sSkillName, SKILL_NAME_STRLEN, "+", "p");
                        replace(sSkillName, SKILL_NAME_STRLEN, "-", "m");
                     
                        replace(sPlayerName, charsmax(sPlayerName), "<", "&lt;");
                     
                        iLen += formatex(sMotd[iLen], charsmax(sMotd) - iLen,
                            "<tr class=%s><td>%d<td>%s<td>%d<td>%d<td>%d<td>%.0f<td class=%s>",
                            sTableRowClass, iRank, sPlayerName, iKills, iDeaths, iHead, fSkill, sSkillName
                        );
                    }
                }
                SQL_NextRow(hQuery);
            }
            new id = aData[1];
            show_motd(id, sMotd, "Топ играющих");
24 Мар 2019
Забыл уточнить, две команды с одинаковым стилем рисуются по разному на одной и той же пиратской версии 4554
 
  • Нравится
Реакции: ifx
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Решил проблемы с отображением стиля на разных версиях клиента.

Снова невнимательность, во всю длину не растягивалась из-за двойного процента: width: 100%%;
Отступы вокруг ячеек убрал: border-collapse: collapse;

С округлением шапки не стал заморачиваться и просто отредактировал саму картинку.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Напомните пожалуйста, максимальную длинну запроса SQL
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Gudaus, спасибо за 404
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Gudaus, нет, это задача сайта.
Вы не знали?
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Gudaus, с телефона заходил, не работала.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Как эти два запроса в один объединить? Что-то туплю сижу.

C++:
SQLInsert(const iVictim, const iKiller) {
    formatex(g_sSQLQuery, charsmax(g_sSQLQuery),
        "UPDATE %s SET Kills = %d, Deaths = %d, Head = %d, Skill = %f WHERE AuthID = '%s'",
        SQL_TABLE, g_eSQLData[iKiller][PD_KILLS], g_eSQLData[iKiller][PD_DEATHS],
        g_eSQLData[iKiller][PD_HEAD], g_eSQLData[iKiller][PD_SKILL], g_eSQLData[iKiller][PD_AUTHID]
    );
    
    new aData[2]; aData[0] = SQL_UPDATE;
    SQL_ThreadQuery(g_hSQLTuple, "QueryHandler", g_sSQLQuery, aData, sizeof(aData));
    
    formatex(g_sSQLQuery, charsmax(g_sSQLQuery),
        "UPDATE %s SET Kills = %d, Deaths = %d, Head = %d, Skill = %f WHERE AuthID = '%s'",
        SQL_TABLE, g_eSQLData[iVictim][PD_KILLS], g_eSQLData[iVictim][PD_DEATHS],
        g_eSQLData[iVictim][PD_HEAD], g_eSQLData[iVictim][PD_SKILL], g_eSQLData[iVictim][PD_AUTHID]
    );
    
    SQL_ThreadQuery(g_hSQLTuple, "QueryHandler", g_sSQLQuery, aData, sizeof(aData));
}
 
Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
Javekson, сформатируй всё в один буфер, разделив ';', и выполняй. Но такой вариант подойдёт только в том случае, если ты не ждёшь "успешного" статуса выполнения (ответа в каллбек sql-запроса).
 
Сообщения
207
Реакции
420
Помог
10 раз(а)
Ещё можно выкрутиться через CASE. Но, честно, не проверял.

SQL:
UPDATE
  %s
SET
  `Kills` = CASE
    WHEN `authid` = '%s' THEN %d
    WHEN `authid` = '%s' THEN %d
  END,

  `Deaths` = CASE
    WHEN `authid` = '%s' THEN %d
    WHEN `authid` = '%s' THEN %d
  END,

  `Head` = CASE
    WHEN `authid` = '%s' THEN %d
    WHEN `authid` = '%s' THEN %d
  END,

  `Skill` = CASE
    WHEN `authid` = '%s' THEN %f
    WHEN `authid` = '%s' THEN %f
  END

WHERE
  `authid` IN ('%s', '%s');
Смысла от объединения двух UPDATE в один, как по мне, нет.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
BlackSignature, типа так?

Код:
    formatex(g_sSQLQuery, charsmax(g_sSQLQuery),
        "UPDATE %s SET Kills = %d, Deaths = %d, Head = %d, Skill = %f WHERE AuthID = '%s';
        UPDATE %s SET Kills = %d, Deaths = %d, Head = %d, Skill = %f WHERE AuthID = '%s'",
        SQL_TABLE, g_eSQLData[iKiller][PD_KILLS], g_eSQLData[iKiller][PD_DEATHS],
        g_eSQLData[iKiller][PD_HEAD], g_eSQLData[iKiller][PD_SKILL], g_eSQLData[iKiller][PD_AUTHID],
        SQL_TABLE, g_eSQLData[iVictim][PD_KILLS], g_eSQLData[iVictim][PD_DEATHS],
        g_eSQLData[iVictim][PD_HEAD], g_eSQLData[iVictim][PD_SKILL], g_eSQLData[iVictim][PD_AUTHID]
    );
29 Мар 2019
Может правда лучше не замарачиваться над этим, просто думал об "оптимизации", а именно сделать пакетную отправку запроса.
 
Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
Javekson, Это ты при событии килла сразу данные отсылаешь? Если так (и тебя не заботит успешность выполнения обоих запросов), то такой вариант оправдан. 1 форматекс вместо 2, 1 тредквери вместо 2.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Это ты при событии килла сразу данные отсылаешь?
Да

Если так (и тебя не заботит успешность выполнения обоих запросов)
Не совсем понял об успешности запроса, под этой фразой подразумевается то, что запрос может не дойти или то, что в обработчики я не произвожу никаких действий с ответом?
29 Мар 2019
И еще вопрос, я же правильно понимаю, что HC_CONTINUE = PLUGIN_CONTINUE по своей сути?
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Не совсем понял об успешности запроса, под этой фразой подразумевается то, что запрос может не дойти или то, что в обработчики я не произвожу никаких действий с ответом?
Если один фейланется из двух то фейланутся два одновременно
29 Мар 2019
И еще вопрос, я же правильно понимаю, что HC_CONTINUE = PLUGIN_CONTINUE по своей сути?
Если очень грубо то да
 
Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
HC_CONTINUE = PLUGIN_CONTINUE по своей сути?
Это просто "именованные цифры".

Код:
/**
 * Return codes
 */
#define PLUGIN_CONTINUE     0   /* Results returned by public functions */
#define PLUGIN_HANDLED      1   /* stop other plugins */
#define PLUGIN_HANDLED_MAIN 2   /* to use in client_command(), continue all plugins but stop the command */
Код:
/**
* Hookchain return types
*/
enum
{
	HC_CONTINUE = 0, // Plugin didn't take any action
	HC_SUPERCEDE,    // Skip real function, use my return value
	HC_BREAK         // Skip all forwards and real function, use my return value
                     // @note Warning: Be very careful, using this type of return will skip calls for all following AMXX plugins
};
т.е. 0, 1, 2
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Снова магия ребят ))
SELECT COUNT(*) FROM stats WHERE Skill > 104.61 ORDER BY Skill DESC

Почему в результате 1 висит? )) Когда по сути 0 должно быть.

Результат
2019-04-08_160906.png

Табличка
2019-04-08_160915.png
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу