Offline ažuriranje [MYSQL]

Započeo Slade, Avgust 12, 2018, 21:31:29 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.


Offline skidanje admin nivoa uz provjeru trenutnog

Naime ovo je način koji i sam koristim u svojoj skripti, i obzirom kada sam prelazio na mysql, previše sam se mučio oko osnova, pa i oko ovoga, ako ima netko ko počinje raditi u MySQL čuvanju, ovo će mu možda pomoći.

Selektovanje igrača.
Naime moramo prvo uzeti tog igrača, tj. selectovati ga.
mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT * FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", nick);
new Cache:rezultat = mysql_query(Database, DB_Query); //Spremanje cache-a

LIMIT 1 - označava da želimo samo 1 select iz table-a, Username je uglavnom unique dio kad je igrač u pitanju, ali ova opcija vam mnogo pomaže kada želite selektovati samo jednog igrača koji je povezan sa nečime čiju jednakost mogu imati mnogi (recimo više igrača može imati okruglo 1.000.000$ na banci)

Broj redova
Ovdje jednostavno uzimamo broj redova, u novu varijablu rows.
new rows;
cache_get_row_count(rows); //Provjera redova


Provjera broja redova
Jednostavno, provjerit ćemo dal se red selektovao, ako je rows veći od 0, jednostavno netko je selektovan, u ovom slučaju samo jedan račun može biti, ali može se takoÄ'er selektovati i viÅ¡e njih.
if (rows)

Uzimanje vrijednosti
Red je da uzmemo igraču trenutni admin i helper level.
if (rows) {  //Provjera ukoliko račun postoji
      new alevel, hlevel;
      cache_get_value_int(0, "ADMIN", alevel); //Uzimanje admin nivoa igraču
      cache_get_value_int(0, "HELPER", hlevel); //Uzimanje helper nivoa igraču
}


"ADMIN" i "HELPER" su imena koja su u mojoj bazi, ako ste vi svoje nazvali pGameMaster, pHelper, pSupporter, ili sasvim nebitno, unesite tu vrijednost. Napomena: "ADMIN" ne označava vrijednost iz PlayerInfo enuma, nego iz kolone iz MySQL baze.

Sada, možete tu komandu jednostavno iskoristiti kako hoćete, uz ovako nekakve primjere:
if (rows) { //Provjera ukoliko račun postoji
      new alevel, hlevel;
      cache_get_value_int(0, "ADMIN", alevel); //Uzimanje admin nivoa igraču
      cache_get_value_int(0, "HELPER", hlevel); //Uzimanje helper nivoa igraču
      if(alevel > pInfo[ playerid ][pAdmin]) return SendErrorMessage(playerid, "Ne mozes skinuti veci admin nivo."); //Provjera ako je igračev nivo manji od offline igračevog.
      if(alevel == 0 && hlevel == 0) return SendErrorMessage(playerid, "Igrac nema poziciju."); //Igrač nije ni helper ni admin
      mysql_format(Database, DB_Query, sizeof(DB_Query), "UPDATE `PLAYERS` set `ADMIN` = 0, `HELPER` = 0 WHERE `USERNAME` = '%s'", nick);
      mysql_pquery(Database, DB_Query); //Update igrača
      if(alevel > 0) AdminMessage(playerid, "Igracu %s ste offline oduzeli Admin nivo %d.", nick, alevel);
      else if(hlevel > 0) AdminMessage(playerid, "Igracu %s ste offline oduzeli Helper nivo %d.", nick, hlevel);
}


Obavezno! Na kraju svega moramo obrisati spremljeni cache, dakle na dnu komande, jednostavno brišemo gore spremljeni cache.
cache_delete(rezultat);

Kako to izgleda sve zajedno:

mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT * FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", nick);
new Cache:rezultat = mysql_query(Database, DB_Query); //Spremanje cache-a
new rows;
cache_get_row_count(rows); //Provjera redova
if (rows) { //Provjera ukoliko račun postoji
      new alevel, hlevel;
      cache_get_value_int(0, "ADMIN", alevel); //Uzimanje admin nivoa igraču
      cache_get_value_int(0, "HELPER", hlevel); //Uzimanje helper nivoa igraču
      if(alevel > pInfo[ playerid ][pAdmin]) return SendErrorMessage(playerid, "Ne mozes skinuti veci admin nivo."); //Provjera ako je igračev nivo manji od offline igračevog.
      if(alevel == 0 && hlevel == 0) return SendErrorMessage(playerid, "Igrac nema poziciju."); //Igrač nije ni helper ni admin
      mysql_format(Database, DB_Query, sizeof(DB_Query), "UPDATE `PLAYERS` set `ADMIN` = 0, `HELPER` = 0 WHERE `USERNAME` = '%s'", nick);
      mysql_pquery(Database, DB_Query); //Update igrača
      if(alevel > 0) AdminMessage(playerid, "Igracu %s ste offline oduzeli Admin nivo %d.", nick, alevel);
      else if(hlevel > 0) AdminMessage(playerid, "Igracu %s ste offline oduzeli Helper nivo %d.", nick, hlevel);
}
cache_delete(rezultat);


