Use mysql for register/load
#21

Sorry i don't understand what did you mean, can u write an example? saving the string and a number, maybe i can learn it
https://pastebin.com/3fwFqprQ
Quote:
Originally Posted by Jeffry
View Post
Yes.
With the code like I wrote it, you have to leave the server for the E-Mail to be saved.
Or call
Code:
SaveUserStats(playerid);
after the format in DIALOG_REGISTER_EMAIL.
Reply
#22

You do the saving in SaveUserStats, by using the MySQL UPDATE Query. %d is for numbers, %s is for strings.

You messed up the code a little bit, it will not work like this anymore.
Do the following:
Add to the enum:
Code:
pPassTmp[128],
OnPlayerConnect:
Code:
format(PlayerInfo[playerid][pPassTmp], 128, "");
And the two Dialogs to:
Code:
if(dialogid == DIALOG_REGISTER)
{
	//Se il giocatore seleziona Annulla/Esci
	if(!response) return Kick(playerid);

	//In tal caso l'utente inserisci una password troppo breve o non inserisce niente ritorna sullo stesso dialogo
	if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrazione", "{FF0000}ERRORE:\n{000000}Hai inserito una password troppo corta\n{00FF00}Consiglio: Usa almeno 3 caratteri ed una password sicura!", "Continua", "Annulla");
	//Se va tutto bene inizierа a creare il giocatore nel database
	//MD5 и il protocollo di criptografia per la password (puoi anche rimuoverlo dalla stringa lasciandolo: ('%e', '%e')
	new infopass[145];
	format(infopass, sizeof(infopass), "{f8ff33}[INFO:]{00FF00} La tua password sarа: %s - puoi cambiarla con /cambiapassword", inputtext);
	SendClientMessage(playerid, 0xFFFFFF, infopass);
	format(PlayerInfo[playerid][pPassTmp], 128, inputtext);
	//Dopo di chи la query viene inviata e passa al dialogo successivo
	// email
	ShowPlayerDialog(playerid, DIALOG_REGISTER_EMAIL, DIALOG_STYLE_INPUT, "Registrazione", "{00FF00}Non manca molto:\n{000000}Inserisci una email per continuare\n{00FF00}INFO: Serve per proteggere il tuo account!", "Continua", "Annulla");
	return 1;
}

if(dialogid == DIALOG_REGISTER_EMAIL)
{
   
	//Se il giocatore seleziona Annulla/Esci
	if(!response) return Kick(playerid);
	//In tal caso l'utente inserisci una password troppo breve o non inserisce niente ritorna sullo stesso dialogo
	if(strlen(inputtext) < 5) return ShowPlayerDialog(playerid, DIALOG_REGISTER_EMAIL, DIALOG_STYLE_PASSWORD, "Registrazione", "{FF0000}ERRORE:\n{000000}Devi inserire una mail valide\n{00FF00}INFO: Servirа per proteggere meglio il tuo account!", "Continua", "Annulla");
	format(PlayerInfo[playerid][pEmail], 64, inputtext);
	//Dopo di chи la query viene inviata e passa al dialogo successivo
	// etа
	new query[256];
	mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password, email) VALUES ('%e', MD5('%e'), '%e')", PlayerInfo[playerid][pName], PlayerInfo[playerid][pPassTmp], inputtext);
	mysql_pquery(handle, query, "OnUserRegister", "d", playerid);
	format(PlayerInfo[playerid][pPassTmp], 128, "");
	return 1;
}
Then it should work like you want it.
Reply
#23

Yeah work, but for insert an int how is the code?
(sorry im learning with mysql, I never scripted with that)

Quote:
Originally Posted by Jeffry
View Post
You do the saving in SaveUserStats, by using the MySQL UPDATE Query. %d is for numbers, %s is for strings.

You messed up the code a little bit, it will not work like this anymore.
Do the following:
Add to the enum:
Code:
pPassTmp[128],
OnPlayerConnect:
Code:
format(PlayerInfo[playerid][pPassTmp], 128, "");
And the two Dialogs to:
Code:
if(dialogid == DIALOG_REGISTER)
{
	//Se il giocatore seleziona Annulla/Esci
	if(!response) return Kick(playerid);

	//In tal caso l'utente inserisci una password troppo breve o non inserisce niente ritorna sullo stesso dialogo
	if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrazione", "{FF0000}ERRORE:\n{000000}Hai inserito una password troppo corta\n{00FF00}Consiglio: Usa almeno 3 caratteri ed una password sicura!", "Continua", "Annulla");
	//Se va tutto bene inizierа a creare il giocatore nel database
	//MD5 и il protocollo di criptografia per la password (puoi anche rimuoverlo dalla stringa lasciandolo: ('%e', '%e')
	new infopass[145];
	format(infopass, sizeof(infopass), "{f8ff33}[INFO:]{00FF00} La tua password sarа: %s - puoi cambiarla con /cambiapassword", inputtext);
	SendClientMessage(playerid, 0xFFFFFF, infopass);
	format(PlayerInfo[playerid][pPassTmp], 128, inputtext);
	//Dopo di chи la query viene inviata e passa al dialogo successivo
	// email
	ShowPlayerDialog(playerid, DIALOG_REGISTER_EMAIL, DIALOG_STYLE_INPUT, "Registrazione", "{00FF00}Non manca molto:\n{000000}Inserisci una email per continuare\n{00FF00}INFO: Serve per proteggere il tuo account!", "Continua", "Annulla");
	return 1;
}

