PDA

Просмотр полной версии : [Вопрос] [MySQL R-34] ORM функции | "Система регистрации"



Don_Omare
20.04.2015, 02:35
Суть проблемы:

* В БД MySQL R-34 (работаю с денвером) сохраняются все данные кроме Ника игрока и Ника человека который его пригласил.
* Интересно то что пароль, email и другие данные типа string вполне удачно записываются в БД.
* Всю систему регистрации построил на ORM функциях.
* Делая все это через стандартные запросы, сохраняется все прекрасно, но в разные строки, по этому и решил использовать orm - помогло!
* Использую ID аккаунта в таблице, установил auto_increment ( A_I );
* В sever_log и в логе mysql ошибок нет! Все запросы обрабатываются верно, как нужно.
=================================================================
::: Значит просто не прописал этот запрос, но все увидите ниже...
=================================================================
__Больше добавить мне нечего, на все вопросы буду отвечать в каментариях.
__Код и скриншот прилагаются ниже:
__P.S. Код будет сокращен, показаны только "рабочие" моменты - там где используются сами функции
=================================================================
http://s017.radikal.ru/i420/1504/85/9cfee90edd00.png


#include <a_samp>
#include <a_mysql>

#define MYSQL_HOST "localhost" //127.0.0.1
#define MYSQL_USER "root"
#define MYSQL_DATABASE "R.com"
#define MYSQL_PASSWORD ""
#define TBDP "accounts" //Название БД
#define MYSQL_CONNECT_INFO MYSQL_HOST,MYSQL_USER,MYSQL_DATABASE,MYSQL_PASSWORD
//------
#define MAX_PASS_LEN 20
#define MAX_PASS_EMAIL 64

enum PlayerInfo
{
ORM:ORM_ID,
pID //id аккаунта в таблице БД
pInvite_Player_Name[MAX_PLAYER_NAME],
pName[MAX_PLAYER_NAME],
pPassword[MAX_PASS_LEN],
pEmail[MAX_PASS_EMAIL],
pSex, //Ну и тип int для примера 1/0
}

new pInfo[PlayerInfo];
new mysql_connect_ID;

forward OnPlayerDataLoad(playerid);

public OnGameModeInit()
{
mysql_connect_ID = mysql_connect(MYSQL_CONNECT_INFO);
printf("id подключения BD R.com = %i",mysql_connect_ID); // показывает 1
return 1;
}
public OnPlayerConnect(playerid)
{
Clear_The_Variables(playerid); // Тут мы почистили все переменные из енума.
GetPlayerName(playerid,pNick(playerid),MAX_PLAYER_NAME);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//Прошу обратить внимание на 2ой параметр, во всех уроках его нет, так же как и связи БД с таблицей.
//Думаю что поставил правильно
pInfo[playerid][ORM_ID] = orm_create(TBDP,mysql_connect_ID);//создаем ORM
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
new ORM:p = pInfo[playerid][ORM_ID]; //для упрощения привязки[/COLOR]
orm_addvar_int(p,pInfo[playerid][pID],"ID"); // Привязываем переменную pInfo[playerid][pID] к значеню "ID" в таблице БД
orm_addvar_string(p,pInfo[playerid][pName],MAX_PLAYER_NAME,"pName");
orm_addvar_string(p,pInfo[playerid][pPassword],MAX_PASS_LEN,"pPassword");
orm_addvar_string(p,pInfo[playerid][pEmail],MAX_PASS_EMAIL,"pEmail");
orm_addvar_int(p,pInfo[playerid][pSex],"pSex");
orm_addvar_string(p,pInfo[playerid][pInvite_Player_Name],MAX_PLAYER_NAME,"pInvite_Player_Name"); //-------------------
orm_setkey(p,"pName"); //т.к. мы не знаем ID игрока в БД, ставим за ключ Ник игрока
orm_load(p,"OnPlayerDataLoad","d",playerid); //сценарий выгрузки информации из БД и записи их в прикрепленные переменные
return 1;
}
public OnPlayerDataLoad(playerid)
{
switch(orm_errno(pInfo[playerid][ORM_ID]))
{
case ERROR_OK: //Авторизация
case ERROR_NO_DATA: //Отправляем на диалог регистрации
}
return 1;
}
//=========================
//Далее игрок проходит все диалоги реги
//Спавним его и записываем все данные
//собранные во время реги в БД "account"
//==========================
stock CreateNewAccount(playerid)
{
//Спавним игрока;
//Выставляем значение переменным енума
pInfo[playerid][pMoneyBank] = 0;
pInfo[playerid][pHealth] = 100.0;
SetPlayerHealth(playerid, pInfo[playerid][pHealth]);
//==============
orm_insert(pInfo[playerid][ORM_ID],"OTVET","d",playerid); //И вот мы записываем в БД все, что накопил в себе наш ORM
return 1;
}
forward OTVET(playerid);
public OTVET(playerid)
{
switch(orm_errno(pInfo[playerid][ORM_ID]))
{
case ERROR_OK: print("Все ок");
case ERROR_NO_DATA: print("Не сохранили");
}
return 1;
}
//----------------
//Как вы видите выше, мы отправляем результат в паблик OTVET, в консоль сервера выдает, "все ок"
//----------------
stock Clear_The_Variables(playerid)
{
pInfo[playerid][pID] = 0;
pInfo[playerid][pSex] = 0;
return 1;
}

Osetin
20.04.2015, 22:27
И не лень вам было каждую строку выделять отдельным цветом?

Desulaid
21.04.2015, 08:09
Я конечно не специалист, но разве ORM не медленнее простого варианта?