Přejít na obsah

MySQL Registrácia [****]



  • Pokud chcete odpovědět, přihlaste se
4 odpovědí

#1
Pán Podnikateľ

Pán Podnikateľ

    Podnikateľ

  • Uživatel
  • Příspěvků: 212

XS7b.png

OBSAH
   Obtiažnosť
   Predslov
   Úvod
   Obsah 
   Záver

 

[warn='Funkční pouze do verze 39']Tento návod je aktuální pouze do verze 39. Na aktualizaci návodu se pracuje.[/warn]

 
Obtiažnosť
4.png

Predslov
  Vážení čitatelia.
  Už dlhšie som si všímam, ako sa všetci neustále delíte, na viac táborov, a pritom, máte celý čas, ten vysnení, ukladací

  systém, podnosom.
  V konečnom dôsledku, aj chápem, prečo málo kto skočí, po MySQL databáze. Jednak, sa musíte učiť nový jazyk, SQL,
  a na stránke druhej, nikto nenapísal, žiadny komplexný návod.
  Samozrejme, že niekto môže podotknúť „Ale v roku 2011 napísal jeden mladí junák ...“ áno, máte pravdu, niečo
  podobné návodu, na MySQL ukladací systém, som tu videl, ale za ten čas, sa toho veľa zmenilo. Neskôr to zistí, aj
  náš miestni spochybňovač.
Úvod
  Tak, ak si prežil môj predslov, môžeme pokračovať ďalej, v návode. Ako prvé, budete potrebovať prístup, k vašej
  databáze. Ja osobne, používam na tvorbu tabuliek, phpMyAdmin. Ak ste skúsenejší, môžete to robiť aj manuálne, cez
  konzolu. Ďalej budete potrebovať MySQL plugin, a includ. Všetko potrebné, samozrejme prikladám, na konci tohto
  návodu, spolu, s návodom, na jazyk SQL. Jazyk SQL, budete potrebovať, pri rozsiahlom využití, pluginu. Tiež chcem
  podotknúť, že tento návod, počíta že ovládate jednotlivé datatypy, a samotný jazyk SQL.
 
Príprava
  tcrU.pngAk ovládate phpMyAdmin prosím prejdite na ďalší bod.
 
  V príprave, vás naučím, ako vytvoriť databázu, a samotnú tabuľku, ktorá bude slúžiť, na ukladanie, a čítanie vašich dát.
  Samotní systém, sa bude skladať z atribútov, ktoré, budú mať v sebe isté informácie. Ako napríklad Meno hráča. Tak 
  tiež, jeden z atribútov, musí byť kľúč, teda atribút, ktorý, je nemenný. V tomto návode, to bude, naša vytvorená,
  premenná ID.
  
 
  Po prihlásení do systému môžte vidieť následovné menu. Kde kliknete v hornej lište na ikonku databázy. 
 

yCBR.png

 
  Po kliknutí, sa nám zobrazí žiadosť, na vytvorenie databázy. Do prázdnej kolonky, napíšeme “Database“. Tím pádom, sa 
  bude naša databáza, volať Database. Potom, kliknite na “vytvoriť“.
 

SZIb.png

 
  Teraz, sa nám vytvorila naša databáza. Ďalší krok, bude vytvoriť tabuľku, a následne do nej vložiť naše atribúty. 
  Pre editáciu databázy, musíte kliknúť na ikonku, v ľavej lište, s názvom našej databázy, ktorú sme vytvorili “Database“.
  Následne, sa nám zobrazí menu, na vytvorenie spomínanej tabuľky. Do prázdnej kolonky, napíšeme názov našej tabuľky,
  s ktorou budeme neskôr pracovať. My si tam napíšeme “account“. 
  Vedľa našej “account“ kolonky, máme ešte tzv. “počet polí“. Počet polí, značí, že koľko atribútov, budeme používať. My 
  osobne, budeme ukladať, 12 atribútov. Tím pádom, si zmeňte default 4, na 12. Následne, kliknite na vykonaj.
 
 

jEpn.png

 
  Naša tabuľka, je teraz vytvorená. Teraz stačí, do nej vložiť, naše atribúty. V tomto kroku, nesmieme zabudnúť, na
  funkciu A_I. Vďaka tejto funkcií sa za každým novým záznamom pripočíta hodnota od poslednej hodnoty. 
 

 RA6O.png

 
  Gratulujem. Vaša databáza s tabuľkami, je vytvorená. Sami musíte uznať, že to nebolo nič ťažké. Dúfam, že sa rovnako
  tešíte aj na ďalší krok. 
 
Obsah
  Vítam vás, v ďalšom bode, kde vás naučím, ako vytvoriť jednoduchú registráciu, pomocou MySQL pluginu. 
  Opäť, vás chcem informovať, že bude potrebné, vedieť aspoň základy jazyka SQL! Ak, tieto znalosti nemáte, prosím
  prejdite, na bod, Záver. 
 
  Špecifikácia
    Ako aj iné pluginy, ako SSCANF 2, používa aj MySQL plugin, isté špecifikácie na používanie. 
    

Špecifikátor          Meno  
    e                 dostanete reťazec naraz. Nemusíte používať, mysql_real_escape_string().
    s                 String
    q                 Rovnaké ako %s. Pridané v SA:MP 0.3.7 R2
  d | i               Integer
    f                 Float
    x                 Hex
    b                 Binar

 
  Ako prvé, je potrebné, si stiahnuť plugin, aj s includom. Ten môžte stiahnuť, rolovaním stránky, na bod záver, kde sú
  jednotlivé linky na download, alebo učebný materiál SQL. Po pridaní includu, si otvoríme editor, do ktorého si napíšeme,
  následovné kód. 

#include <a_samp>                           
#include <a_mysql>                          

#define MYSQL_DB     "Your_Database"    
#define MYSQL_USER   "Name"          
#define MYSQL_PASS   "Pass" 
#define MYSQL_HOST   "IP"  

#define D_REG   0
#define D_LOG   1

native WP_Hash(buffer[], len, const str[]); 

 
  Definície 
    Najprv sme si zapísali použité include s ktorými budeme pracovať a to “<a_samp>“ a “<a_mysql>“.
    Potom sme vytvorili definície ktoré nám poslúžia ako skratka.  
   

    #define MYSQL_DB      - Meno databázy.
    #define MYSQL_USER  - Meno užívateľa phpMyAdmin.
    #define MYSQL_PASS  - Heslo užívateľa do phpMyAdmin.
    #define MYSQL_HOST - IP Serveru. Ak máte MySQL databázu, u seba na VPS, na ktorom vám beží aj server, použite local host ip “[/size]127.0.0.1“.[/size]
    #define D_REG             - Dialog ID Registrácie
    #define D_LOG             - Dialog ID Prihlásenia
     
     O hash hesla sa bude starať ďalší plugin ktorý by mal byť najbezpečnejší a to Whirlpool. 
     native WP_Hash(buffer[], len, const str[]);
    

// MySQL 
new 
    MySQL;

// REGISTER VARIABLE
new
    ID             [MAX_PLAYERS],
    Skin           [MAX_PLAYERS],
    Kill           [MAX_PLAYERS],
    Death          [MAX_PLAYERS],
    Admin          [MAX_PLAYERS],
    Wanted         [MAX_PLAYERS],
    Password       [MAX_PLAYERS],
    
    Float: PosX    [MAX_PLAYERS],
    Float: PosY    [MAX_PLAYERS],
    Float: PosZ    [MAX_PLAYERS],
    Float: PosR    [MAX_PLAYERS];

// CONTROL VARIABLE
new
    C_Login        [MAX_PLAYERS]; 

  Premenné
    Teraz sme si vytvorili premenné. s ktorými budeme ďalej pracovať. 
    MySQL    - slúži na rozpoznávanie databáze, a celkovo nám bude udržiavať, dátové pripojenie.

    C_Login  - Táto premenná, slúži na kontrolu, aby nám ukladanie nerobilo problémy, v prípade prihlásenia, a rázneho odhlásenia.

forward OnAccountLoad(playerid);
forward OnAccountCheck(playerid);
forward OnAccountRegister(playerid);

  Forward
    Teraz sme si vytvorili forwardy na naše public. 

