Exitus 1 Odesláno: 1. Červenec, 2012 Share Odesláno: 1. Červenec, 2012 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 More sharing options...
fabbeN 3 Odesláno: 1. Červenec, 2012 Share Odesláno: 1. Červenec, 2012 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 Link to comment Share on other sites More sharing options...
Benalek 0 Odesláno: 1. Červenec, 2012 Share Odesláno: 1. Červenec, 2012 Pokud si to dělal sám a je to funkční tak 10/10 Link to comment Share on other sites More sharing options...
Exitus 1 Odesláno: 1. Červenec, 2012 Author Share Odesláno: 1. Červenec, 2012 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 Á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 More sharing options...
Mattsy 29 Odesláno: 1. Červenec, 2012 Share Odesláno: 1. Červenec, 2012 Veľmi pekný tutoriál určite sa na neho pozriem keďže som chcel použiť aj ja register/login cez MySQL chválim 10/10 Link to comment Share on other sites More sharing options...
Exitus 1 Odesláno: 1. Červenec, 2012 Author Share Odesláno: 1. Červenec, 2012 Vďaka Link to comment Share on other sites More sharing options...
Globální moderátor Hip 191 Odesláno: 1. Červenec, 2012 Globální moderátor Share Odesláno: 1. Červenec, 2012 krásné fakt velmi pěkné 10/10 Link to comment Share on other sites More sharing options...
Exitus 1 Odesláno: 1. Červenec, 2012 Author Share Odesláno: 1. Červenec, 2012 Ďakujem, prípadne sem doložím aj nejaké vylepšenia Link to comment Share on other sites More sharing options...
Administrátor Ewwe 434 Odesláno: 1. Červenec, 2012 Administrátor Share Odesláno: 1. Červenec, 2012 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 Á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 More sharing options...
Adeer 1 Odesláno: 30. Leden, 2017 Share Odesláno: 30. Leden, 2017 Nemá někdo prosím reupload toho mysql pluginu? Link už nefunguje. Díky Link to comment Share on other sites More sharing options...
Pán Podnikateľ 52 Odesláno: 30. Leden, 2017 Share Odesláno: 30. Leden, 2017 http://pawno.cz/topic/53570-mysql-registr%C3%A1cia/ 1 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now