Prajem pekný deň, tento tutoriál by vás mal naučiť jednoduchú prácu s Relačným Databázovým Systémom MySQL prostredníctvom dialógov.
Vopred upozorňujem ,aby ste tomuto tutoriálu úplne porozumeli je nutné mať už nejaké základy práce s Dialógom, Podmienkami, Premennými.
Uveďme si najprv Rozdiel medzi MySQL a Súborovým Systémom
Nevýhody súborového systému:
[*:a69u1e5y]Redundancia(nadbytočnosť) a Nekonzistencia dát [*:a69u1e5y]Problém s Integritou dát (Vierohodnosť) [*:a69u1e5y]Obmedzene zdieľanie dát [*:a69u1e5y]Problémy so zabezpečením dát [*:a69u1e5y]Obtiažná správa dát
Výhody Databázového systému:
[*:a69u1e5y]Zníženie Redundancie [*:a69u1e5y]Zaistenie integrity dát [*:a69u1e5y]Zvýšenie bezpečnosti [*:a69u1e5y]Súčasný prístup viacero užívateľov [*:a69u1e5y]Vzájomná prepojiteľnosť dát [*:a69u1e5y]Dátová nezávislosť
Skôr ako začneme s písaním kódu musíme si pripraviť prostredie v ktorom budeme pracovať, takže je nutné mať:
- MySQL Server či už na Lokále alebo Niekde inde
- MySQL Klienta (Navicat, SQLyog..) prípadne Webové rozhranie PhpMyAdmin
- MySQL Databázu (v našom prípade s názvom "SAMP")
- MySQL Uživateľa
Krok1:
Úplne hore do módu/fs si pridajte tieto includy:
#include
#include
Krok2:
Vo vašej MySQL DB je nutné si vytvoriť tabuľku v ktorej budeme jednotlivé údaje o hráčovi uchovávať. V našom prípade je to tento SQL Kód, ktorý vytvorí tabuľku s názvom "users".
CREATE TABLE `users` (
`id` INT( 11 ) NULL AUTO_INCREMENT ,
`Username` VARCHAR( 24 ) NULL ,
`Password` VARCHAR( 50 ) NULL ,
`Money` INT( 11 ) NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM ;
Pre tých čo sa zamysleli nad Atribútom "id" je to jednoznačný identifikátor každej Entity v Tabuľke. (Primárny Kľúč)
Krok3:
Vytvoríme si konštanty slúžiace ako argumenty funkcie mysql_connect
Takže niekde hore do Módu/FS medzi definície dáme:
#define MYSQL_USER "root" // Meno uživateľa do DB
#define MYSQL_PASS "****" // Vaše heslo k účtu do Mysql napr. 12345
#define MYSQL_DB "SAMP" //Naša Mysql databáza
#define MYSQL_HOST "localhost" //IP Adresa na ktorej beží váš Mysql Server
//pokiaľ je u vás na PC tak doplníte "127.0.0.1" alebo "localhost"
!!V prípade ,že používate iný Port pre službu Mysql ako 3306 nahraďte
#define MYSQL_HOST "localhost"
#define MYSQL_HOST "localhost:3308" //3308 = vas port
Krok4:
Vytvoríme sa premennú (Handler Spojenia MySQL), pridávame medzi premenné hore do módu
new MySQL:connection;
+
new Money[MAX_PLAYERS]; //premenná kde uložíme peniaze
Krok5:
Keďže údaje o MySQL máme zhromaždené v konštantách môžeme sa pripojiť k MySQL Serveru.
OnGameModeInit:
mysql_init(LOG_ONLY_ERRORS, 1);//Nastavíme Aby Plugin zapisoval do logu iba chyby
mysql_connect(MYSQL_HOST , MYSQL_USER, MYSQL_PASS , MYSQL_DB, connection, 1);//pripájame sa k serveru
if(!mysql_ping(connection))//overíme či spojenie je aktívne
{
print("Spojenie MySQL je aktivne");
}
else
{
print("Spojenie MySQL je neuspesne");
}
Krok6:
Pridáme si Volanie funkcie(Stocku) , ktorá nám overí či uživateľ je registrovaný alebo nieje.
OnPlayerConnect
CheckUser(playerid);
Ďalej pridáme Volanie Funkcie pre uloženie informácii do DB
OnPlayerDisconnect
SaveUser(playerid);
Krok7:
Pridáme Akciu pre Dialógy
OnDialogResponse
if(dialogid == 0) //Register
{
if(response){ //Ak stlačí tlačítko
if(strlen(inputtext) > 4 && strlen(inputtext) < 25){//Overíme či heslo je dlhšie ako 4 znaky a menšie ako 25
new escPass[50]; //vytvoríme premennú do ktorej uložíme Heslo (Ochrana SQL Injection)
mysql_real_escape_string(inputtext, escPass); //uložíme zadané heslo do escPass (Ochrana SQL Injection)
RegisterUser(playerid, escPass); //Zavoláme funkciu RegisterUser ktorej predáme ošetrené heslo
}else GameTextForPlayer(playerid, "~r~Your Password length must be ~y~5 - 25 ~r~characters", 8000, 3);//vypíšeme upozornenie ak je heslo krátke alebo príliš dlhé
}
}
if(dialogid == 1) //Login
{
new Query[300], escPass[50]; //vytvoríme premenné pre formát SQL Kódu a pre Ošetrené Heslo
if(response){ //Ak stlačí tlačítko
mysql_real_escape_string(inputtext, escPass); //uložíme zadané heslo do escPass (Ochrana SQL Injection)
format(Query, sizeof(Query), "SELECT * FROM `users` WHERE `Username` = '%s' AND `Password` = md5('%s')",GetName(playerid), escPass); //naformátujeme Kód ktorý sa odošle do mysql
mysql_query(Query);//Odošleme
mysql_store_result();//Uložíme výsledok
new rows = mysql_num_rows(); //Vytvoríme premennú a inicializujeme ju na hodnotu nájdených Riadkov ktoré vyhoveli požiadavke Query
if(rows == 1) LoginUser(playerid); //Ak sa našiel jeden riadok môžeme pokojne prihlásiť pretože Meno aj Heslo je správne voláme funkciu LoginUser
else{//ak zadá zle heslo
GameTextForPlayer(playerid, "~r~Wrong Password !!", 4000, 3);
PlayerPlaySound(playerid, 5450, 0, 0, 0); //pustíme zvuk
}
mysql_free_result(); //vypustíme výsledky Query
}
}
Krok8:
Úplne dole do módu/FS
stock CheckUser(playerid)
{
new string[200]; //Premenná pre String zobrazený v Dialógu
new Query[350]; //Premenná pre uloženie SQL kódu ktorý odosielame
new escName[24]; //Premenná na uloženie ošetreného Hesla
mysql_real_escape_string(GetName(playerid), escName);
format(Query, sizeof(Query), "SELECT * FROM `users` WHERE `Username` = '%s' LIMIT 1", escName);//Naformátujeme požiadavku s údajmi o uživateľovi
mysql_query(Query);
mysql_store_result();//Uložíme výsledok
if(mysql_num_rows() == 1) //porovnávame výsledky ak sa uživateľ našiel prihlasujeme dialógom
{
format(string, sizeof(string),"Dobrý deň %s\nProsím prihláste sa!",GetName(playerid));//Formát dialógu
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_PASSWORD,"Prihlásenie",string, "Ok", "Zrušiť"); //Odošleme Dialóg
}else // ak sa uživateľ nenašiel registrujeme
{
format(string, sizeof(string),"Dobrý deň %s\nProsím Zaregistrujte sa sa!", GetName(playerid));//Formát dialógu
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_PASSWORD,"Registrácia",string, "Ok", "Zrušiť");//Odošleme Dialóg
}
mysql_free_result();
return 1;
}
stock SaveUser(playerid)
{
new Query[350];
format(Query, sizeof(Query), "UPDATE `users` SET `Money` = %d WHERE `Username` = '%s'", GetPlayerMoney(playerid),GetName(playerid)); //Formátujeme Query
mysql_query(Query); //Odosielame
return 1;
}
stock RegisterUser(playerid,password[])
{
new Query[300];
format(Query,sizeof(Query), "INSERT INTO `users` (`Username` , `Password` , `Money`) VALUES ('%s', md5('%s'), '0')",GetName(playerid), password);//Formátujeme Požiadavku
mysql_query(Query);//Odosielame
GameTextForPlayer(playerid, "~g~Successfully Registered!!", 4000, 3);
return 1;
}
stock LoginUser(playerid)
{
new Query[350];
format(Query, sizeof(Query), "SELECT * FROM `users` WHERE `Username` ='%s'", GetName(playerid));//Naformatujeme požiadavku
mysql_query(Query); //Odošleme
mysql_store_result();//Uložíme výsledok
mysql_fetch_row(Query,"|");//Vyžiadame si jednotlivé stĺpce a oddelíme ich |
sscanf(Query, "p<|>{is[24]s[50]}i",Money[playerid]); //Z každého stĺpca vyberieme informácie a uložime do premenných okrem Mena , Hesla , a ID. použijeme Delimiter |
GivePlayerMoney(playerid, Money[playerid]); //Pridáme Peniaze získane z polí
mysql_free_result(); //vyčistíme výsledok
GameTextForPlayer(playerid, "~g~Successfully Logged !!", 4000, 3);//vypišeme text
return 1;
}
stock GetName(playerid)
{
new pName[100];
GetPlayerName(playerid, pName, sizeof(pName));
return pName;
}
Full Code:
Download:
Sscanf Plugin: http://dl.dropbox.com/u/21683085/sscanf.rar
MysqlPlugin: http://www.strickenkid.com/mysql_plugin/download.php?f=windows
Zložky obsahujú aj inc pre Pawno !! + aj Pluginy *.so