if(dialogid == DIALOG_REGISTER_EMAIL)
{
   
	//Se il giocatore seleziona Annulla/Esci
	if(!response) return Kick(playerid);
	//In tal caso l'utente inserisci una password troppo breve o non inserisce niente ritorna sullo stesso dialogo
	if(strlen(inputtext) < 5) return ShowPlayerDialog(playerid, DIALOG_REGISTER_EMAIL, DIALOG_STYLE_PASSWORD, "Registrazione", "{FF0000}ERRORE:\n{000000}Devi inserire una mail valide\n{00FF00}INFO: Servirа per proteggere meglio il tuo account!", "Continua", "Annulla");
	format(PlayerInfo[playerid][pEmail], 64, inputtext);
	//Dopo di chи la query viene inviata e passa al dialogo successivo
	// etа
	new query[256];
	mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password, email) VALUES ('%e', MD5('%e'), '%e')", PlayerInfo[playerid][pName], PlayerInfo[playerid][pPassTmp], inputtext);
	mysql_pquery(handle, query, "OnUserRegister", "d", playerid);
	format(PlayerInfo[playerid][pPassTmp], 128, "");
	return 1;
}
Then it should work like you want it.
Reply
#24

You can search for "kills" and clone everything in the same way. Kills is an Integer amount, by following the way it is coded, you can add any other Integer too.

No need to say sorry, we all were learning it before
Reply
#25

Ok, i don't know but i tryied, don't save the integer amount, but better of nothing
Look

Quote:
Originally Posted by Jeffry
View Post
You can search for "kills" and clone everything in the same way. Kills is an Integer amount, by following the way it is coded, you can add any other Integer too.

No need to say sorry, we all were learning it before
Reply
#26

La stock SaveUserStats non va fatta cosi. Non c'и bisogno di fare un new per ogni statistica da salvare.

Puoi prendere le info direttamente dall'enum che hai creato e salvarle direttamente nel db.

E per salvare i soldi usa GetPlayerMoney, quando logga invece usa GivePlayerMoney:

pawn Code:
stock SaveUserStats(playerid)
{
    //Se non ha effettuato l'accesso il giocatore, non salva le statistiche
    if(!PlayerInfo[playerid][pLoggedIn]) return 0;

    //Se ha giа effettuato l'accesso salva le statistiche

    new query[256];
    mysql_format(handle, query, sizeof(query),
        "UPDATE users SET age = '%d', email = '%s', level = '%d', money = '%d', kills = '%d', deaths = '%d' WHERE id = '%d'",
        PlayerInfo[playerid][pAge], PlayerInfo[playerid][pEmail], PlayerInfo[playerid][pLevel], GetPlayerMoney(playerid), PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id);


    //Query inviata
    mysql_pquery(handle, query);
    return 1;
}
E usa le threaded queries invece delle pqueries.

