Просмотр полной версии : [Вопрос] MySQL R7. Проблема с сохранением аккаунта.
Здравствуйте.
Недавно по уроку создал регистрацию/авторизацию с нуля на 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 при логине или нет. Помню на таком простом месте запнулся когда-то.
Не помогло.
О как. 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 при регистрации/авторизации. Проблема не в этом.
Заметил кое что.
В вашем коде:
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. Но сохранение остальных переменных в порядке. Помогите пожалуйста разобраться с паролем :)
А зачем каждый раз вообще пароль сохранять? Запрос, который вам дали, верный, остальное нужно смотреть в записи значения пароля на переменную.
if(GetPVarInt(playerid, "pLogged")
Не по теме, но зачем дважды проверять?
А зачем каждый раз вообще пароль сохранять? Запрос, который вам дали, верный, остальное нужно смотреть в записи значения пароля на переменную.
Как я понял из ваших слов: нужно убрать сохранение пароля при 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")
Не по теме, но зачем дважды проверять?
Это проверка будет полезна в будущем. Кроме сохранения там будут другие функции, которые должны работать, только при авторизованном игроке.
Верно меня поняли, уберите. Сейв пароля нужен при смене пароля, поэтому нет смысла каждый раз его сейвить.
Всё работает. Огромное спасибо underwoker и J-Ex.
Тему можно закрывать, а может и пригодиться для кого-нибудь.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot