[GUIDA] MySQL Plugin per SA-MP
#41
Inviato il 05 maggio 2010 - 20:56
come faccio a separare i valori una volta presi dal db? potresti farmi un esempio? thx
[FS]_All3Xz_ Anti-Cheat 4
[FS]_All3Xz_ Anti-Cheat 7
[FS]_All3Xz_ Anti-Cheat 8
[GM] PVCM Training 0.? (MySQL)
[APP]_All3Xz_ NPC Generator
[GUIDA] Leggere da file usando dini
[GUIDA] Scripting GTA:IV - Callbacks
[GM] PVCM Training 1 (MySQL)
[GM] PVCM A/D
[GUIDA] Leggere da file usandi dini 2
#42
Inviato il 23 maggio 2010 - 08:28
_All3Xz_ ha detto:
come faccio a separare i valori una volta presi dal db? potresti farmi un esempio? thx
Scusa per il ritardo innanzi tutto.
Allora:
new valori[128], campo[64]; samp_mysql_query("SELECT * FROM utenti WHERE nome_utente="Kevin"); samp_mysq_store_result(); samp_mysql_fetch_row(valori); samp_mysql_get_field("nome_utente", campo); printf("Dal campo 'nome_utente' è stato prelevato il valore: %s", campo);La vediamo passo passo:
samp_mysql_query esegue le istruzioni nel DB.
samp_mysql_store_result() prepara il risultato della queury precedente
samp_mysql_fetch_row(string[]) dove string in questo momento è "valori". Usando questo comando nella stringa "valori" ci saranno le seguenti cose:
Nome Campi: nome|password|soldi Valori: "Kevin"|Uhj8a93|1595 <-- Sta roba è dentro valoriogni campo, o meglio il valore di ogni campo è separato da un '|' e sono dentro la stringa "valori".
Per prelevare il valore di un campo che ci serve dobbiamo utilizzare il comando
samp_mysql_get_field("nome_campo_interessato", stringa) dove nome campo è proprio il nome del campo e dove in stringa ci sarà un return del valore di quel campo.
Spero di essere stato chiaro.

Messaggio modificato da SKE92beyond il 23 maggio 2010 - 08:30
~ SKE92beyond ~
Jpk: se mmond è gay nonnsignifica che i sono gat+e se ziuo si fa
Jpk: jnon significa che io mi facci+
Giovanni94m: sisi
[/QUOTE]
#44
Inviato il 23 maggio 2010 - 10:45
.ReVo^ ha detto:
Tu chiedi io vedrò di esaudire

~ SKE92beyond ~
Jpk: se mmond è gay nonnsignifica che i sono gat+e se ziuo si fa
Jpk: jnon significa che io mi facci+
Giovanni94m: sisi
[/QUOTE]
#45
Inviato il 23 maggio 2010 - 10:53
[FS]_All3Xz_ Anti-Cheat 4
[FS]_All3Xz_ Anti-Cheat 7
[FS]_All3Xz_ Anti-Cheat 8
[GM] PVCM Training 0.? (MySQL)
[APP]_All3Xz_ NPC Generator
[GUIDA] Leggere da file usando dini
[GUIDA] Scripting GTA:IV - Callbacks
[GM] PVCM Training 1 (MySQL)
[GM] PVCM A/D
[GUIDA] Leggere da file usandi dini 2
#46
Inviato il 28 maggio 2010 - 17:39
ho trovato l'esempio su come salvare utente, password e money, ma non capisco quale sia l'elemento che sceglie la colonna di money, user o pass
new string[128],pName[MAX_PLAYER_NAME+1]; switch(resultid) { case LOGIN_THREAD_ID: { if(IsPlayerConnected(extraid)) { mysql_store_result(); if(mysql_num_rows() == 1) { PlayerMoney[extraid] = mysql_fetch_int(); GivePlayerMoney(extraid,PlayerMoney[extraid]); LoggedIn[extraid] = true; format(string,sizeof(string),">> Ti sei loggato con successo, tutti i valori sono stati ripristinati."); SendClientMessage(extraid,GREY,string); mysql_free_result(); } else { Wrongattempt[extraid] += 1; printf("Password errata (%s) (Totali: %d)",pName,Wrongattempt[extraid]); if(Wrongattempt[extraid] >= 3) { SendClientMessage(extraid,RED,">> Sei stato kickato. ( Hai inserito una password errata 3 volte )"); mysql_free_result(); return Kick(extraid); } mysql_free_result(); SendClientMessage(extraid,RED,">> Password errata."); ShowPlayerDialog(extraid,LOGIN_MESSAGE,DIALOG_STYLE_INPUT,"Login","Questo nick è registrato. Sei pregato di effettuare il login.","Login","Kick"); } } else { //to avoid "commands out of sync" errors mysql_store_result(); mysql_free_result(); } return 1; } [...]
ho capito che LOGIN_THREAD_ID serve a richiamare un qualcosa che distingue i valori, ma non ho chiaro il fatto su come scrivere in una determinata colonna di un user per poi richiamare il valore assegnato

#47
Inviato il 28 maggio 2010 - 18:01
PlayerMoney[extraid] = mysql_fetch_int();[COLOR=#000000][COLOR=#007700] [/COLOR][/COLOR]
Però non ti so dire esattamente, dove hai scaricato questo esempio?
~ SKE92beyond ~
Jpk: se mmond è gay nonnsignifica che i sono gat+e se ziuo si fa
Jpk: jnon significa che io mi facci+
Giovanni94m: sisi
[/QUOTE]
#48
Inviato il 28 maggio 2010 - 18:17
mysql_fetch_int();
cioè come fa ad essere proprio questo i soldi senza nessun parametro dentro?
http://forum.sa-mp.c...p?topic=79352.0
#49
Inviato il 28 maggio 2010 - 18:19
StanleY ha detto:
Immagino dipenda dal plugin com'è strutturato. Se gestisce certi dati internamente funziona.
~ SKE92beyond ~
Jpk: se mmond è gay nonnsignifica che i sono gat+e se ziuo si fa
Jpk: jnon significa che io mi facci+
Giovanni94m: sisi
[/QUOTE]
#50
Inviato il 28 maggio 2010 - 18:26
new query[200]; format(query,sizeof(query),"SELECT Money FROM `account` WHERE Username = '%s'",PName(playerid)); samp_mysql_query(query); samp_mysql_store_result(); if(samp_mysql_num_rows()==1) { }
come si fa a gettare il valore della pass decodficiata in md5 per poi confrontarla con quella inserita?
e come faccio a vedere quando qulacuno è già registrato per nn farlo registrare dinuovo?
Messaggio modificato da StanleY il 29 maggio 2010 - 16:47
#51
Inviato il 29 maggio 2010 - 17:53
StanleY ha detto:
new query[200]; format(query,sizeof(query),"SELECT Money FROM `account` WHERE Username = '%s'",PName(playerid)); samp_mysql_query(query); samp_mysql_store_result(); if(samp_mysql_num_rows()==1) { }come si fa a gettare il valore della pass decodficiata in md5 per poi confrontarla con quella inserita?
e come faccio a vedere quando qulacuno è già registrato per nn farlo registrare dinuovo?
Allora non c'è bisogno di decriptare la pass in md5 anche perchè non credo ci siano strumenti per farlo in sa-mp.
Tu hai la pass criptata in md5 nel tuo db. Quando il giocatore effettua il login prendi la password che inserisce, la cripti in md5, poi fai lo strcmp() con quella del DB.
Per verificare se un player è già registrato o no fai così:
format(string, sizeof(stringa),"SELECT * FROM account WHERE username='%s'", nome); samp_mysql_query(stringa); samp_mysql_store_result(); if(samp_mysql_fetch_row(resultline)) { // account esistente } else { //account NON registrato }
Per il "gettare" spiegati meglio pls.
~ SKE92beyond ~
Jpk: se mmond è gay nonnsignifica che i sono gat+e se ziuo si fa
Jpk: jnon significa che io mi facci+
Giovanni94m: sisi
[/QUOTE]
#52
Inviato il 29 maggio 2010 - 18:17
public OnPlayerConnect(playerid)
{
new query[200],resultline[256];
format(query,sizeof(query),"SELECT Money FROM `account` WHERE Username = '%s'",PName(playerid));
samp_mysql_query(query);
samp_mysql_store_result();
if(samp_mysql_fetch_row(resultline))
{
ShowPlayerDialog(playerid,REGISTER_DIALOG,DIALOG_STYLE_INPUT ,"Register","Non hai un account su questo server.nRegistrati inserendo una password.", "Register","Annulla");
}
else
{
ShowPlayerDialog(playerid,LOGIN_DIALOG,DIALOG_STYLE_INPUT,"Login","Inserisci la tua password","Login","Annulla");
}
print(resultline);
return 1;
}
per gettare dico ad esempio nel db nella tabella "account" nella colonna "Money" ho scritto 1000 sotto il nome di "Player" come faccio a dare al giocatore player i 1000?
Messaggio modificato da StanleY il 29 maggio 2010 - 19:26
#53
Inviato il 31 maggio 2010 - 11:40
if(samp_mysql_fetch_row(resultline)) { //account ESISTE } else { //account NON esiste }
E tu hai fatto esattamente l'opposto.
Guarda bene nell'esempio che avevo già fatto.
Inoltre la tua query è
SELECT Money FROM `account` WHERE Username = '%s'",PName(playerid));
ed invece è più corretta questa per controllare se un account esiste
SELECT * FROM `account` WHERE Username = '%s'",PName(playerid));
Poi per gettare i valori dei campi la procedura è la seguente come avevo già detto:
esegui la query qui sopra citata ad esempio, poi fai samp_mysql_store_result(), in seguito samp_mysql_fetch_row(string[]) dove string[] in questo caso è la nostra "resultline".
Ora in resultline ci saranno i valori dei campi presi dalla query nel seguente formato:
Nome|Password|1500|io@mail.com
Quindi per prendere un singolo valore usiamo samp_mysql_get_field("nome_campo", str[]) dove "nome_campo" è il campo interessato e str[] è dove verrà stazionato il valore.
Messaggio modificato da SKE92beyond il 31 maggio 2010 - 11:41
~ SKE92beyond ~
Jpk: se mmond è gay nonnsignifica che i sono gat+e se ziuo si fa
Jpk: jnon significa che io mi facci+
Giovanni94m: sisi
[/QUOTE]
#54
Inviato il 31 maggio 2010 - 15:05
public OnPlayerConnect(playerid) { new query[200],resultline[1024]; format(query,sizeof(query),"SELECT * FROM account WHERE Username ='%s'",PName(playerid)); samp_mysql_query(query); samp_mysql_store_result(); if(samp_mysql_fetch_row(resultline)) { ShowPlayerDialog(playerid,LOGIN_DIALOG,DIALOG_STYLE_INPUT,"Login","Inserisci la tua password","Login","Annulla"); } else { ShowPlayerDialog(playerid,REGISTER_DIALOG,DIALOG_STYLE_INPUT ,"Register","Non hai un account su questo server.\nRegistrati inserendo una password.", "Register","Annulla"); } print(resultline); return 1; } se //commento samp_mysql_fetch_row(resultline) non crasha se entro la prima volta da non registrato funge la registrazione, se poi entro per loggarmi crasha il server
Messaggio modificato da StanleY il 31 maggio 2010 - 15:06
#55
Inviato il 01 giugno 2010 - 13:49
~ SKE92beyond ~
Jpk: se mmond è gay nonnsignifica che i sono gat+e se ziuo si fa
Jpk: jnon significa che io mi facci+
Giovanni94m: sisi
[/QUOTE]
#56
Inviato il 01 giugno 2010 - 14:05
#57
Inviato il 01 giugno 2010 - 14:44
StanleY, il 01 June 2010 - 15:05 ha detto:
Giovanni ed Io siamo in "società" xD gli esempi che ti faccio io sono quelli che ti può fare lui.
Come ti ho detto controlla che le query siano giuste. Più che altro che i campi siano strutturati a dovere nel DB, sennò non crasherebbe con la fetch_row
~ SKE92beyond ~
Jpk: se mmond è gay nonnsignifica che i sono gat+e se ziuo si fa
Jpk: jnon significa che io mi facci+
Giovanni94m: sisi
[/QUOTE]
#58
Inviato il 01 giugno 2010 - 16:37
edit: dopo una lunga ricerca io e giovanni siamo venuti a capo della soluzione: avevo la versione 0.15 -.-----
edit2: ok ora per il login tu hai detto
Quote
e come la cripto in md5, cercando su internet ho trovato solo esempi in php dove la criptano direttamente esternamente con md5($password)...
potrei provare a creare un nuovo campo, far scrivere li la password appena inserita criptandola e poi confrontarla con quella originale, ma mi sembra un procedimento troppo lungo o no?
edit3: peppe mi ha detto che esisteva md5 in pawn infatti y_less ha fatto l'include http://damian313.goo...ges.com/md5.inc
tt risolto

Messaggio modificato da StanleY il 02 giugno 2010 - 09:24
#59
Inviato il 07 giugno 2010 - 18:32
ho fatto un sistema di login/register (senza include md5) e in pratica avvolte il codice si blocca prima della funzione LoginPlayer() o dentro la funzione proprio quando sta per mandare il messaggio login effettuato.
Avvolte basta che dopo un po di tempo ti riconnetti e tutto funziona normalmente, di solito risolvo cancellando l'account da pma ma è una seccatura... surce:
onplayerrequestcalss
if(!IsLoggedIn[playerid]) { new query[256],resultline[256]; format(query,sizeof(query),"SELECT * FROM account WHERE Username ='%s'",PName(playerid)); samp_mysql_query(query); samp_mysql_store_result(); if(samp_mysql_fetch_row(resultline)) { /*samp_mysql_get_field("Indirizzoip", PlayerIP[playerid]) ; if(!strcmp(PlayerIP[playerid],GetPlayerAddres(playerid),true) && Loginauto[playerid] && strlen(PlayerIP[playerid])) { new rps[100]; format(rps,100,"AUTO LOGIN: Indirizzo IP: [DB: %s/%s]",PlayerIP[playerid],GetPlayerAddres(playerid)); SendClientMessage(playerid,COLOR_GREY,rps); LoginPlayer(playerid); }else{*/ new str[150]; format(str,150,"Benvenuto %s\nInserisci la tua password",PlayerName[playerid]); ShowPlayerDialog(playerid,LOGIN_DIALOG,DIALOG_STYLE_INPUT,"Login",str,"Login","Annulla"); //} } else { ShowPlayerDialog(playerid,REGISTER_DIALOG,DIALOG_STYLE_INPUT ,"Register","Non hai un account su questo server.\nRegistrati inserendo una password.", "Register","Annulla"); } }
if(dialogid==LOGIN_DIALOG) { if(response) { new valori[128], query[128], escaped[51]; samp_mysql_real_escape_string(inputtext, escaped); format(query,128,"SELECT * FROM account WHERE Username='%s' AND Password=MD5('%s')",PName(playerid),escaped); samp_mysql_query(query); samp_mysql_store_result(); if(samp_mysql_fetch_row(valori)) { LoginPlayer(playerid); }else{ new msg[128]; PWErrata[playerid]+=1; format(msg,sizeof(msg),"Password errata [%d/3]",PWErrata[playerid]); ShowPlayerDialog(playerid,LOGIN_DIALOG,DIALOG_STYLE_INPUT,"Login",msg,"Login","Annulla"); if(PWErrata[playerid]==3) { SendClientMessage(playerid,COLOR_RED,"Hai sbagliato la password 3 volte."); format(msg,sizeof(msg),">> %s è stato kickato dal server per non aver effettuato correttamente il login",PName(playerid)); Kick(playerid); SendClientMessageToAll(COLOR_RED,msg); } } } }
forward LoginPlayer(playerid); public LoginPlayer(playerid) { new query[128],valori[256]; format(query,128,">> Login effettuato correttamente."); IsLoggedIn[playerid] = 1; SendClientMessage(playerid,0x00ff00aa,query); format(query,128,"SELECT * FROM account WHERE Username='%s'",PName(playerid)); samp_mysql_query(query); samp_mysql_store_result(); samp_mysql_fetch_row(valori); new tmpstr[256]; samp_mysql_get_field("Admin", tmpstr); AdminLevel[playerid]=strval(tmpstr); samp_mysql_get_field("Score",tmpstr); Score[playerid]=strval(tmpstr); samp_mysql_get_field("Entrata", tmpstr); Entrata[playerid]=strval(tmpstr); samp_mysql_get_field("Money", tmpstr); Money[playerid]=strval(tmpstr); samp_mysql_get_field("Skin", tmpstr); SetPlayerSkin(playerid,strval(tmpstr)); SetSpawnInfo(playerid,0,strval(tmpstr),-2421.1748,334.7039,35.4517,240.8429,0,0,0,0,0,0); samp_mysql_get_field("Morti", tmpstr); Death[playerid]=strval(tmpstr); samp_mysql_get_field("Uccisioni", tmpstr); Kill[playerid]=strval(tmpstr); samp_mysql_get_field("AutoRepair", tmpstr); AutoRepair[playerid]=strval(tmpstr); samp_mysql_get_field("SpeedBoost", tmpstr); SpeedBoost[playerid]=strval(tmpstr); samp_mysql_get_field("ASK", tmpstr); AntiSpawnKill[playerid]=strval(tmpstr); samp_mysql_get_field("Loginauto", tmpstr); Loginauto[playerid]=strval(tmpstr); samp_mysql_get_field("DefaultSpawn", tmpstr); DefaultSpawn[playerid]=strval(tmpstr); format(query,200,"UPDATE account SET Indirizzoip = '%s' WHERE Username = '%s'",GetPlayerAddres(playerid),PName(playerid)); samp_mysql_query(query); format(query,200,"UPDATE account SET ENTRATA = '%d' WHERE Username = '%s'",Entrata[playerid]+1,PName(playerid)); samp_mysql_query(query); new msg[200]; format(msg,200,"Ciao %s! Benvenuto nel server!",PlayerName[playerid]); SendClientMessage(playerid,COLOR_RED,"***********************************************************************************************************************************"); SendClientMessage(playerid,COLOR_WHITE,msg); if(AdminLevel[playerid]>0) { format(msg,200,"Ti sei loggato come admin di livello %d",AdminLevel[playerid]); SendClientMessage(playerid,COLOR_WHITE,msg); } format(msg,200,"Hai $%d, e sei di livello: %d, entrata n°: %d",Money[playerid],Score[playerid],Entrata[playerid]); SendClientMessage(playerid,COLOR_WHITE,msg); SendClientMessage(playerid,COLOR_WHITE,"Gamemode in fase di sviluppo, al termine verranno azzerati tutti i dati utenti."); SendClientMessage(playerid,COLOR_WHITE,"Accedi al tuo pannello di controllo account su WWW.TLK.GAMEHOSTING.IT inserendo i dati del server."); SendClientMessage(playerid,COLOR_WHITE," "); SendClientMessage(playerid,COLOR_RED,"***********************************************************************************************************************************"); print("fine"); return 1; }
un tizio sul forum di samp mi ha detto:
Quote
Connect tables via IDs rather by names, so you can change names however you want and it won't get messed up.
Then under OnPlayerRequestClass or something get account ID.
Citazione
SELECT acc_id FROM account WHERE Username='%s'
If you get any results account exists if no then it doesn't.
And then get data from account.
Codice:
SELECT * FROM account WHERE Username='%s' AND Password=MD5('%s')
If you get results password was right otherwise no.
And don't forget to escape password to prevent SQL injections. And next time ask in plugin's topic if you have issues with MySQL.
il fatto di nn usare l'include l'ho capito ma gli id no o.o
Edit: dopo un po di tempo finalmente ho imparato la sintassi sql e tutto il resto ora so usarlo anche su php, comunque con questo plugin mi dava problemi, come descritto sopra, ora uso quello di g-stylez, va tutto ok!
Messaggio modificato da StanleY il 11 settembre 2010 - 21:00