Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Сохранение Убийств В Mysql Бд

, Нужна помощь в доработке.
Статус пользователя Maggog
сообщение 9.9.2012, 20:12
Сообщение #1
Стаж: 13 лет

Сообщений: 1
Благодарностей: 1
Полезность: 0

Приветствую.

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

Исходник
Код
#include <amxmodx>
#include <sqlx>
#include <ks>
#include <hamsandwich>
#include <fakemeta>

new playerID[33][32], Handle: SqlTuple, query_string[1000];
const PEV_SPEC_TARGET = pev_iuser2;
new g_Points[33];
new regkill, kill, c_name[32], c_authid[32], CurrentTime[22], logtext[256], ID[46], type, Data[2];
new g_szLogFile[64], szTime[32];
new szLogInfo[] = "amx_logdir";

public plugin_init()
{
    register_plugin("kill_Sistem", "0.1", "Jah");
    RegisterHam(Ham_Killed, "player", "ham_PlayerKilled");

    register_cvar("aa_sql_host", "host");
    register_cvar("aa_sql_user", "test");
    register_cvar("aa_sql_pass", "test");
    register_cvar("aa_sql_db", "test");

    get_localinfo(szLogInfo, g_szLogFile, charsmax(g_szLogFile));
    add(g_szLogFile, charsmax(g_szLogFile), "/ks");
    if(!dir_exists(g_szLogFile))
        mkdir(g_szLogFile);
    get_time("L%Y%m%d", szTime, charsmax(szTime));
    format(g_szLogFile, charsmax(g_szLogFile), "%s/%s.log", g_szLogFile, szTime);
    
    get_time("%d/%m/%Y - %X", CurrentTime, 21);
}

public plugin_cfg()
{
    new host[64], user[64], password[64], database[64];
    get_cvar_string("aa_sql_host", host, charsmax(host));
    get_cvar_string("aa_sql_user", user, charsmax(user));
    get_cvar_string("aa_sql_pass", password, charsmax(password));
    get_cvar_string("aa_sql_db", database, charsmax(database));

    SqlTuple = SQL_MakeDbTuple(host, user, password, database);

    formatex (query_string, charsmax(query_string), "CREATE TABLE IF NOT EXISTS `bdkills` (`Kills` int(11) NOT NULL ,`SteamID` varchar(100) NOT NULL, INDEX (`SteamID`)) ENGINE=MyISAM;");
    SQL_ThreadQuery(SqlTuple, "sqlthread_Ignore", query_string, query_string, strlen(query_string)+1)

    return PLUGIN_CONTINUE;
}

public sqlthread_Ignore(failstate, Handle:query, const error[], errnum, const args[], args_num, Float:queuetime)
{
    if(failstate)
    {
        format(logtext, 255, "[KS_DEBUG] %s: - Error! Threaded query error #%d.", CurrentTime, errnum);
        write_file(g_szLogFile, logtext);

        format(logtext, 255, "[KS_DEBUG] %s: - --> Error is: %s", CurrentTime, error);
        write_file(g_szLogFile, logtext);

        format(logtext, 255, "[KS_DEBUG] %s: - --> Query was: %s", CurrentTime, args);
        write_file(g_szLogFile, logtext);
    }
}

public ham_PlayerKilled(victim, attacker)
{
    if (is_user_bot(attacker))
        return HAM_HANDLED;
    static selfkill;
    selfkill = (victim == attacker || !is_user_connected(attacker)) ? true : false;
    if (!selfkill)
    {
        g_Points[attacker]++;
    }
    return HAM_HANDLED;
}

public client_putinserver(id)
{
    if (is_user_bot(id))
        return PLUGIN_HANDLED;
    if (is_user_connected(id) && is_user_alive(id))
    {
        set_task(10.0, "ShowHud", id, _, _, "b");
    }

    set_task(300.0, "SaveData", id);

    format(Data,1,"%d",id);

    get_user_name(id, c_name, charsmax(c_name));
    get_user_authid(id, c_authid, charsmax(c_authid));

    //formatex (query_string, charsmax(query_string), "SELECT * FROM `bdkills`");
    formatex (query_string, charsmax(query_string), "SELECT * FROM `bdkills` WHERE `SteamID` = '%s'", c_authid);
    SQL_ThreadQuery(SqlTuple, "sqlthread_bdload", query_string, Data, 1);

    return PLUGIN_CONTINUE;
}

public sqlthread_bdload(failstate, Handle:q_query, const e_error[], errnum, Data[], DataSize)
{
    if(failstate == TQUERY_CONNECT_FAILED)
    {
        format(logtext, 255, "[KS_DEBUG] %s: - (BD-load) Could not connect to SQL database.  [%d] %s", CurrentTime, errnum, e_error);
        write_file(g_szLogFile, logtext);
    }
    else if(failstate == TQUERY_QUERY_FAILED)
    {
        format(logtext, 255, "[KS_DEBUG] %s: - (BD-load) Load Query failed.  [%d] %s", CurrentTime, errnum, e_error);
        write_file(g_szLogFile, logtext);
    }

    new id = str_to_num(Data);
    get_user_name(id, c_name, charsmax(c_name));
    get_user_authid(id, c_authid, charsmax(c_authid));

    if (!SQL_NumResults(q_query))
    {
        server_print("[KS_DEBUG] Nick not found.");
        format(logtext, 255, "[KS_DEBUG] %s: (BD-load) Steam id not found.", CurrentTime);
        write_file(g_szLogFile, logtext);
        
        formatex (query_string, charsmax(query_string), "INSERT INTO `bdkills` VALUES('%s','%d')", c_authid, g_Points[id]);
        SQL_ThreadQuery(SqlTuple, "sqlthread_bdinsert", query_string, Data, 1);
        
        return PLUGIN_HANDLED;
    }
    else
    {
        while(SQL_MoreResults(q_query))
        {
            type = SQL_ReadResult(q_query, 1);
            SQL_ReadResult(q_query, 1, ID, charsmax(ID));
            
            switch(type)
            {
            
                case 0:
                {
                    if(containi(ID, c_name) != -1)
                    {
                        SQL_ReadResult(q_query, 0, playerID[id], charsmax(playerID));
                        break;
                    }
                }
                case 1:
                {
                
                    if(containi(ID, c_authid) != -1)
                    {
                        SQL_ReadResult(q_query, 0, playerID[id], charsmax(playerID));
                        break;
                    }
                }
            }
            server_print("SQL Select Result: %d %s",type,playerID[id])
            format(logtext, 255, "[KS_DEBUG] %s: (BD-load) SQL Select Result: %d %s", CurrentTime, type, playerID[id]);
            write_file(g_szLogFile, logtext);
            SQL_NextRow(q_query);
        }
        return PLUGIN_HANDLED;
    }
    return PLUGIN_CONTINUE;
}

public sqlthread_bdinsert(failstate, Handle:q_query, const e_error[], errnum, Data[], DataSize)
{
    new id = str_to_num(Data);
    if (is_user_bot(id))
        return PLUGIN_HANDLED;
        
    if(failstate == TQUERY_CONNECT_FAILED)
    {
        format(logtext, 255, "[KS_DEBUG] %s: - (BD-insert) Could not connect to SQL database.  [%d] %s", CurrentTime, errnum, e_error);
        write_file(g_szLogFile, logtext);
    }
    else if(failstate == TQUERY_QUERY_FAILED)
    {
        format(logtext, 255, "[KS_DEBUG] %s: - (BD-insert) Insert Query failed.  [%d] %s", CurrentTime, errnum, e_error);
        write_file(g_szLogFile, logtext);
    }

    get_user_name(id, c_name, charsmax(c_name));
    get_user_authid(id, c_authid, charsmax(c_authid));
    format(logtext, 255, "[KS_DEBUG] %s: - (BD-insert) New player added to database.  [%d] %s", CurrentTime, c_authid, c_name);
    write_file(g_szLogFile, logtext);

    return PLUGIN_CONTINUE;
}

public client_disconnect(id)
{
    SaveData(id);
}

public SaveData(id)
{
    if (is_user_bot(id))
        return PLUGIN_HANDLED;
    if(equal(playerID[id], ""))
        return PLUGIN_HANDLED;

    format(Data,1,"%d",id);

    formatex (query_string, charsmax(query_string), "SELECT * FROM `bdkills` WHERE `SteamID` = '%s'", playerID[id]);
    SQL_ThreadQuery(SqlTuple, "sqlthread_bdsave", query_string, Data, 1);

    return PLUGIN_CONTINUE;
}

