Jump to content
  • 0

Problema update baza de date


DFR

Question

Salut, am creat o functie prin care sa updatez in baza de date mysql profilul unui jucator dupa ce acesta sufera modificari (ex: bani, level, etc.).

Problema sta in felul urmator: daca imi dau mie bani,level, sau orice alt ceva si apeleaza functia de updatare, totul bine si frumos, dar daca eu ca admin fac acelasi lucru altui jucator, acestuia nu i se updateaza.

Codul pentru functia respectiva:

stock Database_Update(playerid,adminnume[])
{
    new query[255],Float:pos[4],nume[128];
    GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
    GetPlayerFacingAngle(playerid, pos[3]);
	GetPlayerName(playerid,nume,sizeof(nume));
	if(mysql_errno() == 0)
    {
        new rows,fields,string[255];
        mysql_format(mysql, string, sizeof(string), "SELECT * FROM `accounts` WHERE `Name` = '%s'", nume);
        mysql_query(mysql, string);
		cache_get_data(rows,fields);
		Player[playerid][ID] = cache_get_field_content_int(0, "ID");
		new testare[255];
		format(testare,sizeof(testare),"Jucatorul %s[%d] cu ID = %d a primit de la Adminul %s",nume,playerid,Player[playerid][ID],adminnume);
		SendClientMessage(playerid, -1, testare);
	    mysql_format(mysql, query, sizeof(query), "UPDATE `accounts` SET `Admin`= %d, `VIP`= %d, `Level`= %d, `RP`= %d, `Money` = %d, `PosX` = %f, `PosY` = %f, `PosZ` = %f, `PosA` = %f WHERE `ID` = '%d' ",
		Player[playerid][Admin],
		Player[playerid][VIP],
		Player[playerid][Level],
		Player[playerid][RP],
		Player[playerid][Money],
		pos[0], pos[1], pos[2], pos[3],
		Player[playerid][ID]);
    	mysql_tquery(mysql,query);
   	 	SendClientMessage(playerid, -1, "A fost updatata baza de date");
    }
    else
    {
		SendClientMessage(playerid,-1 ,"Conectarea la baza de date nu a reusit");
		return 1;
    }
  //  new mesaj[255];
	/*format(mesaj, sizeof(mesaj), "%s : Admin = %i , VIP = %i, Level = %i, RP = %i, Money = %i, PosX = %f, PosY = %f, PosZ = %f, PosA = %f", nume, Player[playerid][Admin], Player[playerid][VIP], Player[playerid][Level], Player[playerid][RP], Player[playerid][Money], pos[0], pos[1], pos[2], pos[3]);
    SendClientMessage(playerid, -1, mesaj);*/
	return 1;
}

cand apelez functia arata asa:

Database_Update(numeid, numeadmin);

numeid si numeadmin sunt corecte, deoarece am pus o afisare in acea functie si afiseaza ce trebuie (numeid e id-ul din joc de pe TAB al jucatorului caruia i se atribuie modificari, iar numeadmin e un string cu numele adminului ce a facut modificarea - asta e doar de forma)

Folosesc MYSQL-R39-4 pentru windows.

Acelei variabile mysql de apare la mysql_tquery si mysql_format i-am dat valoare in OnGameModeInit.

mysql = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD);

 

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0
mysql_format(mysql, string, sizeof(string), "SELECT * FROM accounts WHERE Name = '%s'", adminnume);
//aici este greseala, tu foloseai numele de la playerid (adica tu) decat cel folosit in funtia respectiva.
//Nu inteleg de ce este nevoie sa preiei id contului din baza de date in aceasta functie.
//Cand ai putea sa-l preiei in momentul caand jucatorul se logheaza si se incarca datele din baza.
// O alta chestie nu mai folosi '' decat atunci cand folosesti %s sau vrei sa scrii un cuvant anume care sa fie intr-odus intr-un tabel.
Exemplu: INSERT INTO accounts (Nume) VALUES ('Jamal');
mysql_format(mysql, string, sizeof(string), "SELECT * FROM accounts WHERE Name = '%s'", adminnume);
//aici este greseala, tu foloseai numele de la playerid (adica tu) decat cel folosit in funtia respectiva.
//Nu inteleg de ce este nevoie sa preiei id contului din baza de date in aceasta functie.
//Cand ai putea sa-l preiei in momentul caand jucatorul se logheaza si se incarca datele din baza.
// O alta chestie nu mai folosi '' decat atunci cand folosesti %s sau vrei sa scrii un cuvant anume care sa fie intr-odus intr-un tabel.
Exemplu: INSERT INTO accounts (Nume) VALUES ('Jamal');

Cea mai sigura sursa de facut bani de buzunar in mediul virtual. Inregistreaza-te si pune-te pe treaba !!!

http://www.viespar.ro/?reff=ab8e9d8086304d6136eac03c710238d7

Link to comment
Share on other sites

  • 0

