-=Nexus=-
Дебютант
Всем привет. В pawno я новенький, пишу свой проект с чистого листа, возникла проблема с переводом мода на mysql R7 (blueG).Быть точнее - что то я мудрю с системой регистрации. До этого использовал MySQL R6, все работало норм. Попробывал его перевести, насчет измененных функций я в курсе. компиляция прошла без проблем, но возникают следующая проблема:
не происходит проверка на то, есть ли пользователь в базе или нет. Предположим, я этого пользователя заново регистрирую. В игру заходит, после перезахода - снова требуется регистрация. И в базе создается эта запись с этим пользователем. Так то этот юзер есть, в базе, но samp мне говорит, что данный пользователь не зарегистрирован. Получается, что какая то функция не работает, отвечающая за проверку на наличие записи в бд.
Если кто то знает, что делать в такой ситуации, отпишитесь. Часть кода я кидаю ниже (что непонятно, попытаюсь закомментировать)
:dn:
Извините за столь длинный и нехорошо оформленный код.
Кто поможет, как тут быть, отблагодарю, сами знаете чем
не происходит проверка на то, есть ли пользователь в базе или нет. Предположим, я этого пользователя заново регистрирую. В игру заходит, после перезахода - снова требуется регистрация. И в базе создается эта запись с этим пользователем. Так то этот юзер есть, в базе, но samp мне говорит, что данный пользователь не зарегистрирован. Получается, что какая то функция не работает, отвечающая за проверку на наличие записи в бд.
Если кто то знает, что делать в такой ситуации, отпишитесь. Часть кода я кидаю ниже (что непонятно, попытаюсь закомментировать)
:dn:
PHP:
public OnPlayerConnect(playerid)
new query[128];
mysql_format(dbHandle, query,"SELECT `ID` FROM `users` WHERE `Name` = '%s'", Player[playerid][pName]);
mysql_function_query(dbHandle, query, true, "OnPlayerRegCheck","d", playerid); //проверка на зарегистрированнного пользователя
.......................................................................................................................
//сами диалоги
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) диалог
{ switch(dialogid) {
case LOGIN: { // Диалог авторизации.
if(!response) {
SendClientMessage(playerid, COLOR_YELLOW, "* Вы передумали авторизоваться. Введите /q, чтобы выйти. Как задумаете - заходите к нам!");
Kick(playerid);
return 1;
}
if(!strlen(inputtext)) {
new dialog[134+MAX_PLAYER_NAME];
format(dialog, sizeof(dialog),
"%s, вы не ввели пароль!\n\
Попробуйте еще раз:",
Player[playerid][pName]);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DSP, "{ffff66}Пустое поле ввода", dialog, "Войти", "Отмена");
return 1;
}
LoginAccount(playerid, inputtext); // Пробуем его авторизовать.
}
case REGISTER: { // Диалог регистрации.
if(!response) {
SendClientMessage(playerid, COLOR_YELLOW, "*Вы отказались от регистрации.");
Kick(playerid);
return 1;
}
if(!strlen(inputtext) || strlen(inputtext) < 6 || strlen(inputtext) > 32) {
new dialog[380+24+32];
format(dialog, sizeof(dialog),
"Пустое поле ввода или пароль не соответствует критериям\n\
Попробуйте еще раз.\n\n\
Примечания:\n\
- Пароль регистрозависимый.\n\
- Длина пароля - от 6 до 32 символов", Player[playerid][pName]);
ShowPlayerDialog(playerid, DIALOG_REGISTER, DSI, "{ff6600}Неверно введен пароль", dialog, "Далее", "Отмена");
return 1;
}
RegisterAccount(playerid, inputtext); // Создаём аккаунт.
}
case WRONGPAS: {
if(response) {
new dialog[134+MAX_PLAYER_NAME];
format(dialog, sizeof(dialog),
"%s, добро пожаловать на сервер!\n\
Введите пароль:",
Player[playerid][pName]);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DSP, "{ffff66}Авторизация на сервере", dialog, "Войти", "Отмена");
return 1;
}
else {
Kick(playerid);
return 1;
}
}
}
return 1;
}
.......................................................................
//callback, stock и прочая ****я
forward OnPlayerRegCheck(playerid); // проверка на зарегистрированнного игрока, тут как раз наверно и проблема
public OnPlayerRegCheck(playerid)
{
if(IsPlayerConnected(playerid))
{
new rows, fields;
cache_get_data(rows, fields);
if(rows)
{
new dialog[128+MAX_PLAYER_NAME];
format(dialog, sizeof(dialog),
"Привет, %s, пожалуйста, авторизуйтесь:",
Player[playerid][pName]);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DSP, "{ffff66}Авторизация на сервере", dialog, "Войти", "Отмена");
}
else {
new dialog[344+MAX_PLAYER_NAME];
format(dialog, sizeof(dialog),
"%s, добро пожаловать на сервер!\n\
Вы не зарегистрированы.\n\
Для регистрации введите пароль и нажмите \"Далее\".\n\n\
Внимание:\n\
- Пароль чувствителен к регистру.\n\
- Длина - от 6 до 32 символов.\n", Player[playerid][pName]);
ShowPlayerDialog(playerid, DIALOG_REGISTER, DSI, "{ff6600}Регистрация на сервере", dialog, "Далее", "Отмена");
}
return 1;
}
return 1;
}
stock RegisterAccount(playerid, password[]) // регистрация акка
{
new query[128],
sqlname[MAX_PLAYER_NAME],
sqlpassword[32];
mysql_real_escape_string(Player[playerid][pName], sqlname);
mysql_real_escape_string(password, sqlpassword);
mysql_format(dbHandle, query, "INSERT INTO `users` (`Name`, `Password`) VALUE ('%s', '%s')", sqlname, sqlpassword);
mysql_function_query(dbHandle, query, false, "RegisterCallback","d", playerid);
return 1;
}
forward RegisterCallback(playerid);
public RegisterCallback(playerid)
{
SendClientMessage(playerid, COLOR_YELLOW, "Регистрация успешно завершена!");
Player[playerid][pLogged] = true, SpawnPlayer(playerid);
return 1;
}
stock LoginAccount(playerid, password[]) // логин акка
{
new query[128],
sqlpass[32];
mysql_real_escape_string(password, sqlpass);
mysql_format(dbHandle, query, "SELECT * FROM `users` WHERE `Password` = '%s' AND `ID` = '%i'", sqlpass, Player[playerid][pID]);
mysql_function_query(dbHandle, query, true, "LoginCallback","si", playerid, password);
return 1;
}
forward LoginCallback(playerid, password[]); // в случае фиаско
public LoginCallback(playerid, password[])
{
new rows, fields, dialog[128];
cache_get_data(rows, fields);
if(!rows)
{
if(Player[playerid][pWrongPassword] == 2)
{
SendClientMessage(playerid, COLOR_LIGHTRED, "Вы были отключены от сервера, т.к. ввели 3 раза неверный пароль. Введите /q, чтобы выйти из игры.");
Kick(playerid);
return 1;
}
Player[playerid][pWrongPassword] ++;
format(dialog, sizeof(dialog),
"Вы ввели неверный пароль.\n\
У Вас осталось %i из 3 попыток ввода.", 3 - Player[playerid][pWrongPassword]);
ShowPlayerDialog(playerid, DIALOG_WRONGPAS, DSM, "{ff0000}Неверный пароль!", dialog, "Повтор", "Отмена");
return 1;
}
Player[playerid][pLogged] = true;
SendClientMessage(playerid, COLOR_LIGHTRED, "Вы успешно авторизовались!");
SpawnPlayer(playerid), SaveAccount(playerid);
return 1;
}
stock SaveAccount(playerid) { // Сохранение аккаунта.
if(Player[playerid][pLogged] == true) {
CheckMySQLConnection();
new query[186],
sqlname[MAX_PLAYER_NAME],
sqlpass[32];
mysql_real_escape_string(Player[playerid][pName], sqlname);
mysql_real_escape_string(Player[playerid][pPassword], sqlpass);
mysql_format(dbHandle, query, "UPDATE `users` SET `Name` = '%s', `Password` = '%s' WHERE `ID` = '%i'", sqlname, sqlpass, Player[playerid][pID]);
mysql_function_query(dbHandle,query,false,"","");
}
return 1;
}
Извините за столь длинный и нехорошо оформленный код.
Кто поможет, как тут быть, отблагодарю, сами знаете чем
Последнее редактирование:
