Jump to content

UPDATE #1 MySQL Conexiune


andy47

Recommended Posts

#1   MySQL 

Salutari! 

Pentru inceput, mysql este un sistem de gestionare a datelor cu ajutorul unei baza de date. O baza de data este o modalitate de a pastra informatiile intr-un mod structurat. Intr-o baza de date putem insera, extrage, modifica informatii.

De-a lungul anilor diferiti scripteri ai comunitati sa-mp au creat/actualizat pluginul folosit de noi pentru conectarea server-ului la mysql.

Ultima versiune de mysql este mysql r41-4 conceputa de catre maddinat0r. Link download: https://github.com/pBlueG/SA-MP-MySQL/releases .

Cum instalam?

Pentru a instala mysql, accesati linkul de mai sus si descarcati mysql-R41-4-win32.zip . Copiati mysql.dll in folderul plugin, a_mysql.inc includetil in libraria voastra pawno/include, iar libmariadb.dll si log-core.dll punetile in folderul cu server-ul dumneavoastra. Accesati server.cfg din folder-ul cu server-ul respectiv si adaugati la linia plugins ( daca nu aveti aceasta linie, o puneti creea dumneavoastra ) mysql.dll

plugins mysql.dll

In gamemode-ul sau filterscript-ul dumneavoastra adaugati libraria mysql.

#include <a_mysql>

Cum conectam server-ul la o baza de date?

In versiunea curenta de mysql r41-4 sunt doua metode pentru a creea conexiunea intre un server mysql si baza de date.

Prima metoda ar fi cea cu mysql_connect. Ea este o functie a librariei mysql care ne permite conectarea la o baza de date.

mysql_connect(const host[], const user[], const password[], const database[], MySQLOpt:option_id = MySQLOpt:0)

const host[] - Acest parametru reprezinta gazda unde este gazduit server-ul mysql. 
const user[] - Acest parametru reprezinta numele de utilizator al contului a server-ului mysql pe care doriti sa va conectati.
const password[] - Acest parametru reprezinta parola contului server-ului mysql pe care doriti sa va conectati.
const database[] - Acest parametru reprezinta numele datei de baze la care doriti sa va conectati.
MySQLOpt:option_id = MySQLOpt:0 - Acest parametru este unul optional. Se foloseste pentru a accesa diferite optiuni ale conexiuni.

Pentru a creea anumite optiuni ale conectari la o baza de date ne folosim de functiile mysql_init_options si mysql_set_option .

Functia mysql_init_options defineste o optiune a conectari.

new MySQLOpt:optiune = mysql_init_options();

Functia mysql_set_option seteaza ce optiune sa acceseze.

mysql_set_option(MySQLOpt:option_id, E_MYSQL_OPTION:type, {Float, _:...})

MySQLOpt:option_id - Acest parametru reprezinta id-ul optiuni de conectare.
E_MYSQL_OPTION:type - Acest parametru reprezinta optiunea pe care sa o execute.
{Float, _:...} - Acest parametru seteaza o valoare optiuni. (true/false)

Un tabel cu toate optiunile se gaseste pe wikipedia http://wiki.sa-mp.com/wiki/MySQL/R40#Available_options .

 Aceste optiuni sunt optionale, eu personal nu le folosesc.

A doua metoda ar fi cea cu mysql_connect_file. Ea este o functie care ne permite conectarea la baza de date, dar accesand un fisier .ini din folder-ul server-ului nostru. (acesta contine date despre conexiune si despre optiuni)

mysql_connect_file(const file_name[] = "mysql.ini")
Are un singur parametru care reprezinta fisierul care sa-l acceseze.

Un exemplu de fisier mysql.ini:

hostname = 127.0.0.1
username = root 
database = database
password = paroladb // Daca nu aveti o parola, nu scrieti nimic in legatura de ea.
autoreconnect = false
port = 3306

Pentru a ne da seama ca server-ul s-a conectat la o baza de date ne vom folosi de crearea unui maner al conexiuni ( alias handle ) si de functia mysql_errno.

mysql_errno(MySQL:handle = MYSQL_DEFAULT_HANDLE)
Parametrul respectiv reprezinta manerul de conexiune al nostru.

