PDA

Просмотр полной версии : [Вопрос] MySQL R7. Проблема с сохранением аккаунта.



Rachade
27.07.2014, 18:36
Здравствуйте.
Недавно по уроку создал регистрацию/авторизацию с нуля на MySQL R7.
Я добавил свою переменную pGend, которая отвечает за пол персонажа.
Вроде всё работает, но когда я присваиваю значение 1 переменной pGend (через команду) и выхожу из игры
в БД у меня остаётся эта переменная на нуле. Если нужны какие-нибудь сведения, чтобы найти ошибку, пишите,
сразу же предоставлю. А пока я даю вам саму команду, сохранение аккаунта, и где оно применяется.

if(strcmp(cmd, "/mygend_one", true) == 0)
{
pInfo[playerid][pGend] = 1;
pInfo[playerid][pScore] = 55;
SendClientMessage(playerid, COLOR_YELLOW, "Поздравляем, ты стал мужчиной! :)");
return true;
}
Уровень кстати тоже не обновляется.

stock SavePlayer(playerid)
{
if(GetPVarInt(playerid, "pLogged") > 0)
{
new strsave[128];
format(strsave, sizeof(strsave), "UPDATE `Accounts` SET `pKey`, `pScore` = '%d', `pGend` = '%d'",
pInfo[playerid][pKey], pInfo[playerid][pScore], pInfo[playerid][pGend]);
format(strsave, sizeof(strsave),"%s WHERE `Name` = '%s'", strsave, pNick(playerid));
mysql_query(strsave, -1, 0, ConnectHandle);
printf("[MySQL]: Аккаунт %s был успешно сохранён.", pNick(playerid));
}
else printf("[MySQL]: Ошибка сохранения аккаунта %s", pNick(playerid));
return true;
}

public OnPlayerDisconnect(playerid, reason)
{
if(GetPVarInt(playerid, "pLogged") > 0)
{
SavePlayer(playerid);
}
return true;
}
В логах пишет, что аккаунт всё же сохранён. Но почему-то в phpmyadmin ничего не обновляется.
http://i.imgur.com/APezk2z.png
Вот ещё кое что, может быть поможет:
http://i.imgur.com/PApY7C7.png

underwoker
27.07.2014, 19:27
Пробуйте так.

stock SavePlayer(playerid)
{
if(GetPVarInt(playerid, "pLogged") > 0)
{
new strsave[128];
format(strsave, sizeof(strsave), "UPDATE `Accounts` SET `pKey` = '%s', `pScore` = '%d', `pGend` = '%d'", pInfo[playerid][pKey], pInfo[playerid][pScore], pInfo[playerid][pGend]);
format(strsave, sizeof(strsave),"%s WHERE `Name` = '%s'", strsave, pNick(playerid));
//mysql_query(strsave, -1, 0, ConnectHandle);
mysql_function_query(ConnectHandle, strsave, true, "","");//
printf("[MySQL]: Аккаунт %s был успешно сохранён.", pNick(playerid));
}
else printf("[MySQL]: Ошибка сохранения аккаунта %s", pNick(playerid));
return true;
}
Не заработает - логи mysql_log.txt сюда скиньте, предварительно включив mysql_debug или mysql_log(Не помню как там на R7).
И еще проверьте пвар pLogged устанавливается в значение 1 при логине или нет. Помню на таком простом месте запнулся когда-то.

Rachade
27.07.2014, 20:03
Не помогло.
О как. 55 присвоилось переменной pGend, а хотя должно было присвоиться pScore. Но в phpmyadmin все равно значение не изменилось.

