[Tutorial] Criando um sistema em MySQL

23 de dez. de 2012.

Tutorial: Entendendo o uso de MYSQL; Criando o seu sistema básico.


Criei esse tutorial a pedido de Pedro Miranda, espero que gostem e que entendam o BÁSICO da criação de sistemas em MYSQL, até porque não é um tutorial que irá lhe deixar FODÃO, e sim a curiosidade, você aprende procurando, fuçando. 
Eu particulamente aprendi mysql para provar para mim mesmo e algumas pessoas, que com um pouco de tempo eu posso sim aprender esse banco de dados, umas pessoas falavam que eu não sabia e tudo mais, provei para essas pessoas que eu 'aprendi'.

Espero que gostem, com ele você irá aprender a criar um UCP ( user control panel ) integrado com o banco de dados do seu servidor (RE:Banco de Dados).

MySQL, significado:
Primeiramente MYSQL não é uma línguagem de programação e sim um banco de dados.
Definição:
O MySQL é um sistema de gerenciamento de banco de dados (SGBD), que utiliza a linguagem SQL (Linguagem de Consulta Estruturada, do inglês Structured Query Language) como interface. É atualmente um dos bancos de dados mais populares, com mais de 10 milhões de instalações pelo mundo.

MySQL: Programas necessários para a execução 
Para rodar o MYSQL no seu computador, existem alguns programas necessários, são esses:
Última versão do XAMP (http://bit.ly/o2qXyZ) - ( um dos melhores programas, recomendo! )

Esse plugin para a execução do seu primeiro gamemode.



Após ter feito o download dos programas, vamos para a parte do gamemode. Para qualquer gamemode em MYSQL, será obrigatório o uso das includes e do plugin.
pawn Code:
#include <a_samp> #include <a_mysql>

Okay, feito as includes, vamos para as definições de Login na database, é de suma importância que você tenha criado a database no wamp.
, a parte que lhe interessa é apenas a do banco de dados - criando-o; os da tables não lhe interessam!!! 
pawn Code:
#define mysql_host "127.0.0.1" //Será na verdade o IP da database do host que o samp irá conectar; #define mysql_user "root" //Usúario da database #define mysql_password "" //Não possui senha caso seja o wamp. #define mysql_database "sa-mp" //DATABASE QUE VOCÊ CRIOU ACIMA!

Existem meios rápidos para a criação do banco de dados sem que você usúario , dê o trabalho de ir no phpmyadmin e criar, irei mostrar logo abaixo.
pawn Code:
public OnGameModeInit() {     mysql_connect(mysql_host, mysql_user, mysql_database, mysql_password); //Usando as definições acima..     mysql_query("CREATE TABLE IF NOT EXISTS pinfo(user VARCHAR(24), password VARCHAR(40), score INT(20), dinheiro INT(20), IP VARCHAR(16) )");     //CAMPOS:     //--        Nome - Use - Tipo -------     //USER - Nome do usuario - String!     //password- Senha do usuario - String!     //score - score(auto explicativo) - int     //dinheiro - dinheiro do jogador - int     //IP - ip do cara - int     return 1; }
CREATE TABLE IF NO EXISTS pinfo - Para leigos que não sabem inglês:
CRIE A TABLE pinfo CASO NAO EXISTA (...); (Uma tradução "mais ou menos" apenas para o seu entendimento).

Após conectar-se ao banco de dados, vamos verificar napublic OnPlayerConnect, se o jogador possui uma conta no banco de dados pInfo. Vamos criar uma variavel global 'dinheiro' para que dê o dinheiro do banco de dados do jogador; As funções usadas abaixo são:
mysql_query //usada para inserir alguma ação no banco de dados
mysql_fetch_field_row //Retira os '|' do banco de dados
mysql_num_rows //Conta a quantidade de tables 
mysql_store_result //Armazena o resultado
mysql_free_result. //Libera o resultado
Para selecionar algo do banco de dados usa-se SELECT; para atualizar usa-se UPDATE;


pawn Code:
new pRegistrado[MAX_PLAYERS]; //Usado para checar se o jogador está registrado new pDinheiro[MAX_PLAYERS]; //Usado apra dar o dnheiro do jogador. public OnPlayerConnect(playerid) {     pDinheiro[playerid] = 0x0; //Reseta a variavel pDinheiro.     new query[200], pname[24]; //Cria-se nossas variaveis para serem usadas.     GetPlayerName(playerid, pname, 24); //Recebe o nome do jogador     format(query, sizeof(query), "SELECT IP FROM `pinfo` WHERE user = '%s' LIMIT 1", pname); //Formata a QUERY para serem usadas %s, %i, %d, (basico do basico do pawn.)     mysql_query(query); //Essa é a função da query     mysql_store_result(); //Armazena os resultados     new rows = mysql_num_rows(); //Iremos getar quantas rows a query retornou.     if(!rows)     {         //Se a rows for 0, não encontrou nada                 //Então iremos pedir o registro do jogador no banco de dados.         ShowPlayerDialog(playerid, 15000, DIALOG_STYLE_INPUT, "Registrar","Você não ta registrado, registra aew campeão!","Registrar","Cancelar");     }     if(rows) //SENÃO     {         //Rows = 1 , existe na database         //AUTO LOGIN         new IP[2][16]; //Uma para o IP do banco de dados e uma para o IP do jogador!         mysql_fetch_field_row(IP[0],"IP");         GetPlayerIp(playerid, IP[1], 16);         if(strlen(IP[0]) != 0 && !strcmp(IP[0], IP[1], true)) //Checa se os ips são iguais         {             MySQL_Login(playerid);         }         else if(!strlen(IP[0]) || strcmp(IP[0], IP[1], true))         {             ShowPlayerDialog(playerid, 15500, DIALOG_STYLE_INPUT, "Logar","Tu ta registrado manolo loga eww!","Logar","Cancelar");             pRegistrado[playerid] = 1; //Sets the registered variable to 1 (Shows that the player is registered).         }     }     mysql_free_result();     return 1; }

Agora iremos fazer as responses do dialog.
pawn Code:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {     if(dialogid == 15000)     {         if(response) // Clicou no botão de registrar         {             if(!strlen(inputtext) || strlen(inputtext) > 100)  {//Senha nula ou maior que 100 caractéres             return SendClientMessage(playerid, 0xFF0000, "You must insert a password between 1-100 characters!"),                ShowPlayerDialog(playerid, 15000, DIALOG_STYLE_INPUT, "Registrar","Use uma senha de 1-100 caractéres!","Registrar","Cancelar");             }             else             {                 new escpass[100];                 mysql_real_escape_string(inputtext, escpass);                 MySQL_Register(playerid, escpass);             }             //Registra o player na função MYSQL_Register         }         if(!response)         {                 return SendClientMessage(playerid, 0xFF0000, "You must register before logging in!"),                 ShowPlayerDialog(playerid, 15000, DIALOG_STYLE_INPUT, "Registrar","Insira uma senha manolo","Registrar","Cancelar");         }     }     if(dialogid == 15500)     {         if(!response)         {                 return SendClientMessage(playerid, 0xFF0000, "You must login before you spawn!"),                 ShowPlayerDialog(playerid, 15500, DIALOG_STYLE_INPUT, "Login","Você em que logar antes de jogar cara!!","Logar","Cancelar");         }         if(response) //Clicou em Login         {             new query[200], pname[24], escapepass[100]; //             GetPlayerName(playerid, pname, 24);             mysql_real_escape_string(inputtext, escapepass); //Contra HACKERS! (RE: MySQL Injections             format(query, sizeof(query), "SELECT `user` FROM pinfo WHERE user = '%s' AND password = SHA1('%s')", pname, escapepass);             mysql_query(query);             mysql_store_result();             new numrows = mysql_num_rows();             if(numrows == 1) MySQL_Login(playerid);             //senha do jogador e da database são iguais/\             if(!numrows)             {                 //senha errada                 SendClientMessage(playerid, 0xFF0000, "Senha errada noob!");             }             mysql_free_result(); //LEMBRE-SE DE DAR SEMPRE FREE RESULT PARA LIBERAR O QUERY;         }     }     return 1; }

Agora vamos fazer nossas funções que foram criadas; Nós iremos usar a variavel pLogado para checar se ele está ou não logado, é de suma importancia essa variavel. Já checamos se ele está logado, agora só temos que dar as informações do banco de dados para a conta dele..Iremos usar INSERT INTO, que é INSIRA EM/PARA para a função de registrar.
pawn Code:
new pLogado[MAX_PLAYERS]; stock MySQL_Register(playerid, passwordstring[]) {     new query[200], pname[24], IP[16];     GetPlayerName(playerid, pname, 24);     GetPlayerIp(playerid, IP, 16);     format(query, sizeof(query), "INSERT INTO pinfo (user, password, score, dinheiro, IP) VALUES('%s', SHA1('%s'), 0, 0, '%s')", pname, passwordstring, IP);     mysql_query(query);     SendClientMessage(playerid, -1, "Registrado e Logado.");     pLogado[playerid] = 1; //Logado     return 1; } stock MySQL_Login(playerid) {     new query[300], pname[24], savingstring[20];     GetPlayerName(playerid, pname, 24);     format(query, sizeof(query), "SELECT * FROM pinfo WHERE user = '%s'", pname);     //Selecionamos apenas a variavel que é importante.     mysql_query(query);     mysql_store_result();//ARMAZENA O QUERY PARA USARMOS DEPOIS, POIS USAMOS SELECT PARA SELECIONAR, OU SEJA, TEMOS QUE ARMAZENAR O QUE SELECIONAMOS EM ALGUMA COISA NÉ.     while(mysql_fetch_row_format(query,"|"))     {         //WHILE EM APENAS UMA UNICA QUERY!         //Especialmente quando temos varias variaveis         //Pode-se usar sscanf tmb.         mysql_fetch_field_row(savingstring, "score"); SetPlayerScore(playerid, strval(savingstring));         mysql_fetch_field_row(savingstring, "dinheiro"); GivePlayerMoney(playerid, strval(savingstring));             }     mysql_free_result();     SendClientMessage(playerid, -1, "Logou!");     pLogado[playerid] = 1;     return 1; }
Para salvar as variaveis iremos usar UPDATE, como explicado.

EX...
pawn Code:
UPDATE table_name SET column1=valor, column2='valor',... WHERE algumacoisa=algumvalor

pawn Code:
public OnPlayerDisconnect(playerid, reason) {     if(pLogado[playerid] == 1)     {         new score = GetPlayerScore(playerid); //Armazena o score em uma variavel         new grana = GetPlayerMoney(playerid); //armazena o $$ em uma ' '         new query[200], pname[24]; //Cria as variaveis necessarias..         GetPlayerName(playerid, pname, 24);         format(query, sizeof(query), "UPDATE pinfo SET score=%d, dinheiro=%d WHERE user='%s'", score, grana, pname);         mysql_query(query);         //NÃO NECESSITA-SE DE UM FREE_RESULT EM UMA QUERY DE UPDATE     }     return 1; }
Terminamos o nosso código ! agora você está pronto para iniciar um novo ramo do PAWN, o MYSQL!

Apenas uma coisinha...
pawn Code:
public OnPlayerRequestSpawn(playerid) {     if(!Logged[playerid]) //Caso não esteje logado e tente spawnar....     {         if(!pRegistrado[playerid])  //Caso não esteje registrado         {             ShowPlayerDialog(playerid, 15000, DIALOG_STYLE_INPUT, "Registrar","Registra antes de jogar manolo!","Registrar","Cancelar"); //Mostra nosso dialog             return 0; //Retorna a falso, para q elee nao spawne..         }         if(pRegistrado[playerid] == 1) //.....         {             ShowPlayerDialog(playerid, 15500, DIALOG_STYLE_INPUT, "Logar","Loga ante sde jogar man...!","Logar","Cancelar");                         return 0; // ' '         }     }     return 1; }




Bom espero que vocês tenham entendido, gostado do tutorial, fiz ele com um pouco de carinho(não muito), até porque to um pouco desanimado do sa-mp,, tá muito chato e talz, eu to fazendo meu cursinho técnico em programação e o vestibular estão me ocupando muito tempo da minha vida, mais ainda sim visito e frequento o fórum, continuo programando e tudo mais, até porque sou membro da [iPs] e por isso nunca irei deixar eles , bom como vocês podem ver eu tive um pouco de preguiça no final ahauhhuahuaa , é porque eu to meio cansado agora ( já é de noite..... ).

Caso vocês tenham gostado, me deêm pelo menos um rep+ para que eu me anime a criar a segunda parte do tutorial, que é o de PHP, onde vocês irão aprender a criar sites desse tipo:

Esse servidor não foi projetado, foi apenas algum projeto que eu e o strong estavamos criando mais decidimos não dar continuidade.
O site eu criei do 0 com tutoriais mesmo, usei tables, layouts eu quem criei com muita paciência hauhauha não sou um bom designer.
Script iniciante para quem quer começar com MYSQL:

Clique aqui


Por fim,


Créditos:

[iPs] Ricop522
[iPs] Team (all)

1 comentários:

BRASIL MATA MATA NEW PROJECT disse...

arruma esse display bosta deste forum porra, ta muinto dificil de ler

Postar um comentário