public OnGameModeInit(){

    mysql_log(LOG_ERROR);
    
    MySQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASS);

    if(mysql_errno() != 0)  printf("[MySQL] Connect is not succesfull!"); 
    else                    printf("[MySQL] Connect is succesfull!"); 
    return true;
}

  OnGameModeInit
    mysql_log(LOG_ERROR); - Vďaka tejto funkcií, sa nam vytvorí, v prípade nejakej chyby, MySQL log, do ktorej sa daná chyba zapíše. 
    MySQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASS); - tu sa jedná o samotné pripojenie na MySQL server. v prípade,
                                                                                                                                                   ak máte iný port, na MySQL databázu ako je bežné, je potrebné za MYSQL_PASS dopísať
                                                                                                                                                   váš port. 
     if(mysql_errno() != 0) - slúži na informáciu o úspešnom alebo neúspešnom pripojení. 

public OnPlayerConnect(playerid){
   
    C_Login        [playerid] =
 
    Kill           [playerid] =
    Death          [playerid] =
    Admin          [playerid] = 
    Wanted         [playerid] = 0;
    
    new 
        string[128];
    
    mysql_format(MySQL, string, sizeof(string), "SELECT `Password`, `ID` FROM `account` WHERE `UserName` = '%e' LIMIT 1", PlayerName(playerid)); 
    mysql_tquery(MySQL, string, "OnAccountCheck", "i", playerid); 
    return true;
}

  OnPlayerConnect
    V tomto public, nulujeme naše premenné, a následne deklarujeme naše dôležitejšie premenné. Tieto premenné sa budú používať v callback OnAccountCheck“.
   

public OnPlayerDisconnect(playerid, reason){
    if(C_Login[playerid]){
        new 
            string[255];
            
        GetPlayerPos(playerid, PosX[playerid],PosY[playerid],PosZ[playerid]); 
        
        mysql_format(MySQL, string, sizeof(string), 
        "UPDATE `account` SET `Wanted` = %d, `Skin` = %d, `Kill` = %d,\
        `Death` = %d,`Admin` = %d, `PosX` = %f, `PosY` = %f, `PosZ` = %f, `PosR` = %f WHERE `ID` = %d",
        Wanted[playerid],Skin[playerid],Kill[playerid],Death[playerid],
        Admin[playerid],PosX[playerid],PosY[playerid],PosZ[playerid],PosR[playerid],ID[playerid]); 
        
        mysql_tquery(MySQL, string, "", ""); 
    }
    return true;
}  

  OnPlayerDisconnect
    V tomto public, ukladáme, naše premenné. Najprv si deklarujeme naše premenné,  a potom aktualizujeme našu databázu, s novo získanímy údajamy.  V podstate to môže
    pripomínať ukladanie v file.inc. 

public OnPlayerRequestSpawn(playerid){
    if(C_Login[playerid]){
        SpawnPlayer         (playerid);
        SetPlayerSkin       (playerid, Skin[playerid]);
        SetPlayerPos        (playerid, PosX[playerid],PosY[playerid],PosZ[playerid]);
        SetPlayerFacingAngle(playerid, PosR[playerid]);
    }
    return false;
} 

  OnPlayerRequestSpawn
    Tu, nám kontroluje premenná C_Login[playerid], či je true, a ak áno, spawne nás na súradnice ktoré buď máme uložené, alebo po registrácií priradené. Tak tiež, nám nahrá uložení skin.       

