[Ajuda] Sistema de Login MySQL (Nгo Salva)
#1

E aн pessoal, resolvi estudar MySQL para ver se consigo aprender, ai eu vi este tutorial de um Sistema de Login em MySQL, quando fui testar ele nгo estб funcionando corretamente. Ele atй cria a tabela e tals, mas quando o player faz o registro ou desloga do servidor, ele nгo salva os dados do player, alguйm pode me ajudar?

Sistema de Login: https://sampforum.blast.hk/showthread.php?tid=579909

Cуdigo:
PHP Code:
#include <a_samp>
#include <a_mysql>
#define DIALOG_REGISTRO     1
#define DIALOG_LOGIN     2
new MySQL:IDConexao// Variavel responsavel pela ID da conexгo com o host
enum pInfo // enumerador com variaveis necessarias para nosso salvamento.
{
    
pID,
    
pNome[24],
    
pIP[26],
    
pSenha[20],
    
pLevel,
    
pDinheiro,
    
pSkin,
    
pMatou,
    
pMorreu,
    
pAdmin,
    
bool:pLogado
};
new 
PlayerInfo[MAX_PLAYERS][pInfo];
#define HOST      "localhost" // IP de acesso ao phpmyadmin no caso se voce estiver hospedando no pc deixei localhost
#define USUARIO   "root" // Usuario por padrгo й root
#define DATABASE  "samp" // nome da database que voce criou.. como explicao no video acima
#define SENHA     ""   // nгo possue senha caso tenha usado o wamp
main(){}
public 
OnGameModeInit()
{
    
IDConexao mysql_connect(HOSTUSUARIOSENHADATABASE); // faremos a conexгo ao host com as informaзхes definidas acima
    
mysql_query(IDConexao"CREATE TABLE IF NOT EXISTS `Contas`(`ID`int AUTO_INCREMENT PRIMARY KEY, `Nome`varchar(24) NOT NULL,`Senha` varchar(20) NOT NULL,`Level` int(20) NOT NULL,`Matou` int(10) NOT NULL,`Morreu` int(10) NOT NULL,`Skin` int(10) NOT NULL,`Admin` int(10) NOT NULL,`Dinheiro` int(20) NOT NULL)"false);
    if(
mysql_errno(IDConexao) != 0// Ultilizo essa maneira para saber se a conexгo foi bem sucedida ou nгo
    
{
        print(
"Falha na conexгo ao banco de dados Mysql");
        } else {
        print(
"Conexгo ao banco de dado Mysql efetuada com sucesso");
    }
    return 
1;
}
public 
OnGameModeExit()
{
    for(new 
0MAX_PLAYERSi++) SalvarDados(i); // Realizamos um loop na funзгo Funзгo SalvarDados para q salve todas as contas numa posivel queda do servidor
    
mysql_close(IDConexao); // Aqui fechamos a conexгo com o host
    
return 1;
}
public 
OnPlayerConnect(playerid)
{
    
GetPlayerName(playeridPlayerInfo[playerid][pNome], 24); // Pegamos o nome do player somente uma vez quando se conectar e formatamos na variavel.
    
GetPlayerIp(playeridPlayerInfo[playerid][pIP], 26); // Mesma coisa no IP
    
new Query[90]; // criamos uma variavel com 90 celulas
    
mysql_format(IDConexaoQuerysizeof(Query), "SELECT `Senha`, `ID` FROM `Contas` WHERE `Nome`='%s'"PlayerInfo[playerid][pNome]); // formatamos a Query selecionando SENHA e ID referente a tabela Contas Linha (NOME)
    
mysql_tquery(IDConexaoQuery"VerificarContas""i"playerid); // Faremos a consulta se a linha "Nome" existe sim ou nгo
    // Usaremos mysql_tquery para realizar a consulta na tabela e enviar o resultado para a callback.
    // o resultado sera enviado para callback VerificarContas
    
return 1;
}
forward VerificarContas(playerid);
public 
VerificarContas(playerid)
{
    new 
Dialog[240]; // Variavel para as dialogs com 240 celulas necessarias
    
if(cache_num_rows() > 0// aqui o resultado da consulta da OnPlayerConnect
    
{// Se a linha for maior que 1 "existir" ira chamar a dialog de login
        
cache_get_value(0"Senha"PlayerInfo[playerid][pSenha], 20); // Pegamos o valor da tabela e setamos a variavel pSenha que sera necessaria para o login
        
format(Dialogsizeof(Dialog),"{F8F8FF}Bem Vindo(a) Ao Servidor {058AFF}%s{F8F8FF}\n\nVocк ja tem uma Conta registrada\n\nDigite sua senha para Logar\n\nStatus: {1E90FF}Registrado{F8F8FF}\n\nIP: {058AFF}%s"PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
        
ShowPlayerDialog(playeridDIALOG_LOGINDIALOG_STYLE_PASSWORD"Registro"Dialog"Logar""Cancelar");
        } else { 
// se a linha nгo existir sera chamada a dialog de registro
        
format(Dialogsizeof(Dialog),"{F8F8FF}Bem Vindo(a) Ao Servidor {058AFF}%s{F8F8FF}\n\nVocк nгo tem uma Conta registrada\n\nDigite uma senha para Registrar\n\nStatus: {058AFF}N/A Registrado{F8F8FF}\n\nIP: {058AFF}%s"PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
        
ShowPlayerDialog(playeridDIALOG_REGISTRODIALOG_STYLE_PASSWORD"Registro"Dialog"Registrar""Cancelar");
    }
    return 
1;
}
public 
OnPlayerDisconnect(playeridreason)
{
    
SalvarDados(playerid); // Chamamos a funзгo para salvar a conta do player que desconectar
    
return 1;
}
public 
OnPlayerDeath(playeridkilleridreason)
{
    
PlayerInfo[playerid][pMorreu]++; // se o player morrer ira acrescentar +1 na variavel de morte
    
PlayerInfo[killerid][pMatou]++; // se o player matar ira acrescentar +1 ...
    
return 1;
}
public 
OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    switch(
dialogid// usaremos um switch para as dialogs
    
{
        case 
DIALOG_REGISTRO:
        {
            if(!
response) return Kick(playerid); // se clicar em cancelar na dialog registro ira kickar o jogador
            
if(strlen(inputtext) < || strlen(inputtext) > 20// se a senha tiver menos de 4 ou mais de 20 caracteres ira retornar a dialog
            
{
                
SendClientMessage(playerid, -1"ERRO:{FFFFFF} A senha deve conter de 4 a 20 caracteres!");
                new 
Dialog[240]; // variavel da dialog registro
                
format(Dialogsizeof(Dialog),"{F8F8FF}Bem Vindo(a) Ao Servidor {058AFF}%s{F8F8FF}\n\nVocк nгo tem uma Conta registrada\n\nDigite uma senha para Registrar\n\nStatus: {058AFF}N/A Registrado{F8F8FF}\n\nIP: {058AFF}%s"PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
                
ShowPlayerDialog(playeridDIALOG_REGISTRODIALOG_STYLE_PASSWORD"Registro"Dialog"Registrar""Cancelar");
                } else { 
// se nгo conter entre 4 e 20 caracteres ira retornar ao registro
                
new Query[100]; // variavel com 100 celulas para inserir as informaзхes de registro na tabela
                
mysql_format(IDConexaoQuerysizeof(Query), "INSERT INTO `Contas`(`Nome`, `Senha`) VALUES ('%s', '%s')"PlayerInfo[playerid][pNome], inputtext); // formatamos a query para inserir na tabela do banco de dados
                
mysql_tquery(IDConexaoQuery"DadosRegistrados""i"playerid); // fazemos a consulta e enviamos o resultado para a callback DadosRegistrados
                // enviamos para a callback DadosRegistrados para fazer uma especia de  DEBUG, e tambem para darmos uma ID para a conta no banco de dados
                
RegistrarDados(playerid); // chamamos a funзгo RegistrarDados para adicionar os valores nas variaveis do player
            
}
        }
        case 
DIALOG_LOGIN:
        {
            if(!
response) return Kick(playerid); // se clicar em cancelar na dialog login ira kickar o jogador
            
if(!strlen(inputtext)) // se nгo digitar nada ira retornar.
            
{
                
SendClientMessage(playerid, -1"ERRO:{FFFFFF} Vocк nгo digitou a senha !");
                
ShowPlayerDialog(playeridDIALOG_LOGINDIALOG_STYLE_PASSWORD"Digite sua senha:""Digite sua senha abaixo para logar-se""Logar""Voltar");
                return 
1;
            }
            if(!
strcmp(PlayerInfo[playerid][pSenha], inputtexttrue20)) //comparamos a variavel coma senha do player com a senha digitada
            
// se a comparaзгo for correta vamos realizar a consulta para adicionar os valores contidos na tabela para as variaveis do player.
                
new Query[70];
                
mysql_format(IDConexaoQuerysizeof(Query), "SELECT * FROM `Contas` WHERE Nome='%s'"PlayerInfo[playerid][pNome]);
                
mysql_tquery(IDConexaoQuery"CarregarContas""d"playerid);
                
// Formatamos a Query realizamos a consulta e enviamos o resultado para a callback CarregarContas
                
} else {
                
// comparaзгo sem sucesso ::
                
SendClientMessage(playerid, -1"ERRO:{FFFFFF} Senha incorreta !");
                
ShowPlayerDialog(playeridDIALOG_LOGINDIALOG_STYLE_PASSWORD"Digite sua senha:""Digite sua senha abaixo para logar-se""Logar""Voltar");
            }
        }
    }
    return 
1;
}
forward DadosRegistrados(playerid);
public 
DadosRegistrados(playerid)
{
    
PlayerInfo[playerid][pID] = cache_insert_id(); // Adicionamos o ID da conta do player
    
printf("-> Nova conta registrada ID: %d"PlayerInfo[playerid][pID]); // Printf no samp server para informar que a conta foi registrada com sucesso
    
return 1;
}
forward CarregarContas(playerid);
public 
CarregarContas(playerid)
// Resultado da consulta do login, adicionamos os valores contidos na tabela para as variaveis do player
    
cache_get_value_int(0"ID"PlayerInfo[playerid][pID]);
    
cache_get_value_int(0"Admin"PlayerInfo[playerid][pAdmin]);
    
cache_get_value_int(0"Level"PlayerInfo[playerid][pLevel]);
    
cache_get_value_int(0"Matou"PlayerInfo[playerid][pMatou]);
    
cache_get_value_int(0"Morreu"PlayerInfo[playerid][pMorreu]);
    
cache_get_value_int(0"Skin"PlayerInfo[playerid][pSkin]);
    
cache_get_value_int(0"Dinheiro"PlayerInfo[playerid][pDinheiro]);
    
CarregarDados(playerid); // chamamos a funзгo CarregarDados
    
return 1;
}
stock RegistrarDados(playerid)
{  
//Aqui adicionaremos os valores das variaveis que o player ira inicio no servidor
    
PlayerInfo[playerid][pDinheiro] = 5000// ou seja comeзara com 5000 reais
    
PlayerInfo[playerid][pAdmin] = 0// sem nivel de admin
    
PlayerInfo[playerid][pLevel] = 1// 1 level
    
PlayerInfo[playerid][pSkin] = 0// skin 0 CJ
    
PlayerInfo[playerid][pMorreu] = 0// ....
    
PlayerInfo[playerid][pMatou] = 0// ....
    
CarregarDados(playerid); //chamamos a funзгo CarregarDados
    
return 1;
}
stock CarregarDados(playerid)
// aqui carregaremos os ultimos dados das variaveis
    
PlayerInfo[playerid][pLogado] = true;
    
SetPlayerScore(playeridPlayerInfo[playerid][pLevel]); // setamos o level
    
GivePlayerMoney(playeridPlayerInfo[playerid][pDinheiro]); // o dinheiro
    
SetSpawnInfo(playerid0PlayerInfo[playerid][pSkin], 1958.331343.1215.36269.1500000);
    
SpawnPlayer(playerid); // forзamos o player a spawnar nas cordenas acima com as infos setadas nas variaveis
    
return 1;
}
stock SalvarDados(playerid)
{
    
//if(PlayerInfo[playerid][pLogado] == false) return 1; // se o player nao estiver logado nгo ira salvar nada
    
PlayerInfo[playerid][pDinheiro] = GetPlayerMoney(playerid);
    new 
Query[350]; // variavel com 350 celulas para salvamento
    
mysql_format(IDConexaoQuerysizeof(Query), "UPDATE `Contas` SET `Nome`='%s', `Level`=%d, `Admin`=%d, `Skin`=%d, `Matou`=%d, `Morreu`=%d, `Dinheiro`=%d WHERE `ID`=%d",
    
PlayerInfo[playerid][pNome],
    
PlayerInfo[playerid][pLevel],
    
PlayerInfo[playerid][pAdmin],
    
PlayerInfo[playerid][pSkin],
    
PlayerInfo[playerid][pMatou],
    
PlayerInfo[playerid][pMorreu],
    
PlayerInfo[playerid][pDinheiro],
    
PlayerInfo[playerid][pID]);
    
// formatamos a Query referente a ID da conta (WHERE `ID`=%d) e realizaremos a consulta para atualizar os dados no banco de dados
    
mysql_tquery(IDConexaoQuery"DadosSalvos","d"playerid); // consulta, e enviamos o resultado para a callback DadosSalvos para um DEBUG
    
PlayerInfo[playerid][pLevel] = 0// resetamos as variaveis.
    
PlayerInfo[playerid][pAdmin] = 0;
    
PlayerInfo[playerid][pMatou] = 0;
    
PlayerInfo[playerid][pMorreu] = 0;
    
PlayerInfo[playerid][pDinheiro] = 0;
    
PlayerInfo[playerid][pLogado] = false;
    return 
1;
}
forward DadosSalvos(playerid);
public 
DadosSalvos(playerid) return printf("-> Conta salva ID: %d"PlayerInfo[playerid][pID]); 
Reply
#2

TBM tф aprendendo MySQL to com mesmo problema os dados do player n cria na tabela mas nгo fiquei dando ctrl c + v n :v

TBM queria saber para que serve esse id no caso
PHP Code:
cache_insert_id 
Reply
#3

Manda sua log do mysql.
Reply
#4

Quote:
Originally Posted by AutoMatic2
View Post
TBM tф aprendendo MySQL to com mesmo problema os dados do player n cria na tabela mas nгo fiquei dando ctrl c + v n :v

TBM queria saber para que serve esse id no caso
PHP Code:
cache_insert_id 
Й fбcil falar bosta nй? Para sua informaзгo, eu nгo estou dando Ctrl C + V eu estou analisando esse sistema, tentando entender para que serve cada coisa, para saber como se salva as coisas em MySQL, afinal a gente sу aprende na pratica. ENTГO SE VOCК NГO SABE DE MERDA NENHUMA, NГO ENTRA NO POST PARA FALAR BOSTA ! Por que para julgar aparece uns 20, agora para ajudar sгo poucos.

Quote:
Originally Posted by Cauezin
View Post
Manda sua log do mysql.
Quote:

[06:01:13] [WARNING] mysql_connect: no password specified

Acredito que seja isso mano, ta certo?
Reply
#5

Quote:
Originally Posted by AutoMatic2
View Post
TBM tф aprendendo MySQL to com mesmo problema os dados do player n cria na tabela mas nгo fiquei dando ctrl c + v n :v

TBM queria saber para que serve esse id no caso
PHP Code:
cache_insert_id 
Essa funзгo serve para retornar o valor da row primary auto-incremented que a tabela que vocк possui criou ao gerar um novo registro. Esse valor sempre й ъnico, logo nгo tem como duplica-lo com o INSERT na mesma tabela.
Reply
#6

Quote:
Originally Posted by SmokeKiLL
View Post
Й fбcil falar bosta nй? Para sua informaзгo, eu nгo estou dando Ctrl C + V eu estou analisando esse sistema, tentando entender para que serve cada coisa, para saber como se salva as coisas em MySQL, afinal a gente sу aprende na pratica. ENTГO SE VOCК NГO SABE DE MERDA NENHUMA, NГO ENTRA NO POST PARA FALAR BOSTA ! Por que para julgar aparece uns 20, agora para ajudar sгo poucos.




Acredito que seja isso mano, ta certo?
Veja se hб senha no usuбrio do bd.
Reply
#7

Nгo, o Data Base nгo possui senha.
Reply
#8

nos mysql_format , troque os %s por %e , os %d por %i.

Talvez funcione.
Reply
#9

Cara pistola kkkkkk Sу preciso saber oq cada funзгo faz.

PlayList MySQL

https://www.youtube.com/watch?v=Ofkt...sgvau_ekxg8g1r
Reply
#10

Possivelmente vocк usa o WAMP versгo + 3.0.6.
Se for isso vocк deve criar valor default para as colunas.

Sobre essa warning nгo e nada demais,
esta apenas informando que seu sistema esta sem senha.

Manda seu log do mysql.
Reply
#11

Quote:
Originally Posted by Cleyson
Посмотреть сообщение
Possivelmente vocк usa o WAMP versгo + 3.0.6.
Se for isso vocк deve criar valor default para as colunas.

Sobre essa warning nгo e nada demais,
esta apenas informando que seu sistema esta sem senha.

Manda seu log do mysql.
Vocк estб falando da pasta logs que й criada na pasta Raiz da GM? se for... ta aн.

Arquivo: errors vazio.

log-core:


Код:
[06:11:13] [INFO] received Windows console close event; shutting log-core down
warnings:
Код:
[06:01:13] [plugins/mysql] mysql_connect: no password specified
plugins/mysql
plugins/mysql:
Код:
[06:01:13] [WARNING] mysql_connect: no password specified
Reply
#12

Quote:
Originally Posted by SmokeKiLL
Посмотреть сообщение
Vocк estб falando da pasta logs que й criada na pasta Raiz da GM? se for... ta aн.

Arquivo: errors vazio.

log-core:

Код:
[06:11:13] [INFO] received Windows console close event; shutting log-core down
warnings:
Код:
[06:01:13] [plugins/mysql] mysql_connect: no password specified
plugins/mysql:
Код:
[06:01:13] [WARNING] mysql_connect: no password specified
Posta a plugins/mysql completa, no pastebin , ou aqui mesmo.
Reply
#13

Quote:
Originally Posted by SmokeKiLL
Посмотреть сообщение
Vocк estб falando da pasta logs que й criada na pasta Raiz da GM? se for... ta aн.

Arquivo: errors vazio.

log-core:

Код:
[06:11:13] [INFO] received Windows console close event; shutting log-core down
warnings:
Код:
[06:01:13] [plugins/mysql] mysql_connect: no password specified
plugins/mysql:
Код:
[06:01:13] [WARNING] mysql_connect: no password specified
Sim a plugins/mysql mas manda pelo menos as ultimas 30 linhas ou mais.
Reply
#14

Код:
[06:01:13] [WARNING] mysql_connect: no password specified
[18:32:41] [WARNING] mysql_connect: no password specified
[18:35:33] [ERROR] error #1364 while executing query "INSERT INTO `Contas`(`Nome`, `Senha`) VALUES ('SmokeKiLL', '123')": Field 'Level' doesn't have a default value
Reply
#15

O Campo 'Level' nгo tem um valor padrгo.

PHP код:
mysql_query(IDConexao"CREATE TABLE IF NOT EXISTS `Contas`(`ID`int AUTO_INCREMENT PRIMARY KEY, `Nome`varchar(24) NOT NULL,`Senha` varchar(20) NOT NULL,`Level` int(20) NOT NULL DEFAULT 0,`Matou` int(10) NOT NULL DEFAULT 0,`Morreu` int(10) NOT NULL DEFAULT 0,`Skin` int(10) NOT NULL DEFAULT 0,`Admin` int(10) NOT NULL DEFAULT 0,`Dinheiro` int(20) NOT NULL DEFAULT 0)"false); 
]

Talvez agora funcione.
Reply
#16

Agora funcionou. VLW !
Reply
#17

Quote:
Originally Posted by SmokeKiLL
Посмотреть сообщение
Agora funcionou. VLW !
Como dito no tуpico do tutorial, as versхes atuais do WAMP server necessita que vocк defina um valor padrгo.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)