Legat de partea cu preluatul ID-ului aveai dreptate, e inutila. 

Legat de greseala, nu era aia greseala, eu acel select il faceam ca sa extrag ID-ul pentru cel caruia ii schimbam anumite lucruri. Greseala era una din neatentia mea, cand am creat niste comenzi, nu am inlocuit playerid cu id-ul celui care trebuia, astfel mereu il lua pe cel care foloseste comanda. Am rezolvat, acum merge.

Puteti inchide topicul.

Link to comment
Share on other sites

  • 0

Cum sa spui ca acolo unde am zis eu ca e problema nu era, cu ce argumente vii ? Acolo era sigur o problema entru ca faceai interograe in baza de date doar pe numele tau si e clar problema pe care o aveai. Prin acea interogarea tu extrageai doar id-ul contului tau in variabila respectiva dupa care facea update dupa id extras. Nu inteleg cum poti zice ca eu am gresit cand tu habar nu ai ? Foarte frumos comportament, tine-o tot asa nici macar un multumesc nu ai spus ce sa mai zic de reputatie ... In fine a fost ultima data cand primesti ajutor din partea mea, consider ca astfel de persoane nu merita, bafta !

Edited by Jamal Alin

Cea mai sigura sursa de facut bani de buzunar in mediul virtual. Inregistreaza-te si pune-te pe treaba !!!

http://www.viespar.ro/?reff=ab8e9d8086304d6136eac03c710238d7

Link to comment
Share on other sites

  • 0

Nu iti inteleg motivul de suparare, nu am dat intregul cod si atata timp cat i-am gasit rezolvarea, nu vad motiv de oftica. 

Ti-am raspuns ca treaba cu ID-ul chiar era inutila si ca am sters-o, de ce tot insisti pe ea ? Iar la partea de parametrii pentru functie nu influenta cu nimic acel playerid deoarece se transmite prin referinta si apeleaza exact variabila data prin parametru. Imi pare rau ca tu cauti un "multumesc" fortat si nu poti sa accepti faptul ca nu era aceea problema, ba chiar nu afecta negativ cu nimic functia respectiva. Ca sa iti arat mai clar care era problema iti voi da unu din exemplele gresite:

Inainte aveam Player[playerid][Money] , iar dupa modificare am Player[numeid][Money] , unde numeid reprezinta id-ul(id-ul din joc nu cel din baza de date) celui ce i-au fost efectuate modificari, asta era toata problema, deoarece avand playerid lua in calcul doar persoana ce utilizeaza comanda, pe cand numeid poate sa ia si persoana respectiva in cazul in care isi da singura bani,level,etc. sau o alta persoana. Am sa iti arat si cum am simplificat noua functie ca sa vezi ca nu am modificari la continut, doar am eliminat. Acest Player[numeid][Money] se afla inafara functiei ca sa fie clar.

stock Database_Update(idjucator,adminnume[])
{
    new query[255],Float:pos[4],nume[128];
    GetPlayerPos(idjucator, pos[0], pos[1], pos[2]);
    GetPlayerFacingAngle(idjucator, pos[3]);
	GetPlayerName(idjucator,nume,sizeof(nume));
	if(mysql_errno() == 0)
    {
	    mysql_format(mysql, query, sizeof(query), "UPDATE `accounts` SET `Admin`= %d, `VIP`= %d, `Level`= %d, `RP`= %d, `Money` = %d, `PosX` = %f, `PosY` = %f, `PosZ` = %f, `PosA` = %f WHERE `ID` = %d ",
		Player[idjucator][Admin],
		Player[idjucator][VIP],
		Player[idjucator][Level],
		Player[idjucator][RP],
		Player[idjucator][Money],
		pos[0], pos[1], pos[2], pos[3],
		Player[idjucator][ID]);
    	mysql_query(mysql,query);
   	 	// SendClientMessage(idjucator, -1, "A fost updatata baza de date");
    }
    else
    {
		SendClientMessage(idjucator,-1 ,"Conectarea la baza de date nu a reusit");
		return 1;
    }
    /*new mesaj[255];
	format(mesaj, sizeof(mesaj), "%s : Admin = %i , VIP = %i, Level = %i, RP = %i, Money = %i, PosX = %f, PosY = %f, PosZ = %f, PosA = %f", nume, Player[idjucator][Admin], Player[idjucator][VIP], Player[idjucator][Level], Player[idjucator][RP], Player[idjucator][Money], pos[0], pos[1], pos[2], pos[3]);
    SendClientMessage(GetPlayerIdFromName(adminnume), -1, mesaj);
    SendClientMessage(idjucator, -1, mesaj);*/
	return 1;
}

Totusi, ti-am vorbit pe un ton neutru, nu te-am tratat sub nici un fel fara respect, dar pe viitor evita asemenea injurii aduse asupra cuiva, daca stii ca nu sunt adevarate. Nu te cunosc si nu am de ce sa intru in polemica cu tine.

 

Edited by Stalker1
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • 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.