PDA

Просмотр полной версии : [Вопрос] Не успевает отправляться запрос на создание аккаунта



StevenH
07.04.2017, 21:06
Здравствуйте, не успевает отправляться запрос на регистрацию аккаунта. Проблема вот в чем, отправляю запрос на создание аккаунта, и сразу же отправляю запрос на загрузку аккаунта (где в свое время есть проверка, на то, существует ли аккаунт, или нет). Код:



stock RegisterPlayer(playerid)
{
new query[220];
mysql_format(mysql_connect_ID, query, sizeof(query),
"INSERT INTO `accounts` (`id`, `nickname`, `password`, `email`, `referal`, `sex`, `skin`) \
VALUES('', '%e', '%e', '%e', '%e', '%d', '230')",
PlayerInfo[playerid][pNickname], // ник
PlayerInfo[playerid][pPassword], // пароль
PlayerInfo[playerid][pEmail], // емайл
PlayerInfo[playerid][pReferal], // реферал
PlayerInfo[playerid][pSex] // пол
);
mysql_pquery(mysql_connect_ID, query, "","");

SendClientMessage(playerid, CWHITE, "Поздравляем Вас с успешной регистрацией!");
SendClientMessage(playerid, CGREEN, "Подсказка: Направляйтесь на работу грузчика (( Используйте /gps >> По работе >> Работа грузчика ))");
SendClientMessage(playerid, CGREEN, "Подсказка: Грузчиком вы можете заработать на водительские права");
SendClientMessage(playerid, CGREEN, "Подсказка: Рядом с вами есть остановка, где можно дождаться автобус (ВнутриГородской)");
SendClientMessage(playerid, CGREEN, "Подсказка: А также любой тексист отвезет вас на работу бесплатно");
SendClientMessage(playerid, CWHITE, "Подсказка: Мы настоятельно рекомендуем вам прочесть 'Помощь'");
SendClientMessage(playerid, CWHITE, "Используйте следующие команды для активной игры на проекте: /gps, /mm");
new query2[80];
format(query2, sizeof(query2), "SELECT * FROM `accounts` WHERE `nickname` = '%s'", PlayerInfo[playerid][pNickname]);
mysql_pquery(mysql_connect_ID, query2, "LoadPlayerData", "i", playerid);
return true;
}

forward LoadPlayerData(playerid);
public LoadPlayerData(playerid)
{
new rows;
cache_get_row_count(rows);
if(!rows) return SendClientMessage(playerid, CGRAY, "[ERROR #999] Ошибка, сообщите об ошибке на форум!"), NewKick(playerid);
cache_get_value_name_int(0, "id", PlayerInfo[playerid][pID]);
cache_get_value_name(0, "nickname", PlayerInfo[playerid][pNickname], 24);
cache_get_value_name(0, "password", PlayerInfo[playerid][pPassword], 16);
cache_get_value_name(0, "email", PlayerInfo[playerid][pEmail], 32);
cache_get_value_name(0, "referal", PlayerInfo[playerid][pReferal], 24);
cache_get_value_name_int(0, "warn", PlayerInfo[playerid][pSex]);
cache_get_value_name_int(0, "skin", PlayerInfo[playerid][pSkin]);
cache_get_value_name_int(0, "level", PlayerInfo[playerid][pLevel]);
pTemp[playerid][pLogined] = true;
SpawnPlayer(playerid);
return true;
}


В итоге запрос отправляется на создание аккаунта и за ним сразу загрузка аккаунта, но такое чувство как будто запрос не успевает отправляться на регистрацию и игроку пишет 999 ошибку (см. условие if(!rows) return ...;), но если перезайти, после авторизации отправится запрос на авторизацию и тогда все хорошо загрузится..

Что делать?

vovandolg
07.04.2017, 22:47
А что нельзя сделать создание аккаунта в отдельном вызове функции?
За 2 зайцами плохо гнаться))

Кстате для этого существует orm функции(двухсторонний обмен данными одним вызовом) или как то так(инклуд ковырни и почитай о них)

wAx
07.04.2017, 23:24
почему бы не добавить загрузку аккаунта в паблик вызываемый после запроса создания?

vasyok28
08.04.2017, 00:46
Не пойму зачем вам загрузка нужно, так как при создание аккаунта у вас уже есть данные

StevenH
08.04.2017, 01:02
Не пойму зачем вам загрузка нужно, так как при создание аккаунта у вас уже есть данные

Не все данные, в основном есть только имя/пароль/емайл/скин и пол, все остальное выставляется по дефолту в базе, поэтому и нужно загружать... Каждую переменную по дефолту выставлять при регистрации не вариант

- - - Добавлено - - -

Как минимум нужно загрузить ид аккаунта (который с каждым новым аккаунтом увеличивается на +1, в базе стоит AUTO_INCREMENT), без запроса я никак этот id не получу. Ибо у меня все сохранение и тд реализовано на айди аккаунта.. По нику не вариант, т.к. ник могут сменить, и придется везде, во всех логах и тд менять ник..

vasyok28
08.04.2017, 01:59
Не все данные, в основном есть только имя/пароль/емайл/скин и пол, все остальное выставляется по дефолту в базе, поэтому и нужно загружать... Каждую переменную по дефолту выставлять при регистрации не вариант

- - - Добавлено - - -

Как минимум нужно загрузить ид аккаунта (который с каждым новым аккаунтом увеличивается на +1, в базе стоит AUTO_INCREMENT), без запроса я никак этот id не получу. Ибо у меня все сохранение и тд реализовано на айди аккаунта.. По нику не вариант, т.к. ник могут сменить, и придется везде, во всех логах и тд менять ник..

Это все решается и без запроса на выборку. Просто я так понял вас интересует решение именно по вашему коду, тогда поставьте задержку на загрузку. Но ваш код аля рлс, лучше делать правильно сразу, чем потом переделать

- - - Добавлено - - -

Для теста отключите загрузку из БД, и создайте аккаунт, и проверьте если создается

Sp1ke
08.04.2017, 02:35
Здравствуйте, не успевает отправляться запрос на регистрацию аккаунта. Проблема вот в чем, отправляю запрос на создание аккаунта, и сразу же отправляю запрос на загрузку аккаунта (где в свое время есть проверка, на то, существует ли аккаунт, или нет). Код:



stock RegisterPlayer(playerid)
{
new query[220];
mysql_format(mysql_connect_ID, query, sizeof(query),
"INSERT INTO `accounts` (`id`, `nickname`, `password`, `email`, `referal`, `sex`, `skin`) \
VALUES('', '%e', '%e', '%e', '%e', '%d', '230')",
PlayerInfo[playerid][pNickname], // ник
PlayerInfo[playerid][pPassword], // пароль
PlayerInfo[playerid][pEmail], // емайл
PlayerInfo[playerid][pReferal], // реферал
PlayerInfo[playerid][pSex] // пол
);
mysql_pquery(mysql_connect_ID, query, "","");

SendClientMessage(playerid, CWHITE, "Поздравляем Вас с успешной регистрацией!");
SendClientMessage(playerid, CGREEN, "Подсказка: Направляйтесь на работу грузчика (( Используйте /gps >> По работе >> Работа грузчика ))");
SendClientMessage(playerid, CGREEN, "Подсказка: Грузчиком вы можете заработать на водительские права");
SendClientMessage(playerid, CGREEN, "Подсказка: Рядом с вами есть остановка, где можно дождаться автобус (ВнутриГородской)");
SendClientMessage(playerid, CGREEN, "Подсказка: А также любой тексист отвезет вас на работу бесплатно");
SendClientMessage(playerid, CWHITE, "Подсказка: Мы настоятельно рекомендуем вам прочесть 'Помощь'");
SendClientMessage(playerid, CWHITE, "Используйте следующие команды для активной игры на проекте: /gps, /mm");
new query2[80];
format(query2, sizeof(query2), "SELECT * FROM `accounts` WHERE `nickname` = '%s'", PlayerInfo[playerid][pNickname]);
mysql_pquery(mysql_connect_ID, query2, "LoadPlayerData", "i", playerid);
return true;
}

forward LoadPlayerData(playerid);
public LoadPlayerData(playerid)
{
new rows;
cache_get_row_count(rows);
if(!rows) return SendClientMessage(playerid, CGRAY, "[ERROR #999] Ошибка, сообщите об ошибке на форум!"), NewKick(playerid);
cache_get_value_name_int(0, "id", PlayerInfo[playerid][pID]);
cache_get_value_name(0, "nickname", PlayerInfo[playerid][pNickname], 24);
cache_get_value_name(0, "password", PlayerInfo[playerid][pPassword], 16);
cache_get_value_name(0, "email", PlayerInfo[playerid][pEmail], 32);
cache_get_value_name(0, "referal", PlayerInfo[playerid][pReferal], 24);
cache_get_value_name_int(0, "warn", PlayerInfo[playerid][pSex]);
cache_get_value_name_int(0, "skin", PlayerInfo[playerid][pSkin]);
cache_get_value_name_int(0, "level", PlayerInfo[playerid][pLevel]);
pTemp[playerid][pLogined] = true;
SpawnPlayer(playerid);
return true;
}


В итоге запрос отправляется на создание аккаунта и за ним сразу загрузка аккаунта, но такое чувство как будто запрос не успевает отправляться на регистрацию и игроку пишет 999 ошибку (см. условие if(!rows) return ...;), но если перезайти, после авторизации отправится запрос на авторизацию и тогда все хорошо загрузится..

Что делать?

Зачем использовать тогда функции, о которых не знаешь?
mysql_tquery - обрабатывает запрос в порядке очереди
mysql_pquery - обрабатывает запрос без очереди, какой первый дойдет, тот и будет выполнен
Соответственно mysql_pquery заменить на mysql_tquery

vovandolg
08.04.2017, 08:32
Зачем использовать тогда функции, о которых не знаешь?
mysql_tquery - обрабатывает запрос в порядке очереди
mysql_pquery - обрабатывает запрос без очереди, какой первый дойдет, тот и будет выполнен
Соответственно mysql_pquery заменить на mysql_tquery

Вангую что у него эти 2 stock вызываются сразу вместе и функция мускула чу чуть не успевает к условию на проверку существования аккаунта

wAx
08.04.2017, 13:46
stock RegisterPlayer(playerid)
{
new query[220];
mysql_format(mysql_connect_ID, query, sizeof(query),
"INSERT INTO `accounts` (`id`, `nickname`, `password`, `email`, `referal`, `sex`, `skin`) \
VALUES('', '%e', '%e', '%e', '%e', '%d', '230')",
PlayerInfo[playerid][pNickname], // ник
PlayerInfo[playerid][pPassword], // пароль
PlayerInfo[playerid][pEmail], // емайл
PlayerInfo[playerid][pReferal], // реферал
PlayerInfo[playerid][pSex] // пол
);
mysql_tquery(mysql_connect_ID, query, "OnAccountCreate","d",playerid);
return 1;
}

forward OnAccountCreate(playerid);
public OnAccountCreate(playerid)
{
SendClientMessage(playerid, CWHITE, "Поздравляем Вас с успешной регистрацией!");
SendClientMessage(playerid, CGREEN, "Подсказка: Направляйтесь на работу грузчика (( Используйте /gps >> По работе >> Работа грузчика ))");
SendClientMessage(playerid, CGREEN, "Подсказка: Грузчиком вы можете заработать на водительские права");
SendClientMessage(playerid, CGREEN, "Подсказка: Рядом с вами есть остановка, где можно дождаться автобус (ВнутриГородской)");
SendClientMessage(playerid, CGREEN, "Подсказка: А также любой тексист отвезет вас на работу бесплатно");
SendClientMessage(playerid, CWHITE, "Подсказка: Мы настоятельно рекомендуем вам прочесть 'Помощь'");
SendClientMessage(playerid, CWHITE, "Используйте следующие команды для активной игры на проекте: /gps, /mm");
new query2[80];
format(query2, sizeof(query2), "SELECT * FROM `accounts` WHERE `nickname` = '%s'", PlayerInfo[playerid][pNickname]);
mysql_tquery(mysql_connect_ID, query2, "LoadPlayerData", "i", playerid);
return true;
}

forward LoadPlayerData(playerid);
public LoadPlayerData(playerid)
{
new rows;
cache_get_row_count(rows);
if(!rows) return SendClientMessage(playerid, CGRAY, "[ERROR #999] Ошибка, сообщите об ошибке на форум!"), NewKick(playerid);
cache_get_value_name_int(0, "id", PlayerInfo[playerid][pID]);
cache_get_value_name(0, "nickname", PlayerInfo[playerid][pNickname], 24);
cache_get_value_name(0, "password", PlayerInfo[playerid][pPassword], 16);
cache_get_value_name(0, "email", PlayerInfo[playerid][pEmail], 32);
cache_get_value_name(0, "referal", PlayerInfo[playerid][pReferal], 24);
cache_get_value_name_int(0, "warn", PlayerInfo[playerid][pSex]);
cache_get_value_name_int(0, "skin", PlayerInfo[playerid][pSkin]);
cache_get_value_name_int(0, "level", PlayerInfo[playerid][pLevel]);
pTemp[playerid][pLogined] = true;
SpawnPlayer(playerid);
return true;
}

StevenH
09.04.2017, 13:38
Закройте

DeimoS
09.04.2017, 19:12
Советую изучить эту (http://pro-pawn.ru/showthread.php?10548-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B-%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%BD%D0%B0-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5-%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0-MySQL-R39-R40) тему и посмотреть как там реализовано получение значения AUTO_INCREMENT после отправки запроса на создание аккаунта.

И да, чтоб не прописывать установку дэфолтного значения вручную, можно сделать так:

enum e_PLAYER_INFO
{
pID,
pName[MAX_PLAYER_NAME+1],
pMoney,
pLevel,
pSkin
};
new pInfo[MAX_PLAYERS][e_PLAYER_INFO];
new NULL_pInfo[e_PLAYER_INFO] =//Значение "по умолчанию" для всех переменных игроков
{
-1,
'\0',
10000,
1
};
И каждый раз, когда нужно вернуть значение в дэфолтное состояние, достаточно прописать одну строку

pInfo[playerid] = NULL_pInfo;
А не мучить сервер и MySQL лишними запросами.

Сейчас твой код на слабую троечку. Вместо того, чтоб изобретать костыли, лучше сделай всё так, как следует делать.

Закрыто.