Jump to content

[Tutorial]Register/Login Mysql R40+


Daedric-Fox

Recommended Posts

Salutare tuturor, m-am gandit sa modific sistemul de register al lui @WiDuAlK astfel incat sa fie compatibil cu versiunea de MySQL r41-2(ultima),
deoarece vad ca apar fel de fel de tutoriale dar gresite sau inutile.

!!!Atentie acest tutorial este imbunatatit si structurat altfel, dar pleaca de la tutorialul lui WiDuAlK

Pasul 1:

//La inceputul gamemode-ului punem 
#include <a_mysql>
//Definim si o scurtatura care ne va ajuta:
#define Functie:%0(%1) forward%0(%1); public%0(%1)

Pasul 2:


//Definim "Manerul" care ne va ajuta sa facem conexiunea.
new MySQL: g_handle;
//Si inca o variabila ce ne va ajuta sa facem si mai util sistemul de conectare la baza de date:
new Connection = 0;//o initializam cu 0

Pasul 3:

//Vom creea 2 enumeratii.

enum//Aceasta enumeratie contine Dialog-urile.
{
	DIALOG_LOGIN,
	DIALOG_REGISTER
};

enum fData
{
	pSQLID,
	pPassword[65]
};
new FoxData[MAX_PLAYERS][fData];

Pasul 4:

//Acum vom creea conexiunea in sine:

Functie: ConnectToSQLServer()
{
	if(Connection == 0)
	{
        g_handle = mysql_connect("", "", "", "");
	}
  	else
    {
      	g_handle = mysql_connect("", "", "", "");
    }
	if(mysql_errno() != 0)
	{
		print("Could not connect to database!");
		SendRconCommand("exit");
	}else{print("Connection established!");}
	
}
//Astfel nu ne vom mai chinui sa schimbam toate datele de fiecare data, sichimbam doar variabila Connection din 0 in 1 si vice-versa.

 

Pasul 5:

//Punem la callback-ul OnGamemodeInit()
 	ConnectToSQLServer();//astefel se initializeaza conexiunea
 //Si la callback-ul OnGamemodeExit()
 	mysql_close(g_handle);//astfel se opreste conexiunea

 

Pasul 6:

//Folosim un stock ca sa facem mai usor Extragerea numelului.

stock GetName(playerid)
{
	new Name[MAX_PLAYER_NAME];
	GetPlayerName(playerid, Name, sizeof(Name));
	return Name;
}

 

Pasul 7:

//Acum avem nevoie de un callback, care va fi apelat in momentul in care player-ul intra pe server:

Functie: OnPlayerLogin(playerid)
{
    new rows
    cache_get_row_count(rows);
    if(rows)// atunci cand playerul se inregistreaza i se vor creea niste randuri. Daca i se gasesc atunci cand se va conecta ii va da:
    {
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Logheaza-te!", "Te rog sa-ti introduci parola contului mai jos!", "Logare", "Exit");// dialogul register
    }
    else// daca nu i se gasesc randurile, mai exact contul este inexistent, atunci i se va da urmatorul dialog
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Inregistrare", "Trebuie sa iti creezi un cont ca sa joci pe server.\nTasteaza mai jos o parola, pentru a te inregistra!", "Inregistreaza", "Exit");// dialogul register
    }
    return 1;
}

//La callback-ul OnPlayerConnect(playerid) vom adauga:

public OnPlayerConnect(playerid)
{
    new query[100];// definim query(interogarea)
    mysql_format(g_handle, query, sizeof(query), "SELECT * FROM `conturi` WHERE `Nume` = '%e'", GetName(playerid));// mysql format face interogarile/setarile/obtiunile/updateurile la baza de date
    //handle reprezinta conectarea la mysql, query si sizeof(queri) reprezinta interogarea
    //"SELECT * FROM `conturi` WHERE `Nume` = '%e'"- Selecteaza de la tabelul cu conturi, unde numele este %s(de exemplu eu am numele Widualk pe sa-mp. Mi se va extrage numele si
    mysql_pquery(handle, query, "OnPlayerLogin", "i", playerid);// se va interoga OnPlayerLogin. Adica mai pe scurt , cand se conecteaza se va verifica daca are cont sau nu acel player.
    return 1;
}

 

