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

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

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

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

Чтение данных с MySQL

OverGame
сообщение 22.11.2014, 12:29
Сообщение #1
Стаж: 11 лет

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

Обновляю свою сборку Ultimate Public и решил сделать хранение данных в MySQL. Но столкнулся с такой проблемой : При коннекте другого игрока, не создается новая таблица для пользователя с его данными, а читаются данные другого игрока. С чем это может быть связано?

Скрытый текст
Код:
#include < amxmodx >
#include < amxmisc >
#include < upsystem >
#include < dhudmessage >
#include < sqlx >

#define PLUGIN "Ultimate Public System"
#define VERSION "1.3"
#define AUTHOR "OverGame"

#pragma tabsize 0

new Handle:MYSQL_Tuple
new Handle:MYSQL_Connect

new g_Sql[5]

enum _:PlData
{
gMoney, gMdl
};

new UserData[33][PlData];

new g_ActiveMysql, szPlayerMysql[33], szSteamId[35], gMsg[255], gMaxPlayer

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_event("DeathMsg","EventDeath","a");
register_logevent("EventEnd", 2, "1=Round_End");
register_dictionary("up_lang.txt");

g_Sql[1] = register_cvar("up_host", "127.0.0.1");
g_Sql[2] = register_cvar("up_user", "root");
g_Sql[3] = register_cvar("up_password", "password");
g_Sql[4] = register_cvar("up_dbname", "ultimate_public");

gMaxPlayer = get_maxplayers();

set_task(1.0, "MYSQL_Load");
}

public plugin_cfg()
{
new szCfgDir[64], szFile[192];
get_configsdir(szCfgDir, charsmax(szCfgDir));
formatex(szFile,charsmax(szFile),"%s/up_system.cfg",szCfgDir);
if(file_exists(szFile))
server_cmd("exec %s", szFile);
}

#include " ultimate_public/native.inl "

public MYSQL_Load()
{
new szHostname[30], szUsername[30], szPassword[30], szDatabase[30]
new szError[512], szErr

get_pcvar_string(g_Sql[1], szHostname, charsmax( szHostname ))
get_pcvar_string(g_Sql[2], szUsername, charsmax( szUsername ))
get_pcvar_string(g_Sql[3], szPassword, charsmax( szPassword ))
get_pcvar_string(g_Sql[4], szDatabase, charsmax( szDatabase ))

MYSQL_Tuple = SQL_MakeDbTuple(szHostname, szUsername, szPassword, szDatabase)
MYSQL_Connect= SQL_Connect(MYSQL_Tuple, szErr, szError, charsmax( szError ))

if(MYSQL_Connect == Empty_Handle)
set_fail_state( szError )

g_ActiveMysql = true
}

public EventEnd()
{
for(new id = 0; id <= gMaxPlayer; id++)
{
if(!is_user_bot(id) && is_user_connected(id))
{
new szError[512]
new Handle:szUpdate

szUpdate = SQL_PrepareQuery(MYSQL_Connect, "UPDATE `upsystem` SET `money` = '%i', `models` = '%i' WHERE `upsystem`.`steamid` = '%s';", UserData[id][gMoney], UserData[id][gMdl], szSteamId)

if(!SQL_Execute(szUpdate))
{
SQL_QueryError(szUpdate, szError, charsmax( szError ))
set_fail_state( szError )
}
}
}
return PLUGIN_CONTINUE;
}

public EventDeath()
{
for(new id = 0; id <= gMaxPlayer; id++)
{
if(!is_user_bot(id) && is_user_connected(id))
{
new iKiller = read_data(1);
new iVictim = read_data(2);
new iHead = read_data(3);

set_dhudmessage(243, 180, 48, 0.57, 0.75, 0, 1.0, 1.0, 0.1, 0.1)

if ( iHead && iKiller != iVictim && is_user_connected(iKiller) && is_user_connected(iVictim) )
{
UserData[iKiller][gMoney] += 3;
formatex(gMsg, charsmax(gMsg), "+3 %L %L", id, "MONEY_NAME", id, "HEAD_MONEY")
} else
if ( iKiller != iVictim && is_user_connected(iKiller) && is_user_connected(iVictim) )
{
UserData[iKiller][gMoney] += 1;
formatex(gMsg, charsmax(gMsg), "+1 %L", id, "MONEY_NAME")
}

show_dhudmessage(iKiller, gMsg)
}
}
return PLUGIN_CONTINUE;
}

