Jump to content

MySQL Register / Login (Dialog)


Exitus

Recommended Posts

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:

 

// This is a comment

// uncomment the line below if you want to write a filterscript

//#define FILTERSCRIPT

 

#include

#include

#include

 

#pragma tabsize 0

 

#define MYSQL_USER "samp" // 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"

new MySQL:connection;

new Money[MAX_PLAYERS]; //premenná kde uložíme peniaze

 

main()

{

print("\n----------------------------------");

print(" Blank Gamemode by your name here");

print("----------------------------------\n");

}

 

 

 

public OnGameModeInit()

{

// Don't use these lines if it's a filterscript

SetGameModeText("TuT");

AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);

 

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");

}

 

return 1;

}

 

public OnGameModeExit()

{

return 1;

}

 

public OnPlayerRequestClass(playerid, classid)

{

SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);

SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);

SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);

return 1;

}

 

public OnPlayerConnect(playerid)

{

CheckUser(playerid);

return 1;

}

 

public OnPlayerDisconnect(playerid, reason)

{

SaveUser(playerid);

return 1;

}

 

public OnPlayerSpawn(playerid)

{

return 1;

}

 

public OnPlayerDeath(playerid, killerid, reason)

{

return 1;

}

 

public OnVehicleSpawn(vehicleid)

{

return 1;

}

 

public OnVehicleDeath(vehicleid, killerid)

{

return 1;

}

 

public OnPlayerText(playerid, text[])

{

return 1;

}

 

public OnPlayerCommandText(playerid, cmdtext[])

{

if (strcmp("/mycommand", cmdtext, true, 10) == 0)

{

// Do something here

return 1;

}

return 0;

}

 

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)

{

return 1;

}

 

public OnPlayerExitVehicle(playerid, vehicleid)

{

return 1;

}

 

public OnPlayerStateChange(playerid, newstate, oldstate)

{

return 1;

}

 

public OnPlayerEnterCheckpoint(playerid)

{

return 1;

}

 

public OnPlayerLeaveCheckpoint(playerid)

{

return 1;

}

 

public OnPlayerEnterRaceCheckpoint(playerid)

{

return 1;

}

 

public OnPlayerLeaveRaceCheckpoint(playerid)

{

return 1;

}

 

public OnRconCommand(cmd[])

{

return 1;

}

 

public OnPlayerRequestSpawn(playerid)

{

return 1;

}

 

public OnObjectMoved(objectid)

{

return 1;

}

 

public OnPlayerObjectMoved(playerid, objectid)

{

return 1;

}

 

public OnPlayerPickUpPickup(playerid, pickupid)

{

return 1;

}

 

public OnVehicleMod(playerid, vehicleid, componentid)

{

return 1;

}

 

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)

{

return 1;

}

 

public OnVehicleRespray(playerid, vehicleid, color1, color2)

{

return 1;

}

 

public OnPlayerSelectedMenuRow(playerid, row)

{

return 1;

}

 

public OnPlayerExitedMenu(playerid)

{

return 1;

}

 

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)

{

return 1;

}

 

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)

{

return 1;

}

 

public OnRconLoginAttempt(ip[], password[], success)

{

return 1;

}

 

public OnPlayerUpdate(playerid)

{

return 1;

}

 

public OnPlayerStreamIn(playerid, forplayerid)

{

return 1;

}

 

public OnPlayerStreamOut(playerid, forplayerid)

{

return 1;

}

 

public OnVehicleStreamIn(vehicleid, forplayerid)

{

return 1;

}

 

public OnVehicleStreamOut(vehicleid, forplayerid)

{

return 1;

}

 

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])

{

 

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

 

}

 

}

 

 

 

 

 

return 1;

}

 

public OnPlayerClickPlayer(playerid, clickedplayerid, source)

{

return 1;

}

 

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 vyberiem informácie a uložime do premenných okrem Mena , Hesla , a ID.

 

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;

}

 

 

 

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

Link to comment
Share on other sites

Good job! Ak už bude moja reg/log na nič tak použijem toto ;)

Inak veľa ludí tu nemá server u hostingu ktorý podporuje pluginy.

Niektorý nemajú ani svoj mod :d

 

Áno to je pravda :) ale myslím ,že je to výhodnejšie aj keď ako hovoríš dnes málo kto ma hosting ktorý podporuje pluginy. :)

Link to comment
Share on other sites

  • Administrátor
Good job! Ak už bude moja reg/log na nič tak použijem toto ;)

Inak veľa ludí tu nemá server u hostingu ktorý podporuje pluginy.

Niektorý nemajú ani svoj mod :d

 

Áno to je pravda :) ale myslím ,že je to výhodnejšie aj keď ako hovoríš dnes málo kto ma hosting ktorý podporuje pluginy. :)

Lze to udělat i bez pluginu jako to mám já :)

Link to comment
Share on other sites

  • 4 years later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...