New Unique Players Stats

Сообщения
1,557
Реакции
651
Помог
5 раз(а)
karaulov добавил(а) новый ресурс:

New Unique Players Stats - Записывает статистику подключения новых игроков в базу данных

Записывает в базу данных статистику подключения новых игроков на сервер.


В плагине использую длинные, одиночные SQL запросы для что бы не флудить запросами, так же это позволяет обойти ошибку [MySQL] Thread worker was unable to start. По этому они были записаны в файлы usc_add_user.sql usc_db_create.sql usc_update_day.sql.

Пока что вебUI никакого нет, только для amxbans 1.6 временный сделал.
Конфиг подхватывает стандартный из sql.cfg , после первого запуска создается файл usc.cfg и его можно изменить.

Пример конфига:
Код:
// Mysql host address
ustats_mysql_host "db3.myarena.ru"
// Mysql username
ustats_mysql_user ""
// Mysql password
ustats_mysql_pass ""
// Mysql database name
ustats_mysql_db ""
// Today day
ustats_today "0"
Содержимое файлов SQL запросов:

usc_update_day.sql
SQL:
TRUNCATE TABLE unique_stats_yesterday;
INSERT INTO unique_stats_yesterday SELECT * FROM unique_stats_today;
UPDATE unique_stats_week SET day1 = day2, day2 = day3, day3 = day4, day4 = day5, day5 = day6, day6 = day7;
UPDATE unique_stats_week SET day7 = (SELECT COUNT(*) FROM unique_stats_today);
TRUNCATE TABLE unique_stats_today;
usc_db_create.sql
SQL:
CREATE PROCEDURE INIT_TABLES()
            MODIFIES SQL DATA
        BEGIN
            DECLARE sum1 INT;

            CREATE TABLE IF NOT EXISTS unique_stats_yesterday ( `unique_type` int(11) DEFAULT NULL, `steamid` varchar(64) DEFAULT NULL, `username` varchar(64) DEFAULT NULL, `ip` varchar(64) DEFAULT NULL ); 
            CREATE TABLE IF NOT EXISTS unique_stats_today ( `unique_type` int(11) DEFAULT NULL, `steamid` varchar(64) DEFAULT NULL, `username` varchar(64) DEFAULT NULL, `ip` varchar(64) DEFAULT NULL );   
            CREATE TABLE IF NOT EXISTS unique_stats_total ( `steamid` varchar(64) DEFAULT NULL, `ip` varchar(64) DEFAULT NULL );   
            CREATE TABLE IF NOT EXISTS unique_stats_week ( `day1` int(11) DEFAULT NULL, `day2` int(11) DEFAULT NULL, `day3` int(11) DEFAULT NULL, `day4` int(11) DEFAULT NULL, `day5` int(11) DEFAULT NULL, `day6` int(11) DEFAULT NULL, `day7` int(11) DEFAULT NULL); 

            SET sum1 = (SELECT COUNT(*) FROM unique_stats_week);
            IF sum1 = 0 THEN
                INSERT INTO unique_stats_week (`day1`, `day2`, `day3`, `day4`, `day5`, `day6`, `day7`) VALUES ('0', '0', '0', '0', '0', '0', '0');
            END IF;
            SET sum1 = 0;
        END ;
CALL INIT_TABLES();
DROP PROCEDURE INIT_TABLES;
usc_add_user.sql
SQL:
CREATE PROCEDURE ADD_NEW_UNIQUE_%i()
            MODIFIES SQL DATA
        BEGIN
        DECLARE sum1 INT;
        SET sum1 = (SELECT COUNT(*) FROM unique_stats_total WHERE `steamid` = '%s' AND `ip` = '%s');
        IF sum1 = 0 THEN
            INSERT INTO unique_stats_total (`steamid`, `ip`) VALUES ('%s', '%s');
            INSERT INTO unique_stats_today (`unique_type`, `steamid`, `username`, `ip`) VALUES ('%i', '%s', '%s', '%s');
        END IF;
        END ;
CALL ADD_NEW_UNIQUE_%i();
DROP PROCEDURE ADD_NEW_UNIQUE_%i;
Узнать больше об этом ресурсе...
 
Последнее редактирование:

wellasgood

Кидала, мошенник, вымогатель
Сообщения
1,409
Реакции
182
Помог
2 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
karaulov

А без вот этого можно было обойтись? И сделать например с помощью динамических массивов

C++:
- new g_sQueryBuffer1[4096]; // Big static buffers for read queries from files
- new g_sQueryBuffer2[4096];
- new g_sQueryBuffer3[4096];
- new g_sQueryBuffer4[4096];
Крайне не желательно так делать)
 
Сообщения
1,557
Реакции
651
Помог
5 раз(а)
wellasgood, а как лучше хранить большой текст, ну в принципе вместится и в 2048.
 

wellasgood

Кидала, мошенник, вымогатель
Сообщения
1,409
Реакции
182
Помог
2 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
karaulov, нужно указывать максимальную которая может быть, но не более того.
 
Сообщения
1,557
Реакции
651
Помог
5 раз(а)
wellasgood, уменьшил до 2048. Меньше пока не рискую ставить т.к возможно будут обновления или пользователь сам захочет изменить SQL запросы.

wellasgood, а что значит с помощью динамических массивов? Это как-то упростит или ускорит работу? Как это в моем варианте должно помочь?
 

wellasgood

Кидала, мошенник, вымогатель
Сообщения
1,409
Реакции
182
Помог
2 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
wellasgood, уменьшил до 2048. Меньше пока не рискую ставить т.к возможно будут обновления или пользователь сам захочет изменить SQL запросы.

wellasgood, а что значит с помощью динамических массивов? Это как-то упростит или ускорит работу? Как это в моем варианте должно помочь?
Ну я предложил как вариант, если по коду Вам это не нужно, то оставь как есть.

Array - динамичный массив. В отличие от обычных двумерных массивов, где нужно указывать длину строки и кол-во самих строк, в динамичных нужно указать только длину строки, т.е. они имеют неограниченный размер.

UPD: посмотрел твой код еще раз, дин массив и не нужен.
 
Последнее редактирование:
Сообщения
1,030
Реакции
826
Помог
10 раз(а)
karaulov, зачем экранировать authid и ip?
SQL_QuoteString > mysql_escape_string, но в документации сказано: Do not use this function. Use mysql_real_escape_string_quote() instead, хотя не шарю, может его и правильно юзать, я готовый сток юзаю лично. В описании SQL_QuoteString вообще сказано что экранирует только одинарные ковычки...:dntknw:
 

wellasgood

Кидала, мошенник, вымогатель
Сообщения
1,409
Реакции
182
Помог
2 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Вот такое есть:

C++:
stock mysql_escape_string(output[], len)
{
    static const szReplaceIn[][] = { "\\", "\0", "\n", "\r", "\x1a", "'", "^"" };
    static const szReplaceOut[][] = { "\\\\", "\\0", "\\n", "\\r", "\Z", "\'", "\^"" };
    for(new i; i < sizeof szReplaceIn; i++)
        replace_string(output, len, szReplaceIn[i], szReplaceOut[i]);
}
 
Сообщения
1,030
Реакции
826
Помог
10 раз(а)
wellasgood, немного упростить можно сток.
В моем случае одинарный слеш экранирует разом "\\", "\0", "\n", "\r" и все другое, что указано в официальной документации, хотя тут не все можно экранировать как я понимаю

Table 9.1 Special Character Escape Sequences

Escape SequenceCharacter Represented by Sequence
\0An ASCII NUL (X'00') character
\'A single quote (') character
\"A double quote (") character
\bA backspace character
\nA newline (linefeed) character
\rA carriage return character
\tA tab character
\ZASCII 26 (Control+Z); see note following the table
\\A backslash (\) character
\%A % character; see note following the table
\_A _ character; see note following the table

А так же \x00, "\x1a", но они в то время будут уже с двумя слешами, потому имеем следующий сток, если не туплю конечно, ну и цикл в данном случае будет не сильно важен считаю

Код:
stock func_EscapeString( sString[ ], iLen )
{
    replace_string( sString, iLen, "\",     "\\"  );
    replace_string( sString, iLen, "\\x00", "\\0" );
    replace_string( sString, iLen, "\\x1a", "\\Z" );
    replace_string( sString, iLen, "'",     "\'"  );
    replace_string( sString, iLen, "^"",    "\^"" );
}
12 Фев 2021
И нигде не указано что ее лучше не использовать
MySQL :: MySQL 5.7 Reference Manual можно нагуглить експлойты использования, но как оно работает внутри amx не знаю, не шарю.

Хотя alliedmodders/amxmodx тут mysql_real_escape_string юзается, как я понимаю в случае если укажешь Database handle

а тут alliedmodders/amxmodx mysql_escape_string если укажешь в качестве Database handle Empty_Handle

Все ровно предпочтение отдам стоку лучше, хз, настараживает описание Back-quotes characters in a string for database querying.
 
Последнее редактирование:

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

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