[20:55:50] >> mysql_connect(localhost, root, newbase, ******) on port 3306
[20:55:50] CMySQLHandler::CMySQLHandler() - constructor called.
[20:55:50] CMySQLHandler::CMySQLHandler() - Connecting to "localhost" | DB: "newbase" | Username: "root"
[20:55:50] CMySQLHandler::Connect() - Connection was successful.
[20:55:50] CMySQLHandler::Connect() - Auto-Reconnect has been enabled.
[20:55:50] >> mysql_ping( Connection handle: 1 )
[20:55:50] CMySQLHandler::Ping() - Connection is still alive.
[20:56:08] >> mysql_real_escape_string( Connection handle: 1 )
[20:56:08] CMySQLHandler::EscapeString(Steve_Hudso); - Escaped 11 characters to Steve_Hudso.
[20:56:08] >> mysql_query_callback( Connection handle: 1 )
[20:56:08] Passing query SELECT `Name` FROM `Accounts` WHERE `Name` = 'Steve_Hudso' | d
[20:56:08] ProcessQueryThread(OnPlayerRegCheck) - Query was successful. (SELECT `Name` FROM `Accounts` WHERE `Name` = 'Steve_Hudso')
[20:56:08] ProcessQueryThread(OnPlayerRegCheck) - Data caching enabled.
[20:56:08] CMySQLHandler::StoreResult() - Result was stored.
[20:56:08] CMySQLHandler::FreeResult() - Result was successfully free'd.
[20:56:08] CMySQLHandler::ProcessQueryThread() - Data is getting passed to ->ProcessTick()
[20:56:08] OnPlayerRegCheck(d) - Threaded function called.
[20:56:08] >> cache_get_data( Connection handle: 1 )
[20:56:08] ProcessTick() - The cache has been cleared.
[20:56:26] >> mysql_query_callback( Connection handle: 1 )
[20:56:26] Passing query INSERT INTO `Accounts` (`Name`, `pKey`) VALUES ('Steve_Hudso', '123123') | d
[20:56:26] ProcessQueryThread(RegisterCallback) - Query was successful. (INSERT INTO `Accounts` (`Name`, `pKey`) VALUES ('Steve_Hudso', '123123'))
[20:56:26] CMySQLHandler::ProcessQueryThread() - Data is getting passed to ->ProcessTick()
[20:56:26] RegisterCallback(d) - Threaded function called.
[20:56:35] >> mysql_query_callback( Connection handle: 1 )
[20:56:35] Passing query UPDATE `Accounts` SET `pKey`, `pScore` = '0', `pGend` = '55' WHERE `Name` = 'Steve_Hudso' |
[20:56:35] CMySQLHandler::ProcessQueryThread() - Error will be triggered to OnQueryError()
Переменной pLogged присваивается значение: 1 при регистрации/авторизации. Проблема не в этом.

Rachade
27.07.2014, 21:06
Заметил кое что.
В вашем коде:

format(strsave, sizeof(strsave), "UPDATE `Accounts` SET `pKey` = '%s', `pScore` = '%d', `pGend` = '%d'", pInfo[playerid][pKey], pInfo[playerid][pScore], pInfo[playerid][pGend]);
Вы для pKey поставили значение %s. Когда я его ставлю, то в таблице в pKey появляется пустота. Но, pScore and pGend сохраняются (даже в phpmyadmin). Я попробовал поставить вместо %s числовое значение %d, и в таблице появляется 0. Но сохранение остальных переменных в порядке. Помогите пожалуйста разобраться с паролем :)

J-Ex
27.07.2014, 21:08
А зачем каждый раз вообще пароль сохранять? Запрос, который вам дали, верный, остальное нужно смотреть в записи значения пароля на переменную.



if(GetPVarInt(playerid, "pLogged")

Не по теме, но зачем дважды проверять?

Rachade
27.07.2014, 21:14
А зачем каждый раз вообще пароль сохранять? Запрос, который вам дали, верный, остальное нужно смотреть в записи значения пароля на переменную.
Как я понял из ваших слов: нужно убрать сохранение пароля при SavePlayer и поставить сохранение только при регистрации?
Вот вся информация, где запрашивается переменная пароля:

enum PlayerInfo
{
pName[MAX_PLAYER_NAME],
pKey[128],
pScore,
pGend,
};

stock OnPlayerRegister(playerid, password[])
{
new strreg[128];
format(strreg, sizeof(strreg), "INSERT INTO `Accounts` (`Name`, `pKey`) VALUES ('%s', '%s')", pNick(playerid), password);
mysql_function_query(ConnectHandle, strreg, false, "RegisterCallback", "d", playerid);
return true;
}

stock OnPlayerLogin(i, password[])
{
new strlogin[128];
format(strlogin, sizeof(strlogin), "SELECT * FROM `Accounts` WHERE `Name` = '%s' AND `pKey` = '%s'", pNick(i), password);
mysql_function_query(ConnectHandle, strlogin, true, "LoginCallback", "ds", i, password);
return true;
}


if(GetPVarInt(playerid, "pLogged")
Не по теме, но зачем дважды проверять?
Это проверка будет полезна в будущем. Кроме сохранения там будут другие функции, которые должны работать, только при авторизованном игроке.

J-Ex
27.07.2014, 21:16
Верно меня поняли, уберите. Сейв пароля нужен при смене пароля, поэтому нет смысла каждый раз его сейвить.

Rachade
27.07.2014, 21:22
Всё работает. Огромное спасибо underwoker и J-Ex.
Тему можно закрывать, а может и пригодиться для кого-нибудь.