[Tutorial] Criando um sistema de registro em MySQL. (R7)
#1

Introduзгo:

Bem, esta serб meu primeiro tutorial no fуrum, espero que possa servir de ajuda
para aqueles que procuram algo do gкnero.

Hoje, vou lhes ensinar como criar um simples sistema de registro usando MySQL.

Requerimentos:
Primeiramente, vocкs precisam saber como criar o banco de dados. Para isto, й
sу assistir o vнdeo abaixo.

[ame]http://www.youtube.com/watch?v=MiJlWnK9ndY&feature=player_embedded[/ame]

Agora, com o banco de dados criado, vamos а aplicaзгo no pawn.

Vocк precisarб dos seguintes arquivos:

- MySQL Plugin (r7):
- .dll para Windows.
- .so para Linux.

- Precisarб tambйm do arquivo libMySQL, e preciso colocб-lo na pasta do sa-mp server.

Aplicaзгo em pawn


Primeiramente, vamos incluir a biblioteca mysql ao nosso cуdigo.
pawn Код:
#include <a_samp>
#include <a_mysql>
Agora, vamos а definiзгo dos dados da conexгo:
pawn Код:
#define HOSTNAME "localhost"
#define USERNAME "root"
#define DATABASE "samp"
#define PASSWORD ""
Estes dados estгo sujeitos а alteraзхes, entгo coloquei os padrхes.


Agora vamos ao sistema:

pawn Код:
new conexao; // Variбvel equivalente a connectionHandle (Nгo sei como explicar bem isto)
new bool:Login[MAX_PLAYERS]; // Variбvel booleana para checar se um jogador fez login ou nгo.

// Estabelecendo conexгo
public OnGameModeInit()
{
    conexao = mysql_connect(HOSTNAME, USERNAME, DATABASE, PASSWORD);

    // Pra checar se foi bem sucedida a conexгo costumo fazer o seguinte:
    if(mysql_ping(conexao) < 1)
        return SendRconCommand("exit");

    // Caso o ping seja menor que 1 o script nгo й inicializado.
    // Caso hajam mйtodos melhores por favor digam.
   
    // Criando a tabela
    // Nгo usarei cache nem callback pois nгo serб necessбrio obter resultado
    mysql_function_query(conexao, "CREATE TABLE IF NOT EXISTS `jogadores` (`nome` VARCHAR(24) NOT NULL,`senha` VARCHAR(32))", false, "", "");
    return 1;
}

// Finalizando a conexгo quando o script for finalizado
public OnGameModeExit()
{
    mysql_close(conexao);
    return 1;
}

public OnPlayerConnect(playerid)
{
    ResetPlayerMoney(playerid);
   
    // Criamos as arrays para armazenar o nome do jogador e a consulta SQL.
    new nome[MAX_PLAYER_NAME],
        consulta[128];
       
    // Obtemos o nome do jogador
    // Formatamos nossa consulta
   
    GetPlayerName(playerid, nome, MAX_PLAYER_NAME);
    mysql_format(conexao, consulta, "SELECT * FROM `jogadores` WHERE `nome`  = '%e'", nome);
   
    // Traduzindo a consulta
    // SELECIONE tudo (*) DE jogadores AONDE nome = nome(variavel)

    // Breve explicaзгo do especificador %e
    // Deve ser usado apenas em mysql_format
    // Й como se fosse feito um mysql_real_escape_string
    // Resumindo, da escape string no nome do jogador evitando possнveis ataques SQL injection
    // Poderia tambйm ser feito:
        // format(consulta, sizeof(consulta), "SELECT * FROM `jogadores` WHERE `nome` = '%s'", gPlayerName);
        // Viram que usamos %s, pois o %e sу funciona com mysql_format
       
    // Agora, executamos a consulta
    mysql_function_query(conexao, consulta, true, "ProcurarUsuario", "i", playerid);
   
    // conexao - Foi explicado acima
    // consulta - String formatada com o cуdigo da consulta
    // true - cache serб usado, cache obtem os dados da consulta sem precisar de mysql_store_result, free_result etc.., embora os mesmos possam ser usados
    // "ProcurarUsuario" - Callback a ser chamada para executar as funзхes apуs a obtenзгo do resultado
    // "i" - Especificador para nъmeros (integers), pode-se usar "d" tambйm
    // "playerid" - "i" equivale a playerid, pra quem nгo sabe, playerid й uma integer.
   
    return 1;
}

// Declarando a Callback "ProcurarUsuario"

forward ProcurarUsuario(playerid);
public ProcurarUsuario(playerid)
{
    // Declaramos as variбveis para obter os resultados da consulta realizado anteriormente na OnPlayerConnect
    new
        linhas,
        campos;
       
    // Obtemos o nъmero de linhas e colunas resultantes da consulta
    cache_get_data(linhas, colunas, conexao);
   
    // Caso nгo haja nenhuma linha, o jogador nгo estб registrado, logo, vamos exibir o dialog de registro.
    if(!linhas)
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "{FFFFFF}Registro", "{FFFFFF}Digite uma senha para se registrar.", "Registrar", "");
    }
    else
    {
        // Caso haja ele estб registrado, exibimos o dialog de login
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{FFFFFF}Login", "{FFFFFF}Digite sua senha", "Login", "");
    }
    return 1;
}

//
// Fazendo o processamento dos dialogs
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    // Declarando as arrays de obtenзгo do nome do jogador e de formataзгo da consulta SQL
    new
        nome[MAX_PLAYER_NAME],
        consulta[128];
       
    // Obtemos o nome do jogador
    GetPlayerName(playerid, nome, sizeof(nome));
   
    switch(dialogid)
    {
        case DIALOG_REGISTRO:
        {
            if(!response)
                Kick(playerid);
               
            else // Botгo registrar
            {
                if(strlen(inputtext) < 5 || strlen(inputtext) > 32)
                {
                    SendClientMessage(playerid, -1, "A senha deve conter entre 5 e 32 caracteres noob.");
                    Kick(playerid);
                }
                else
                {
                    // Registrando o jogador
                   
                    // Formatando a consulta
                    mysql_format(conexao, consulta, "INSERT INTO `jogadores` (`nome`,`senha`) VALUES ('%s','%s')", nome, inputtext);
                   
                    // Traduzindo
                    // INSIRA EM jogadores (nome, senha) valores (nome (nome do jogador), inputtext (o que foi digitado))
                   
                    // Executando a consulta
                    mysql_function_query(conexao, consulta, false, "", "");
                   
                    // Nгo precisamos obter nenhum resultado na consulta, logo, nгo precisamos de callback.
                    // Portanto, no parвmetro onde ficou, por exemplo, ProcurarUsuario, na OnPlayerConnect, basta deixar ""
                    // Mesma coisa para os especificadores, que vem logo apуs a callback, nгo usaremos callback, muito menos parametros, logo: ""
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{FFFFFF}Login", "{FFFFFF}Faзa login", "Login", "Cancelar");
                }
            }
        }
        case DIALOG_LOGIN:
        {
            if(!response)
                Kick(playerid);
               
            else // Botгo login
            {
                // Agora vamos ao login
                // Faremos uma consulta para o nome e a senha
                mysql_format(conexao, consulta, "SELECT * FROM `jogadores` WHERE `nome` = '%e' AND `senha` = '%e'", nome, inputtext);
               
                // Traduzindo
                // SELECIONE TUDO de jogadores AONDE nome = nome(variavel) E senha = inputtext (o que foi digitado)
               
                // Executando a consulta
                // Precisaremos de uma callback pois precisaremos obter o resultado por cache
                mysql_function_query(conexao, consulta, true, "FazerLogin", "i", playerid);
            }
        }
    }
    return 1;
}

// Declarando a callback FazerLogin

forward FazerLogin(playerid);
public FazerLogin(playerid)
{
    // Declarando as variбveis para a obtenзгo de linhas e campos da consulta
    new
        linhas,
        campos;
       
    // Obtendo os dados
    cache_get_data(linhas, campos, conexao);
   
    // Caso nгo hajam resultados
    if(!linhas)
    {
        // Senha incorreta
        SendClientMessage(playerid, -1, "Senha errada noob.");
        Kick(playerid);
    }
    else // Resultados encontrados, senha correta!
    {
        Login[playerid] = true;
        // Outras funзхes de login
    }
    return 1;
}


Bem, sei que posso ter falhado em agradar a todos com o tutorial, mas й o primeiro
tуpico do gкnero por mim criado, e espero que possam aprender algo com ele,
Peзo que digam em que posso melhorar para futuros tutoriais. Obrigado.

Crйditos:

- Pedro Miranda - Tutorial
- BlueG - MySQL Plugin

Atй.
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)