Functia mysql_close inchide conexiunea la server-ul mysql.

mysql_close(MySQL:handle = MYSQL_DEFAULT_HANDLE)
Acel parametru reprezinta numele manerului conexiuni noastre.

Exemplu maner:

new MySQL: aHandle;

Pentru a creea un log al informatiilor ce vor fi inserate, extrase, modificate vom folosi functia mysql_log.

Aceasta functie are diferite nivele. http://wiki.sa-mp.com/wiki/MySQL/R40#Log_levels

Eu va recomand sa le folosit pe toate.

mysql_log(ALL);

Ce face mai exact? Iti arata erorile, avertizarile in legatura cu tot ce tine de mysql din script.

#1 Exemplu de conectare:

#include <a_samp> // libraria basic sa-mp
#include <a_mysql> // includem libraria mysql pentru a avea acces la functiile ei
  
new MySQL: aHandle; // cream manerul de conexiune a server-ului mysql la baza de date

public OnGameModeInit() // acest callback este accesat cand aprindem server-ul ( samp-server.exe )
{
	aHandle = mysql_connect("localhost", "root", "", "database"); // functia accesata pentru conectare
	mysql_log(ALL); // sa ne afiseze erorile, avertizarile...
	if(mysql_errno(aHandle) != 0) // verificam daca conexiunea va avea loc
	{
		print("[MySQL]: Nu s-a putut conecta la baza de date."); 
	}
	print("[MySQL]: Conectarea a reusit!");
	return 1;
}
  
public OnGameModeExit() // acest callback este accesat cand inchidem server-ul
{
	mysql_close(aHandle); // inchidem conexiunea la baza de date
	return 1;
}
 

#2 Exemplu de conectare:

#include <a_samp>
#include <a_mysql>

new MySQL: aHandle;

public OnGameModeInit()  
{    
	aHandle = mysql_connect_file("mysql.ini");  
	mysql_log(ALL);
	if(mysql_errno(aHandle) != 0)
	{
	print("[MySQL]: Nu s-a putut conecta la baza de date.");
	}
	print("[MySQL]: Conectarea a reusit!");
	return 1;  
} 

public OnGameModeExit()  
{  
	mysql_close(aHandle);  
	return 1;  
}  

Acum ca am conectat server-ul la baza de date, e timpul sa si o cream.

Pentru conectarea pe localhost a unui server mysql la baza de date ne vom folosi de unul dintre programele urmatoare:

XAMPP: https://www.apachefriends.org/ro/index.html

WAMP: http://www.wampserver.com/en/

Instalam unul dintre programe, aprindem APACHE si MYSQL si accesam in browser-ul nostru localhost/phpmyadmin .

https://imgur.com/a/WvjNMJt

La database name introducem numele bazei de date, in cazul meu database si apasam Create.

https://imgur.com/a/keeRBTv

Cream primul tabel. In cazul meu Accounts unde as vrea sa am stocate datele tuturor jucatorilor ce intra pe server.

https://imgur.com/a/N9zyf08

In acest tabel inseram diferite date pe care vreau sa le salvez. Ex.: ID fiecarui jucator, Numele fiecaruia, Parola lor, IP etc. etc. .

De exemplu pentru stringuri voi folosi varchar, atentie mare nu puneti date exagerate. Gen pentru Numele jucatorului este destul si 24 de caractere sau de exemplu vrem sa cream o variabila Level care sa stocheze levelul unui jucator, nu e nevoie ca tipul datei sa fie un int, deoarece Levelul fiecarui jucator la mine pe server vreau sa fie maxim format din 2 cifre, ( exemplu level maxim 99 ) in cazul asta putem pune sa fie un tinyint deoarece facem economie de bytes. O sa se simta cand o sa fie mai multe randuri in baza de date. Tinyint pot fi date cuprinse intre 0-255 in cazul meu, deoarece nu merge si pe numere negative.

Mai multe informatii legate de tipurile de date gasim aici: https://dev.mysql.com/doc/refman/8.0/en/integer-types.html de exemplu pentru numere intregi.

UPDATE: 

Salutari! Aseara eram cam obosit, dar voi continua aici unele detalii despre bazele de date sa nu creez alte topicuri inutile.

