SA-MP PUBLIC
PUBLIC SERVER

MySQL Cache Accounts

In jos

MySQL Cache Accounts

Mesaj Scris de Ghods la data de Joi Oct 30, 2014 1:10 pm

Salut GTA-MP, astăzi vă arăt cum să creaţi un sistem de logare/înregistrare folosind mysql şi whirlpool.
Pentru a merge trebuie să aveţi următoarele:
- Includeul MySQL, se poate downloada de aici, versiunea r39-2.
- Pluginul Whirlpool, se poate downloada de aici
- Pornit xampp/wamp, se poate downloada de aici sau aici.
- O bază de date MySQL creată.
Urmăriţi cu atenţie următorul cod.

Code: [Select]
#include <a_samp> //Include-ul creat de echipa sa-mp.com
#include <a_mysql> //Include-ul creat de BlueG

#define MySQL_Host "localhost" //Numele de host al serverului mysql sau IP-ul serverului.
#define MySQL_User "root"//Numele de utilizator al bazei de date.
#define MySQL_DB "tutorial" //Numele bazei de date.
#define MySQL_Password ""//Parola bazei de date.

#define R_DIALOG 1
#define L_DIALOG 2

native WP_Hash( buffer[ ], len, const str[ ] );//Whirlpool adus in sa-mp de catre Y_Less

enum uData{
Float: Health,
Money,
IP[ 20 ]
}

new U_DATA[ MAX_PLAYERS ][ uData ],
Handle, //Id-ul conexiuni cu baza de date.
szQuery[ 256 ];//Stringul care ne va ajuta la trimiterea Query-urilor(comenzilor) catre baza de date.

public OnFilterScriptInit( )//Puteti folosi si OnGameModeInit
{
Handle = mysql_connect( MySQL_Host, MySQL_User, MySQL_DB, MySQL_Password ); // realizam conectare cu baza de date
if( mysql_errno( Handle ) ) return printf( "[MySQL]: Nu m-am putut conecta la baza de date '%s'.", MySQL_DB );//Verificam daca s-a conectat daca nu s-a conectat afisam un mesaj care spune asta.
else printf( "[MySQL]: Conectarea cu baza de date '%s' a fost realizata.", MySQL_DB );//daca s-a conectat afisam un mesaj care spune asta.
return 1;
}

public OnFilterScriptExit( )//Puteti folosi si OnGameModeExit
{
mysql_close( Handle );//Inchidem conexiunea cu baza de date.
return 1;
}

public OnPlayerConnect( playerid )
{
new Cache: r;//Variabila care stocheaza rezultatul.
szQuery[ 0 ] = EOS;
mysql_format( Handle, szQuery, 128, "SELECT * FROM `users` WHERE `Name` = '%e' LIMIT 1;", GetName( playerid ) );//Formatam un string in care scriem o comanda.
r = mysql_query( Handle, szQuery );//Trimitem comanda catre baza de date. Comanda va selecta toate datele utilizatorului conectat.
if( cache_get_row_count( Handle ) > 0 )//Verificam daca exista numele in baza de date.
{//Daca exista afisam dialogul de logare.
format( szQuery, 128, "Salut %s, acest nume este inregistrat.\nTe rugam sa introduci parola.", GetName( playerid ) );
ShowPlayerDialog( playerid, L_DIALOG, DIALOG_STYLE_PASSWORD, "Logare", szQuery, "Logare", "Exit" );
}
else//Daca numele nu exista in baza de date afisam dialogul de inregistrare.
{
format( szQuery, 128, "Salut %s, acest nume nu este inregistrat.\nTe rugam sa introduci parola.", GetName( playerid ) );
ShowPlayerDialog( playerid, R_DIALOG, DIALOG_STYLE_PASSWORD, "Inregistrare", szQuery, "Inregistrare", "Exit" );
}
cache_delete( r );//Stergem rezultatul.
return 1;
}

public OnDialogResponse( playerid, dialogid, response, listitem, inputtext [ ] )
{
if( dialogid == R_DIALOG )
{
if( !response ) return Kick( playerid );//Daca playerul apasa pe exit va primi kick.
szQuery[ 0 ] = EOS;//Formatam string-ul.
if( strlen( inputtext ) < 6 )//Verificam daca parola are mai putin de 6 caractere.
{
format( szQuery, 128, "Salut %s, acest nume nu este inregistrat.\nTe rugam sa introduci parola.\nParola trebuie sa contina minim 6 caractere.", GetName( playerid ) );
ShowPlayerDialog( playerid, R_DIALOG, DIALOG_STYLE_PASSWORD, "Inregistrare", szQuery, "Inregistrare", "Exit" );
return 1;
}
new PasswordHash[ 129 ], pIP[ 20 ];//Stringul pentru parola
WP_Hash( PasswordHash, 129, inputtext );//Hash-uram parola.
GetPlayerIp( playerid, pIP, sizeof( pIP ) );
format( U_DATA[ playerid ][ IP ], 20, pIP );
mysql_format( Handle, szQuery, 256, "INSERT INTO `users` ( `Name`, `Password` ) VALUES ( '%e', '%e' )", GetName( playerid ), PasswordHash );//Scriem comanda pentru baza de date
mysql_tquery( Handle, szQuery, "", "" );//Trimitem comanda catre baza de date.
SendClientMessage( playerid, -1, "Te-ai inregistrat cu succes." );
return 1;
}

if( dialogid == L_DIALOG )
{
if( !response ) return Kick( playerid );//Daca playerul apasa pe exit va primi kick.
new PasswordHash[ 129 ];//Stringul pentru parola
WP_Hash( PasswordHash, sizeof( PasswordHash ), inputtext );//Hash-uram parola.
mysql_format( Handle, szQuery, 256, "SELECT * FROM `users` WHERE `Name` = '%e' AND `Password` = '%e' LIMIT 1;", GetName( playerid ), PasswordHash );//Scriem comanda de selectare
mysql_tquery( Handle, szQuery, "LoadPlayerData", "d", playerid );//Trimitem comanda catre baza de date.
return 1;
}
return 1;
}

forward LoadPlayerData( playerid );
public LoadPlayerData( playerid )
{
szQuery[ 0 ] = EOS;
if( !cache_get_row_count( Handle ) )//Verificam daca este un rand cu acel nume si acea parola in baza de date.
{
format( szQuery, 128, "Salut %s, acest nume este inregistrat.\nTe rugam sa introduci parola.", GetName( playerid ) );
ShowPlayerDialog( playerid, L_DIALOG, DIALOG_STYLE_PASSWORD, "Logare", szQuery, "Logare", "Exit" );
return 1;
}

U_DATA[ playerid ][ Health ] = cache_get_field_content_float( 0, "Health", Handle );//Extrag din baza de date viata. Viata este o variabila de tip Float, se extrage cu aceasta functie.
cache_get_field_content( 0, "IP", U_DATA[ playerid ][ IP ], Handle, 20 );//Extrag din baza de date ip-ul. IP-ul este un string iar string-urile se extrag cu aceasta functie.
U_DATA[ playerid ][ Money ] = cache_get_field_content_int( 0, "Money", Handle );//Extrag din baza de date viata. Viata este o variabila de tip integer, se extrage cu aceasta functie.
format( szQuery, 128, "Bine ai revenit %s. Iti uram distractie placuta.", GetName( playerid ) );
SendClientMessage( playerid, -1, szQuery );//Trimitem un mesaj de intampinare.
return 1;
}

stock GetName( playerid )
{
new rName[ MAX_PLAYER_NAME ];//Creez o variabila cu care voi stoca numele
GetPlayerName( playerid, rName, MAX_PLAYER_NAME );//Stochez numele
return rName;//Returnez numele.
}

Nota
- Acest tutorial a fost creat de către TheRoW.
- Nu reposta acest tutorial cu creditele schimbate.
- Ţine minte de ce are nevoie acest sistem pentru a merge bine.
- Cei care nu au habar să faca baza de date apasaţi aici.

Ghods

Mesaje : 1
Puncte : 3
Data de inscriere : 30/10/2014

Vezi profilul utilizatorului

Sus In jos

Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum