28.06.2012, 19:22
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.
Agora, vamos а definiзгo dos dados da conexгo:
Estes dados estгo sujeitos а alteraзхes, entгo coloquei os padrхes.
Agora vamos ao sistema:
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й.
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>
pawn Код:
#define HOSTNAME "localhost"
#define USERNAME "root"
#define DATABASE "samp"
#define PASSWORD ""
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й.