[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
#2

уtimo tutorial, vlw cara agora vou usar ele!
Reply
#3

Vou lк-lo com mais atenзгo novamente, porque nгo entendi muito bem, rs'
Bom tutorial!
Reply
#4

Como eu disse, й meu primeiro tutorial, caso nгo entendam algo, postem aqui a parte que nгo entenderam e procurarei ser mais esclarecedor.
Reply
#5

Fico dahora.
Reply
#6

Atualizado

Esqueci de por pra criar a tabela caso nгo exista ao iniciar o script. Feito.
Reply
#7

A unica coisa que nгo gosto desse novo plugin й ter que mandar o cache para uma public, pois eu uso funзхes para retornar dados e com esse novo plugin nгo tem mais como. Mais o tutorial vai ajudar muitos que desejam iniciar com MySql.. Parabйns!
Reply
#8

Obrigado.
Reply
#9

sу lembrando que nгo existe somente 1 plugin mysql.
Reply
#10

Desculpe reviver o tуpico, mas й que estou disposto a aprender MySQL e estou com algumas dъvidas.

Por exemplo, digamos que o meu Sistema de Salvamento й em MySQL e a database estб criada a partir do meu computador.
E se eu quisesse colocar no host, o GameMode iria ler a partir do host a minha database ou nгo teria como?

E se fosse em VPS, eu teria de criar uma nova database no mesmo? (Tф todo enrolado nisso)

Antes de tudo, desculpe a pergunta inъtil. Mas й que quero saber como funciona para depois saber se vale a pena ou nгo aprender.

--

Уtimo tutorial.
Me ajudou entender um pouquinho.

--

Pesquisei no ****** sobre tutoriais MySQL SA-MP e este foi o primeiro tutorial que caiu. D:
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)