Pentru inceput, atunci cand adaugam un tip de data tinyint ( cum am dat exemplul ala mai sus ), pe acesta il putem declara ca find SIGNED sau UNSIGNED.

Care este diferenta? De exemplu in cazul meu la o data de tip tinyint, atunci cand il declar SIGNED poatea avea valorii cuprinse intre -128 si 127, dar atunci cand il declar UNSIGNED poatea avea valori cuprinse intre 0 si 255. De unde stiu toate acestea? Daca ati citit bine mai sus v-am lasat un link de unde puteti sa va documentati in legaturi cu aceste valori. Mai pe romaneste atunci cand e UNSIGNED valorile incep de la 0, nu exista valori negative.

Poza in care declar o data UNSIGNED: https://imgur.com/a/f8l2KlS .

Ce este acel A_I? Acel A_I se numeste AUTO_INCREMENT. Acest A_I functioneaza cu orice tip de data intreaga. ( int ) La fiecare rand nou adaugat in baza de date, numarul asociat se va incrementa in baza de date. Atunci cand folosim aceasta operatie se va seta automat ca tipul asta de data este PRIMARY KEY adica este rolul primei coloane, reprezentand numarul de referinta pentru fiecare linie.

Spre exemplu la mine acel "ID", acesta va primi cand adaug un rand nou in baza de date cate un numar diferit pentru fiecare rand. Gen am 1000 de randuri, ele vor fi numerotate in ordine crescatoare. ( 100, 101, 102, 103 ... )

Tot timpul Storage Engine va fi setat ca fiind InnoDB, este cel mai indicat pentru un server de sa-mp acest tip. In legatura cu informatii despre, in romana, motor de stocare gasiti pe internet.

In legatura cu definirea valorilor direct din baza de date. Gen vrem sa cream un system de login/register care va salva datele jucatorilor intr-o baza de date. Atunci cand cream un system de genul, cand isi inregistreaza contul, trebuie sa-i inseram datele intr-un rand nou. Sa presupunem ca noi avem urmatoarele date: ID - sa se insereze automat numarul fiecarui rand; Name - care va reprezenta numele unui jucator; Password - care va reprezenta parola; Level - care va reprezenta nivelul jucatorului; Admin - care va reprezenta nivelul de administrator al jucatorilui; Experienta - care va reprezenta numar de puncte de experienta pe care le are jucatorul pentru a avansa in nivel. Atunci cand definim valorile direct din baza de date. Gen in cazul meu in script voi pune sa-i insereze numele si parola si voi evita sa insereze si valori pentru celelalte date deoarece le voi defini direct din baza de date.

Un exemplu:

mysql_format(aHandle, query, sizeof query, "INSERT INTO `Users`(`Name`,`Password`) VALUES('%s','%e')", GetName(playerid), inputtext);

 Linia care o am in script specifica inserari unui nou rand si poza cu datele setate default in baza de date: https://imgur.com/a/CzQFWbc . Gen la mine pe server cand se inregistreaza un jucator/un nou cont va avea Level 1, Admin 0 si va incepe cu 100 de puncte de experienta.

De ce eu va indic sa faceti in felul asta? Pentru ca este mai usor si eviti unele neplaceri, deoarece atunci cand ai 100 de date, posibil sa te incurci in definirea valorilor datelor respective, gen cum am facut eu sau Massari in scriptul server-ului G-RolePlay:

strcat( gQuery, "INSERT INTO `Users` " ) ;
format( gQuery, sizeof gQuery, "%sVALUES( 0, '%s', '%s', 'No Mail', 'No Judet', '%s', 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)", gQuery, GetName( playerid ), Password, GetPlayerIP( playerid ) );
mysql_tquery( aHandle, gQuery, "", "" ) ;

Si acum este un bug la conturi pe gamemode-ul respectiv din cauza la multitudinea de date definite din script adica acele zero-uri multe.

Cam atat am avut de spus in legatura cu asta. Nu este cine stie ce acest tutorial, rog pe cei care au ceva de completat/modificat in legatura cu conexiunea sa o faca!

 

Edited by andy47
  • Upvote 2
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • 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.