E per il check prima di salvare le stats (quello in cui vedi che un player и loggato o meno, ci va il return 0 per bloccare l'esecuzione, non 1.
Reply
#27

So che non ci vuole ogni volta un new, l'ho messo per tenere piщ pulito il file, ed evitare che se inserisco playerinfo esca una stringa lunghissima, quello che sto cercando di fare и di salvare un int un numero, sai quando in un server rp ti dice di mettere l'etа

Quote:
Originally Posted by SymonClash
View Post
La stock SaveUserStats non va fatta cosi. Non c'и bisogno di fare un new per ogni statistica da salvare.

Puoi prendere le info direttamente dall'enum che hai creato e salvarle direttamente nel db.

E per salvare i soldi usa GetPlayerMoney, quando logga invece usa GivePlayerMoney:

pawn Code:
stock SaveUserStats(playerid)
{
    //Se non ha effettuato l'accesso il giocatore, non salva le statistiche
    if(!PlayerInfo[playerid][pLoggedIn]) return 0;

    //Se ha giа effettuato l'accesso salva le statistiche

    new query[256];
    mysql_format(handle, query, sizeof(query),
        "UPDATE users SET age = '%d', email = '%s', level = '%d', money = '%d', kills = '%d', deaths = '%d' WHERE id = '%d'",
        PlayerInfo[playerid][pAge], PlayerInfo[playerid][pEmail], PlayerInfo[playerid][pLevel], GetPlayerMoney(playerid), PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][p_id);


    //Query inviata
    mysql_pquery(handle, query);
    return 1;
}
E usa le threaded queries invece delle pqueries.

E per il check prima di salvare le stats (quello in cui vedi che un player и loggato o meno, ci va il return 0 per bloccare l'esecuzione, non 1.
Reply
#28

Quote:
Originally Posted by OuDayas
View Post
So che non ci vuole ogni volta un new, l'ho messo per tenere piщ pulito il file, ed evitare che se inserisco playerinfo esca una stringa lunghissima, quello che sto cercando di fare и di salvare un int un numero, sai quando in un server rp ti dice di mettere l'etа
Per evitare di far uscire una stringa lunghssima, nel caso tu abbia molte cose da salvare, puoi fare cosi:

pawn Code:
stock SalvaStats(playerid)
{
    new query[500], p = playerid;
    mysql_format(g_SQL, query,sizeof(query), "UPDATE `players` SET `LastLogin` = '%e', `Kills` = %d, `Deaths` = %d, `Score` = %i, `Money` = %i, `AccountLevel` = %d, `WantedLevel` = %d, `PlayerGender` = %d WHERE `ID`= %d",
    ReturnDate(), Player[p][Kills], Player[p][Deaths], GetPlayerScore(p), GetPlayerMoney(p), Player[p][AccountLevel], GetPlayerWantedLevel(p) ,Player[p][PlayerGender], Player[p][ID]);
    mysql_query(g_SQL, query);

    format(query,sizeof(query),"UPDATE `players` SET `PlayingHours` = %d, `PlayingMinutes` = %d, `FirstSpawn` = %d, `Job` = %d, `Bank` = %d, `NoPm` = %d WHERE `ID`= %d",
    Player[p][PlayingHours], Player[p][PlayingMinutes], Player[p][FirstSpawn], Player[p][Job], Player[p][Bank], Player[p][NoPm], Player[p][ID]);
    mysql_query(g_SQL, query);
    return 1;
}
Ti ho preso come esempio un mio vecchio script.
Reply
#29

Ok, invece per salvare un numero in fase di registrazione? Cioи tu una volta inserito la password ecc, devi mettere in questo caso l'etа in numeri quindi deve salvarla nel db qual'и il codice giusto?

Quote:
Originally Posted by SymonClash
View Post
Per evitare di far uscire una stringa lunghssima, nel caso tu abbia molte cose da salvare, puoi fare cosi:

pawn Code:
stock SalvaStats(playerid)
{
    new query[500], p = playerid;
    mysql_format(g_SQL, query,sizeof(query), "UPDATE `players` SET `LastLogin` = '%e', `Kills` = %d, `Deaths` = %d, `Score` = %i, `Money` = %i, `AccountLevel` = %d, `WantedLevel` = %d, `PlayerGender` = %d WHERE `ID`= %d",
    ReturnDate(), Player[p][Kills], Player[p][Deaths], GetPlayerScore(p), GetPlayerMoney(p), Player[p][AccountLevel], GetPlayerWantedLevel(p) ,Player[p][PlayerGender], Player[p][ID]);
    mysql_query(g_SQL, query);

    format(query,sizeof(query),"UPDATE `players` SET `PlayingHours` = %d, `PlayingMinutes` = %d, `FirstSpawn` = %d, `Job` = %d, `Bank` = %d, `NoPm` = %d WHERE `ID`= %d",
    Player[p][PlayingHours], Player[p][PlayingMinutes], Player[p][FirstSpawn], Player[p][Job], Player[p][Bank], Player[p][NoPm], Player[p][ID]);
    mysql_query(g_SQL, query);
    return 1;
}
Ti ho preso come esempio un mio vecchio script.
Reply
#30

E' la stessa cosa. Usa %d per i numeri e %s per le stringhe. Nella stock che hai postato tu giа salvi l'etа.
Reply
#31

Si ma solo che quando la salva non salva i numeri che inserisco, ma li codifica, tipo se scrivo 10 mi salva 49, e quando provo a fare il login mi da password errata, salva in md5 ogni stringa nello stesso modo quindi non si puт effettuare il login, non ho fatto chissа che modifica nel codice, ma perchй fa sta cosa?
dov'и che ho sbagliato? https://pastebin.com/TkpXMKb6

Quote:
Originally Posted by SymonClash
View Post
E' la stessa cosa. Usa %d per i numeri e %s per le stringhe. Nella stock che hai postato tu giа salvi l'etа.
Reply
#32

Ti consiglio di usare l'ultima versione di MySQL (R41-4), se non lo hai gia' fatto.

E per il sistema login/registrazione, prendi questo:

https://github.com/pBlueG/SA-MP-MySQ...stem-cache.pwn

Lo ha scritto direttamente l'autore del plugin MySQL, lo uso anch'io ed и perfetto. Inoltre le password sono hashate 2 volte, in salt e in SHA-256.
Reply
#33

Sorry.
Reply
#34

Quote:
Originally Posted by SymonClash
View Post
Sorry.
What is the righ code for saving a number as string?

---------------
Sono riuscito ad imposta che salva il numero quando arriva al dialog dell'etа, non salva la stringa come la scrivi ma la codifica, (se inserisci "22" salva la stringa nel db "2") come devo sistema sta cosa?
https://pastebin.com/ftxNscqB
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)