public OnPlayerDeath(playerid, killerid, reason){
    if(killerid != INVALID_PLAYER_ID){
        Kill  [killerid]++;
        Death [playerid]++;
        Wanted[killerid]++;
    }
    return true;
}  

  OnPlayerDeath 
    V prípade, ak bol hráč zabití, pridá mu do premennej Death + 1, a hráčovi ktorý ho zabil, Kill + 1 a Wanted + 1. 

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]){
    switch(dialogid){
        case D_REG:{
            if(response){ 
                if(strlen(inputtext) < 4) return ShowPlayerDialog(playerid, D_REG, DIALOG_STYLE_INPUT, 
                    "Registration", 
                        "Please type your password. The range of password is  4 - 19.", 
                    "confirm", "close"); 
                new 
                    string[500]; 
                     
                WP_Hash(Password[playerid], 129, inputtext); 
                mysql_format(MySQL, string, sizeof(string), "INSERT INTO `account` (`UserName`, `Password`) VALUES ('%e', '%e')", PlayerName(playerid), Password[playerid]); 
                mysql_tquery(MySQL, string, "OnAccountRegister", "i", playerid); 
                C_Login[playerid] = 1;
            }
            else Kick(playerid);
        }
        case D_LOG:{
            if(response){  
                new 
                    string  [225],
                    hashpass[129];      
                WP_Hash(hashpass, sizeof(hashpass), inputtext); 
                if(!strcmp(hashpass, Password[playerid])){ 
                    mysql_format(MySQL, string, sizeof(string), "SELECT * FROM `account` WHERE `UserName` = '%e' LIMIT 1", PlayerName(playerid)); 
                    mysql_tquery(MySQL, string, "OnAccountLoad", "i", playerid); 
                    C_Login[playerid] = 1;
                } 
                else ShowPlayerDialog(playerid, D_LOG, DIALOG_STYLE_INPUT, "Login", "Please enter your password with which you registered on the server.", "confirm", "close"); 
            } 
            else Kick(playerid);
        }
    }
    return true;
}  

  OnDialogResponse
   Ako môžme vidieť máme tu dvoje dialógy ktoré sú switchované a to login a register.
      Register
        if(strlen(inputtext) < 4)                                      - Ak je string menší ako 4, hráčovi znovu načitá dialóg. 
        WP_Hash(Password[playerid], 129, inputtext); - Whirlpool plugin nám zahashuje heslo. 
        Následne uložíme a voláme callback OnAccountCheck
     Login 
       WP_Hash(hashpass, sizeof(hashpass), inputtext);   - Hashujeme inputtext. 
         if(!strcmp(hashpass, Password[playerid]))               - Porovnanie uloženého hesla a inputtextu. 

        Na koniec voláme public z ktorého sa nám nahrajú údaje. 

public 
    OnAccountCheck(playerid){
        new 
            rows, fields; 

        cache_get_data(rows, fields, MySQL); 
         
        if(rows){ 
            cache_get_field_content(0, "Password", Password[playerid], MySQL, 129); 
            ID[playerid] = cache_get_field_content_int(0, "ID"); 
            
            ShowPlayerDialog(playerid, D_LOG, DIALOG_STYLE_INPUT, 
            "Login", 
                "Please enter your password with which you registered on the server.", 
            "confirm", "close");  
        } 
        else ShowPlayerDialog(playerid, D_REG, DIALOG_STYLE_INPUT, 
            "Registration", 
                "Please type your password. The range of password is  4 - 19.", 
            "confirm", "close"); 
        return true;
    } 

  OnAccountCheck    
    Vytvorili sme si dve premenné, do ktorých, sa uložia parametre, z predošlého public OnPlayerConnect(playerid). 
    Ak premenná rows nebude nula, tak načíta hodnotu password, a priradí ju k premennej password[playerid], potom priradí aj hodnotu ID[playerid]. A podla tejto hodnoty premennej rows, sa rozhoduje ktorý dialog spustí. 

public 
    OnAccountLoad(playerid){ 
        Wanted         [playerid] = cache_get_field_content_int  (0, "Wanted");  
        Skin           [playerid] = cache_get_field_content_int  (0, "Skin"  ); 
        Kill           [playerid] = cache_get_field_content_int  (0, "Kill"  ); 
        Death          [playerid] = cache_get_field_content_int  (0, "Death" );  
        Admin          [playerid] = cache_get_field_content_int  (0, "Admin" );
        PosX           [playerid] = cache_get_field_content_float(0, "PosX"  );
        PosY           [playerid] = cache_get_field_content_float(0, "PosY"  );
        PosZ           [playerid] = cache_get_field_content_float(0, "PosZ"  ); 
        PosR           [playerid] = cache_get_field_content_float(0, "PosR"  ); 
        return true; 
    } 

  OnAccountLoad
    - Tento public, slúži, na nahratie hráčových údajov. Dosť podobné, INI systémom. 

public 
    OnAccountRegister(playerid){ 
        ID    [playerid] = cache_insert_id(); 
        PosX  [playerid] = 1682.7249;
        PosY  [playerid] = 1451.3008;
        PosZ  [playerid] =   10.7719;
        printf("[Registration] New account registered. Database ID: [%d]",ID[playerid]); 
        return true; 
    }  

  OnAccountRegister
    Toto spätné volanie, sa vyvolá po úspešnej registrácií, kde priradí, hráčovi default premenné, plus statický ID identifikátor. 

stock
    PlayerName(playerid){
        new
            name[MAX_PLAYER_NAME+1];
        GetPlayerName(playerid, name, sizeof(name));
        return name;
    } 

  PlayerName
    Nakoniec starý známy stock.
 
  
Záver
  Ako vidíte sami nie je to nič zložité. Jedná sa o veľmi skvelí ukladací systém ktorý vám odporúčam ako náhradu za všetky INI systémy. Celý tento návod je len zlomok toho čo daný plugin umožňuje.
  Dúfam, že vám môj návod pomohol.

 

  


Download MySQL & Whirlpool
H3Xh.png 0Czw.png
Download Code & SQL
H3Xh.png  H3Xh.png
Learn SQL
qQPL.png

[success='Ověřený návod']Tento návod prošel validací, a lze ho proto považovat za ověřený.[/success]


  • 3


Spoiler


#2
UareBugged

UareBugged

    Your nightmare

  • Globální moderátor
  • Příspěvků: 1 170

Steam Profile


                               

Ku pawn časti sa nejdem vyjadrovať, nie z dôvodu že by nebola dobrá ale z toho dôvodu že sa pawn nevenujem tak to neviem posúdiť. Čo sa týka MySQL časti máš tam menšiu chybu

Atribút, nastavíte ako kľúčový, zaškrtnutím políčka “A_I“

A_I neznamená že atribút bude kľúčový, znamená to že polu(v tomto prípade pole ID) sa každým novým záznamom pripočíta hodnota od poslednej.(Auto Increment -> preto skratka A_I) Ak teda napríklad máme tabuľku "paštéky" kde bude záznam "majka" s ID 1 a pridáme nový záznam "sandále" tak ID bude 2.


  • 0

#3
Pán Podnikateľ

Pán Podnikateľ

    Podnikateľ

  • Uživatel
  • Příspěvků: 212

Ku pawn časti sa nejdem vyjadrovať, nie z dôvodu že by nebola dobrá ale z toho dôvodu že sa pawn nevenujem tak to neviem posúdiť. Čo sa týka MySQL časti máš tam menšiu chybu

A_I neznamená že atribút bude kľúčový, znamená to že polu sa každým novým záznamom pripočíta hodnota od poslednej.(Auto Increment -> preto skratka A_I) Ak teda napríklad máme tabuľku "paštéky" kde bude záznam "majka" s ID 1 a pridáme nový záznam "sandále" tak ID bude 2.

Ou ha zle som to potom pochopil. Hneď to opravím.
Ďakujem za pomoc.


  • 1

Spoiler


#4
vEnd

vEnd

    Emmet

  • Globální moderátor
  • Příspěvků: 606

Hodně užitečný návod, dobrá práce. Mám ještě dotaz:

`UserName` = '%e'

Proč %e a co vlastně je %e? Všiml jsem si, že jsi to použil všude, kam se měl dosadit string, je to tedy jakási náhrada za %s?


  • 0

96b259ac47244701b5097887d9439120.png

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
It's hard to follow the train when you are hauling two number nines; a number nine large; a number six with extra dip; a number seven; two number 45s, one with cheese; and a large soda. -guess who


#5
Pán Podnikateľ

Pán Podnikateľ

    Podnikateľ

  • Uživatel
  • Příspěvků: 212

Hodně užitečný návod, dobrá práce. Mám ještě dotaz:

 

 

Proč %e a co vlastně je %e? Všiml jsem si, že jsi to použil všude, kam se měl dosadit string, je to tedy jakási náhrada za %s?

Pridané špecifikácie.  ;)


  • 1

Spoiler






Také označeno jedním nebo více klíčovými slovy: Návod

0 uživatelů si prohlíží toto fórum

0 uživatelů, 0 návštěvníků 0 anonymních uživatelů

© 2015 IPS, Inc.

Zajímat Vás mohou ještě aktuální zprávy. sleviště, slevy dnes Herbalife je skvělou cestou pro dobré zdraví. Je libo dětský web?