Pasul 8:

//Vom creea dialog-urile folosite pana acum la callback-ul OnDialogResponse

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    new query[128], ip[25];// se creaza interogarea si ip.
    switch(dialogid)// se va folosi switch pentru a selecta dialogul
    {
        case DIALOG_REGISTER:// daca se va selecta dialogul register
        {
            if(!response)
                    return Kick(playerid);// daca se va apasa pe butonul Exit ii va da kick
            if(response)// daca se apasa pe Butonul inregistrare se vor face urmatoarele verificari
            {
                if(!strlen(inputtext))// daca nu e scris nimic la parola
                        return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Parola incorecta!", "Introdu-ti o parola pentru a te inregistra pe server! n", "Inregistreaza", "Exit");// ii va da din nou dialogul register cu mesajul specific
                new Hashhhh[65];
                SHA256_PassHash(inputtext, "78sdjs86d2h", Hashhhh, sizeof(Hashhhh));
                GetPlayerIp(playerid, ip, sizeof(ip));// definim ip-ul de mai sus
                mysql_format(handle, query, sizeof(query), "INSERT INTO `conturi` (`Nume`, `Parola`, IP) VALUES ('%e', '%e', '%e')", GetName(playerid), Hashhhh, ip);// se insereaza in tabelul cu conturi numele playerului, parola pe care a scris-o si ip pe care il are
                mysql_pquery(handle, query, "", "");// se va trimite setarile si se va interoga callback-ul OnRegistration
                SpawnPlayer(playerid); // ii da spawn
            }
            return 1;
        }
        case DIALOG_LOGIN:// daca se va selecta dialogul de login
        {
            if(!response) return Kick(playerid);// si se va apasa pe butonul exit ii va da kick
            if(response)//daca se apasa pe butonul LOGARE se va face urmatoarele verificari
            {
                if(!strlen(inputtext))// daca nu a scris nimic la parola
                        return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Parola incorecta!", "Te rog sa iti introduci parola corecta, pentru a te loga pe server.", "Logare", "Exit");// ii va da dialogul cu login cu mesajul specific
                // daca se va trece peste aceasta verificare se vor face urmatoarele:
                new Hashhhh[65];
                SHA256_PassHash(inputtext, "78sdjs86d2h", Hashhhh, sizeof(Hashhhh));
                mysql_format(handle, query, sizeof(query), "SELECT * FROM `conturi` WHERE `Nume`='%e' AND `Parola` = '%e'", GetName(playerid),Hashhhh);// va fi selectata parola de la tabelul cu conturi
				mysql_pquery(handle, query, "OnLogin", "i", playerid);// se va face apel la baza si se va interoga CallBackUl OnLogin (Tquery = take query sau ia interogare in romana)
            }
            return 1;
        }
    }
    return 1;
}

 

Pasul 9:

//Acum vom creea callback-ul apelat de dialog-ul Login:

Functie: OnLogin(playerid)// facem publicul
{
    new rows;// definim randurile
    cache_get_row_count(rows);
    if(rows)// daca playerul are randuri(adica daca are cont creat, odata cu contul se creeaza randurile)
    {
        cache_get_value_name(0, "Parola", FoxData[playerid][pPassword]);// i se vaextrage parola si i se verifica daca coincide cu numele. Se foloseste new-ul temporar pentru extragerea parolei, ea retinandu-se temporar(pana cand se deconecteaza jucatorul)
        cache_get_value_name_int(0, "ID", FoxData[playerid][pSQLID]);// i se va extrage id-ul din baza de date
        SpawnPlayer(playerid);
    }
    else// altfel , daca parola este gresita
    {
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Parola incorecta!", "Te rog sa iti introduci parola corecta, pentru a te loga pe server.", "Logare", "Exit");// ii va da dialogul cu mesajul specific.
    }
    return 1;
}

 

