Jump to content

Exitus

Uživatel
  • Příspěvků

    59
  • Registrován

  • Aktivní

Everything posted by Exitus

  1. 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
×
×
  • Create New...