Napomena: Moj kod vam copy-paste neće raditi, jer koristi neke moje defineove iz moda poput AdminMessage, SendErrorMessage, DB_Query i slično, ali suština komande hoće, nemojte zaboraviti prilagoditi "ADMIN" i "HELPER" sa vašim kolonama, iz vaše MySQL baze.
Ako pronaÄ'ete ikakve greÅ¡ke, poÅ¡to sam pisao odvojeno od mog moda radi lakÅ¡eg prilagoÄ'avanja drugima, samo mi javite da ispravim.
Komanda bi trebala raditi ispravno sa ovim kodom, jer kod mene radi odličan posao.
Poslednja Izmena: Avgust 12, 2018, 21:33:39 POSLE PODNE od Slade

Svaka ti dala  ;D
[Springfield Owner][TDe Daddy][Pawno Master][Mapper]


Ok je ali nemoj nikada koristiti SELECT * ukoliko ti to stvarno nije potrebno.(A to ti je najćešče potrebno samo na loginu kada trebaš učitati sve podatke).Jer SELECT * selektira sve "kolone" a ti ovdje koristiš samo 3(admin,helper i username)

Umjesto ovoga:
mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT * FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", nick);
new Cache:rezultat = mysql_query(Database, DB_Query); //Spremanje cache-a


Bi trebalo biti ovo:

mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT USERNAME,HELPER,ADMIN FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", nick);
new Cache:rezultat = mysql_query(Database, DB_Query); //Spremanje cache-a

Super, konacno je neko krenuo i MySQL tutorijale, da imam više vremena objavio bih i ja neki..

"I choose to have faith, because without that, I have nothing."


Odlicno ;)
Svidja mi se sto neko pise mysql tutorijale :D

Mnogo imaš ti još da jedeš kačamak.
skrr
Moj tutorijali: Bazilion indent warninga
WORK? : Smart Project 1.2 , Leskovacki Detmec, Rodjendanski  server


Penzionisani balkanski samp kripter


Citat: Paul Castellano poslato Avgust 12, 2018, 23:37:28 POSLE PODNE
Ok je ali nemoj nikada koristiti SELECT * ukoliko ti to stvarno nije potrebno.(A to ti je najćešče potrebno samo na loginu kada trebaš učitati sve podatke).Jer SELECT * selektira sve "kolone" a ti ovdje koristiš samo 3(admin,helper i username)

Umjesto ovoga:
mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT * FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", nick);
new Cache:rezultat = mysql_query(Database, DB_Query); //Spremanje cache-a


Bi trebalo biti ovo:

mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT USERNAME,HELPER,ADMIN FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", nick);
new Cache:rezultat = mysql_query(Database, DB_Query); //Spremanje cache-a


Da, upravu si, bolje je selektovati ono što ćemo koristiti, iskoristio sam * (SVE), jer iskreno nisam znao što će ko selektovati, a nije mi palo na pamet da bih to mogao objasniti, hvala na ispravci.


Hvala svima :)

Nikada ne selektiraj sve sa * jer cak i ako imas kolone

id, name, email
SELECT *
&
SELECT id, name, email

Imaju razliku u brzini, cesto se primjeti na velikim tablicama ili na velikim joinima (znam iz iskustva)

Tako da dobra je praksa uvijek selektirati odredjene kolone

Ako vas zanima zasto je tu razlika, let me know, pa cu vam objasniti
Poslednja Izmena: Avgust 13, 2018, 13:36:34 POSLE PODNE od Ino42O
Software Developer

[pawn]
new rows;
cache_get_row_count(rows); //Provjera redova
if (rows) { //Provjera ukoliko račun postoji
[/pawn]

mozes uraditi sa simple stockom koji imas uradjen vec u mysql datoteci

[pawn]cache_num_rows
if(cache_num_rows() "znak(> < =  ...)" 0)
[/pawn]

Citat: Terzic poslato Avgust 13, 2018, 13:46:54 POSLE PODNE
[pawn]
new rows;
cache_get_row_count(rows); //Provjera redova
if (rows) { //Provjera ukoliko račun postoji
[/pawn]

mozes uraditi sa simple stockom koji imas uradjen vec u mysql datoteci

[pawn]cache_num_rows
if(cache_num_rows() "znak(> < =  ...)" 0)
[/pawn]

Isti djavo kada pogledas u kod
stock cache_num_rows()
{
new row_count;
cache_get_row_count(row_count);
return row_count;
}

Citat: .ксундер poslato Avgust 13, 2018, 13:56:35 POSLE PODNE
Isti djavo kada pogledas u kod
stock cache_num_rows()
{
new row_count;
cache_get_row_count(row_count);
return row_count;
}

O tome upravo i pricam, nema potrebe da pise opet isto dok ono stoji bzvz tamo