Jump to content
  • 0

Problema register


Punct.

Question

Problema intalnita (descriere): Cand intra cineva pe server nu se creeaza contul in baza de date.
Ero(area / rile) / warning-(ul / urile): -
Liniile de cod / sursa / script-ul(obligatoriu)http://pastebin.com/nwcwGmzA

Imagini / Video (optional): https://youtu.be/yYADs4VcwGE
Ati incercat sa rezolvati singur? Normal :|

Edited by Punct.

Nu mai deschideti in pu*a mea servere de SA:MP !

Jucati-va pe cele care sunt !   Sunt suficiente !

Reguli de bun simt:

1. Nu faceti reclama unde nu trebuie !

2. Nu injurati ca la usa cortului !

3. Daca esti analfabeti, taci din gura !

4. Nu abuza de 'scuze', 'din greseala' !

 

My work ::: http://pastebin.com/VRNRcaAs

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

 

mysql_format(mysql, query, sizeof(query), "SELECT * FROM `_players` WHERE `Username` = '%e'", Name[playerid]);
mysql_tquery(mysql, query, "OnAccountLoad", "i", playerid);

Ai introdus asta in publicul OnPlayerConnect?

 

Am, dar OnAccountCheck. Am incercat sa schimb in OnAccountLoad, dar tot nu merge.

 

 

foloseste

cache_get_field_content_int

in loc de

cache_get_row_int

Daca modific, trebuie sa schimb si parametri? 

Am de exemplu cache_get_row_int(0, 0); Trebuie pus cache_get_field_content_int(0, "ID");? trebuie pus numele coloanei

 

Edit: Apare si o eroare in mysql_log.html: 

CMySQLQuery::Execute[()] ERROR (error #1062) Duplicate entry '0' for key 'ID'

Edit: Am rezolvat. Am adaugat, ca atunci cand iti creeaza contul, sa-ti dea si un ID la cont, in functie de numarul de linii din tabela _players:

format(query, sizeof(query), "SELECT * FROM `_players` WHERE 1 = 1");
mysql_query(mysql, query);
PlayerInfo[playerid][pID] = cache_get_row_count() + 1;
if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, D_Register, DIALOG_STYLE_INPUT, "Register", "Parola trebuie sa contina cel putin 3 caractere.", "Register", "Kick");
mysql_format(mysql, query, sizeof(query), "INSERT INTO `_players`(`ID`, `Username`, `Password`, `IP`) VALUES ('%d', '%e', '%s', '%s')", PlayerInfo[playerid][pID], Name[playerid], inputtext, IP[playerid]);
mysql_query(mysql, query);
Edited by Punct.

Nu mai deschideti in pu*a mea servere de SA:MP !

Jucati-va pe cele care sunt !   Sunt suficiente !

Reguli de bun simt:

1. Nu faceti reclama unde nu trebuie !

2. Nu injurati ca la usa cortului !

3. Daca esti analfabeti, taci din gura !

4. Nu abuza de 'scuze', 'din greseala' !

 

My work ::: http://pastebin.com/VRNRcaAs

Link to comment
Share on other sites

  • 0
  • 0
mysql_format(mysql, query, sizeof(query), "SELECT * FROM `_players` WHERE `Username` = '%e'", Name[playerid]);
mysql_tquery(mysql, query, "OnAccountLoad", "i", playerid);

Ai introdus asta in publicul OnPlayerConnect?

242086.png

Link to comment
Share on other sites

  • 0

Vreau sa incep prin a-ti spune ca acel query este FOARTE INEFICIENT:

SELECT * FROM `_players` WHERE 1 = 1

o varianta mult mai buna al acestuia pentru scopul tau este:

SELECT COUNT( * ) FROM `_players`

Acest nou query va avea un singur rand cu o singura coloana (ci nu toate randurile si coloanele din tabel, ca la primul query) care va contine exact numarul de conturi din tabelul respectiv.

 

DAR

 

Iti atrag atentia ca este extrem de prost sa ii atribui ID-ul asa, deoarece un cont poate disparea de acolo prin diferite mijloace (de exemplu scoti tu manual un cont) si va scadea numarul de jucatori inregistrati, deci mai multi jucatori vor putea avea acelasi ID. Poti pur si simplu sa creezi coloana ID ca fiind primară (PRIMARY KEY) si sa foloseasca AUTO INCREMENT. Si in query va trebui doar sa inserezi contul jucatorului asa:

mysql_format(mysql, query, sizeof(query), "INSERT INTO `_players`(`ID`, `Username`, `Password`, `IP`) VALUES (0, '%e', '%s', '%s')", PlayerInfo[playerid][pID], Name[playerid], inputtext, IP[playerid]);
mysql_query(mysql, query);
Deoarece inserezi coloana ID ca fiind 0, MySQL va atribui automat un ID care este mai mare cu 1 fata de cel de la ultima linie introdusa in tabel. Daca ultimul ID este 15 (presupunand ca toate conturile pana acolo sunt la locul lor) si il stergi, un nou player nu va mai avea ID 15, ci direct 16, cum este corect.

 

Pentru a "afla" ce ID i-a atribuit tabelul, poti folosi cache_insert_id, cam in acelasi mod in care ai folosit si tu cache_get_row_count in acel cod, doar ca folosit de la query-ul de inserare a liniei. In acest fel vei putea sa ii setezi variabila cu ID-ul sau imediat dupa ce s-a inserat.

 

Deci prin aceasta a doua metoda, pe care am spus-o eu, vei avea un query mai putin, si o atribuire mai buna a ID-ului.


Probabil folosesti versiunea R33 sau mai noua a pluginului MySQL ( http://wiki.sa-mp.com/wiki/MySQL/R33), trebuie sa stii ca trebuie sa si stergi acel query din memorie, prima data trebuie sa stochezi intr-o variabila ID-ul query-ului (egalezi variabila cu acel mysql_query), variabila fiind de forma

new Cache:liCacheID;
si apoi cand termini de luat tot ce a fost nevoie din acel query, trebuie OBLIGATORIU sa stergi setul rezultatului:

cache_delete( liCacheID );
Daca nu stergi rezultatul din memorie, o sa ai probleme legate de utilizarea memoriei RAM de catre server, acesta putand sa ajunga sa foloseasca foarte multi MB de RAM, daca nu chiar GB dupa cateva zile de functionare.

Este de asemenea foarte recomandat sa folosesti threaded queries (mysql_tquery) sau parallel queries (mysql_pquery) in loc de query-urile clasice, care ofera raspunsul pe loc (mysql_query), deoarece aceastea din urma creeaza lag si nu sterg automat rezultatul, poti vedea diferenta pe pagina de wikipedia pe care ti-am dat-o:

The difference between this native and mysql_tquery() is, that this type of query uses multi-threading, thus it's faster depending on how many connections are used. The number of connections can be specified in mysql_connect() through the pool_size parameter. Each connection resembles a thread.


In caz ca ai o neclaritate, te rog sa revii in acest topic cu raspunsul. Poti vedea exemple corecte de utilizare ale functiilor pe pagina la care am dat link.

Edited by ![]stuntman[]!
  • Upvote 2
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.