public client_connect(id)
{
if(!is_user_bot(id) && !is_user_hltv(id))
{
get_user_authid(id, szSteamId, 34)
set_task(1.0, "CheckPlayer", id)
}
}

public CheckPlayer(id)
{
if(!g_ActiveMysql)
{
set_task(1.0, "CheckPlayer", id)
}

new szError[512]
new szMYSQLName[35]
new Handle:szSelect

szSelect = SQL_PrepareQuery(MYSQL_Connect, "SELECT * FROM upsystem")

if(!SQL_Execute(szSelect))
{
SQL_QueryError(szSelect, szError, charsmax( szError ))
set_fail_state( szError )
}

while(SQL_MoreResults(szSelect))
{
SQL_ReadResult(szSelect, 1, szMYSQLName, charsmax( szMYSQLName ))

if(equal(szMYSQLName, szSteamId))
{
UserData[id][gMoney] = SQL_ReadResult(szSelect, 2)
UserData[id][gMdl] = SQL_ReadResult(szSelect, 3)
szPlayerMysql[id] = true

break
}else{
SQL_NextRow(szSelect)
}
}

if(!szPlayerMysql[id])
{
new Handle:szInsert
szInsert = SQL_PrepareQuery(MYSQL_Connect, "INSERT INTO `upsystem` (`steamid`, `money`, `models`) VALUES ('%s', '0', '0');", szSteamId)

if(!SQL_Execute(szInsert))
{
SQL_QueryError(szInsert, szError, charsmax( szError ))
set_fail_state( szError )
}
szPlayerMysql[id] = true
}
}

public client_disconnect(id)
{
new szError[512]
new Handle:szUpdate

szUpdate = SQL_PrepareQuery(MYSQL_Connect, "UPDATE `upsystem` SET `money` = '%i', `models` = '%i' WHERE `upsystem`.`steamid` = '%s';", UserData[id][gMoney], UserData[id][gMdl], szSteamId)

if(!SQL_Execute(szUpdate))
{
SQL_QueryError(szUpdate, szError, charsmax( szError ))
set_fail_state( szError )
}
}


Отредактировал: OverGame, - 22.11.2014, 12:31
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Metal Messiah
сообщение 22.11.2014, 12:50
Сообщение #2


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

Стаж: 13 лет

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

HostGame.cf
Насколько я понял не таблица а запись в таблице

хранение по steamid не безопасно, возможны коллизии или подмены

szSelect = SQL_PrepareQuery(MYSQL_Connect, "SELECT * FROM upsystem") это жесть, добавь сразу WHERE szMYSQLName=szSteamId
или типа того


Полезные публикации - ссылки у меня в профиле. Ссылка на плагин против спама на сервере StopServerSpam там же.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
OverGame
сообщение 22.11.2014, 13:00
Сообщение #3
Стаж: 11 лет

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

Цитата(Metal Messiah @ 22.11.2014, 12:50) *
Насколько я понял не таблица а запись в таблице

хранение по steamid не безопасно, возможны коллизии или подмены

szSelect = SQL_PrepareQuery(MYSQL_Connect, "SELECT * FROM upsystem") это жесть, добавь сразу WHERE szMYSQLName=szSteamId
или типа того



Код:
szSelect = SQL_PrepareQuery(MYSQL_Connect, "SELECT * FROM upsystem")

Так ведь, вроде как он берет таблицу upsystem. Данные хранятся в этой таблицы по ID номерам:
ID : 1 | SteamID : SteamID | Money : 0 | Models : 0

Все исправил, теперь все работает нормально.

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