Pasul 10:

Se va creea baza de date exact ca in imaginile din Tutorialul lui WidWalk

Tutorial Original @WiDuAlK: Aici

Documentatie MySql R40: Aici

Descarcare mysql R41-2: Aici

!!Atentie parolele vor fi criptate cu SHA256

 

 

 

 

 

**********************************

Servicii Scripting de calitate:

*********************************

Future Project: ExpertGame

*********************************

Link to comment
Share on other sites

  • 3 months later...
  • 9 months later...

Salut! Am o problema. Am facut totul de aici, dar cand incerc sa compilez, imi da (error 017: undefined symbol "handle"). Peste tot unde am folosit "handle" imi da eroarea asta, nu doar la linia asta specifica. Oare poti sa ma ajuti cumva? MS

Link to comment
Share on other sites

On 6/25/2018 at 10:30 PM, FDH_ said:

Salut! Am o problema. Am facut totul de aici, dar cand incerc sa compilez, imi da (error 017: undefined symbol "handle"). Peste tot unde am folosit "handle" imi da eroarea asta, nu doar la linia asta specifica. Oare poti sa ma ajuti cumva? MS

Daca inca nu ai rezolvat uite cum se rezolva: pui oriunde in cod urmatorul lucru:

#define g_handle handle

La mine a mers asa.

Link to comment
Share on other sites

Acum 15 minute, FDH_ a spus:

Am facut totul cum ai aratat, dar tot mi-a dat "Could not connect to database!". Ma poti ajuta?

Intrebarea e, ai introdus datele bazei de date corect sau ai lasat gol ca in tutorial? E o intrebare stupida dar e se cam intampla asta

Edit: MySQL r40+ are locul parolei si numele bazei de date inversate fata de r39- . 

Nici o problema FDH_

Edited by Banditul
Link to comment
Share on other sites

4 minutes ago, Banditul said:

Intrebarea e, ai introdus datele bazei de date corect sau ai lasat gol ca in tutorial? E o intrebare stupida dar e se cam intampla asta

Da, le-am introdus dar tot nu merge.

EDIT: Am incurcat locul de la parola de la mysql cu cea pentru baza de date. Am rezolvat, Ms.

Edited by FDH_
Link to comment
Share on other sites

@FDH_ Salut! Adauga la OnGameModeInit, mysql_log(ALL); si atunci cand accesezi samp-server ( aprinzi serverul ) se va crea un folder cu numele "logs" in acel folderul poti vedea ce erori ai in legatura cu mysql. Invata sa le citesti de acolo si sa cauti/rezolvi problema singur.

Vezi sa ai baza de date creata bine si sa ai wamp/xampp aprins.

Sfatul meu e sa te uiti pe wiki si sa incerci sa-ti procuri singur un system login/register pe mysql.

 

Edited by andy47
Link to comment
Share on other sites

  • 2 months later...
  • 3 months later...
  • 2 years later...

D:\dekstop\Gamemode By victor\gamemodes\moldova.pwn(124) : error 017: undefined symbol "handle"
D:\dekstop\Gamemode By victor\gamemodes\moldova.pwn(144) : error 017: undefined symbol "handle"
D:\dekstop\Gamemode By victor\gamemodes\moldova.pwn(145) : error 017: undefined symbol "handle"
D:\dekstop\Gamemode By victor\gamemodes\moldova.pwn(160) : error 017: undefined symbol "handle"
D:\dekstop\Gamemode By victor\gamemodes\moldova.pwn(161) : error 017: undefined symbol "handle"

Imi arata de ce

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.