public sqlthread_bdsave(failstate, Handle:q_query, const e_error[], errnum, Data[], DataSize)
{
    if(failstate == TQUERY_CONNECT_FAILED)
    {
        format(logtext, 255, "[KS_DEBUG] %s: - (BD-save) Could not connect to SQL database.  [%d] %s", CurrentTime, errnum, e_error);
        write_file(g_szLogFile, logtext);
    }
    else if(failstate == TQUERY_QUERY_FAILED)
    {
        format(logtext, 255, "[KS_DEBUG] %s: - (BD-save) Saving Query failed.  [%d] %s", CurrentTime, errnum, e_error);
        write_file(g_szLogFile, logtext);
    }

    new id = str_to_num(Data);
    kill = g_Points[id];

    if(SQL_MoreResults(q_query))
    {
        SQL_ReadResult(q_query, 1, regkill);
        regkill += kill;

        formatex (query_string, charsmax(query_string), "UPDATE `bdkills` SET `Kills` = '%d', WHERE `SteamID` = '%s'", regkill, playerID[id]);
        SQL_ThreadQuery(SqlTuple, "sqlthread_Ignore", query_string);
    }
    else
    {
        formatex (query_string, charsmax(query_string), "INSERT INTO `bdkills` VALUES ('%s', '%d')", playerID[id], kill);
        SQL_ThreadQuery(SqlTuple, "sqlthread_Ignore", query_string);
    }

    playerID[id] = "";

    return PLUGIN_CONTINUE;
}

public ShowHud(id)
{
    new iName[32];
    get_user_name(id, iName, 31);

    if (is_user_connected(id) && is_user_alive(id) && (get_user_team(id) == 1 || get_user_team(id) == 2))
    {
        set_hudmessage(255, 145, 0, 0.01, 0.18, 0, 0.5, 15.0, 0.1, 0.2, -1);
        show_hudmessage( id, "Nik: %s^nУбийств: %d", iName, g_Points[id]);
    }
    else
    {
        new idSpec;
        new iPlayerName[32];
        idSpec = pev(id, PEV_SPEC_TARGET);
        get_user_name(idSpec, iPlayerName, 31);
        set_hudmessage(60, 60, 60, 0.01, 0.18, 0, 0.5, 15.0, 0.1, 0.2, -1);
        show_hudmessage( id, "Nik: %s^nУбийств: %d", iPlayerName, g_Points[idSpec]);
    }
}

Лог
Код
[KS_DEBUG] 9/09/2012 - 18:53:52: (BD-load) Nick not found.


Проблемма скоей всего тут:
Код
formatex (query_string, charsmax(query_string), "CREATE TABLE IF NOT EXISTS `bdkills` (`Kills` int(11) NOT NULL ,`SteamID` varchar(100) NOT NULL, INDEX (`SteamID`)) ENGINE=MyISAM;");


Отредактировал: Maggog, - 9.9.2012, 21:14
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя mazdan
сообщение 9.9.2012, 20:28
Сообщение #2


Иконка группы

Стаж: 15 лет

Сообщений: 7566
Благодарностей: 5437
Полезность: 1305

я далеко не знаток mysql, но может попробовать ему сказать в какие поля хотите вставить значения?
Цитата
formatex (query_string, charsmax(query_string), "INSERT INTO `bdkills` VALUES('%s','%d')", c_authid, g_Points[id]);

->
Код
formatex(query_string, charsmax(query_string), "INSERT INTO bdkills SET Kills=%d, SteamID='%s',g_Points[id], c_authid)


И я не уверен что стоит делать kills NOT NULL
Кроме того, лучше считать дифференциально.
Т.е. апдейт делать так Kills=Kills+%d
Иначе при проблемах можете сбросить счет игроку. А в случае с +%d максимум не посчитаете.

Еще можно INSERT INTO + UPDATE заменить на один REPLACE INTO


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Fire
сообщение 9.9.2012, 21:12
Сообщение #3


Иконка группы

Стаж: 17 лет

Сообщений: 2201
Благодарностей: 2227
Полезность: 963

Прямой путь к дикой нагрузке на mysql


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mazdan
сообщение 10.9.2012, 8:37
Сообщение #4


Иконка группы

Стаж: 15 лет

Сообщений: 7566
Благодарностей: 5437
Полезность: 1305

Цитата(Fire @ 9.9.2012, 23:12) *
Прямой путь к дикой нагрузке на mysql

Работа с базой данных - прямой путь к дикой нагрузке MySQL, это действительно так :)
Вообще не понятно о чем вы.


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя vladsol
сообщение 10.9.2012, 9:48
Сообщение #5
Стаж: 17 лет

Сообщений: 588
Благодарностей: 87
Полезность: 161

Та ну ладно, какая ж это нагрузка?! :)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя vladsol
сообщение 10.9.2012, 10:10
Сообщение #6
Стаж: 17 лет

Сообщений: 588
Благодарностей: 87
Полезность: 161

Maggog,
А Вы смотрели, данные пользователя вставляются правильно? При коннекте....

Цитата
NOT NULL

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


Кстати, поле стим_айди можно было бы сделать UNIQUE... :-)

Отредактировал: vladsol, - 10.9.2012, 10:35
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Тема закрытаНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: