[Ajuda] SQLite
#1

Comeзei a usar esse sistema hoje e entгo ainda estou aprendendo pois antes eu armazenava os dados do jogador em .ini usando a Include DOF2, entгo procurando no forum eu achei esse sistema aqui https://sampforum.blast.hk/showthread.php?tid=364392 um sistema de registrar e logar em SQLite e partir dele eu criei o meu sistema de login e registro e depois adaptei ao meu gamemode principal
PHP код:
#include <a_samp>
new DB:Contas;
#define D_Login (0)
#define D_Registro (1)
main()
{
    print(
"SQL BASE - STARTED! 20");
}
public 
OnGameModeInit()
{
    
Contas db_open("contas.db");
    return 
1;
}
public 
OnGameModeExit()
{
    return 
1;
}
public 
OnPlayerRequestClass(playeridclassid)
{
    
Autenticar(playerid);
    return 
1;
}
public 
OnPlayerConnect(playerid)
{
    return 
1;
}
public 
OnPlayerDisconnect(playeridreason)
{
    
SalvarUsuario(playerid);
    return 
1;
}
public 
OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    new 
DBResult:ResultQuery[120];
    if(
dialogid == D_Login)
    {
        if(
response)
        {
            
format(Querysizeof(Query), "SELECT * FROM `Usuarios` WHERE `Nome` = '%s' AND `Senha` = '%s'"DB_Escape(PegarNome(playerid)), DB_Escape(inputtext));
            
Result db_query(ContasQuery);
            if(
db_num_rows(Result))
            {
                
CarregarUsuario(playerid);
                
SpawnPlayer(playerid);
            }
            
db_free_result(Result);
        }
        else 
Kick(playerid);
    }
    if(
dialogid == D_Registro)
    {
        if(
response)
        {
            if(
strlen(inputtext) < || strlen(inputtext) > 10) { ShowPlayerDialog(playeridD_RegistroDIALOG_STYLE_INPUT"[Register]""Your pass must be bigger than 5 and smaller than 10 characters.""Register""Cancel"); }
            else
            {
                
format(Querysizeof(Query), "INSERT INTO `Usuarios` (`Nome`, `Senha`, `Dinheiro`) VALUES ('%s','%s','1000')"DB_Escape(PegarNome(playerid)), DB_Escape(inputtext));
                
db_query(ContasQuery);
                
ShowPlayerDialog(playeridD_LoginDIALOG_STYLE_PASSWORD"[Login]""Your Account has been sucessfully Created!\nInsert your Password to Login.""Login""Cancel");
            }
        }
    }
    return 
1;
}
stock Autenticar(playerid)
{
    
    new 
Query[120], DBResult:Result;
    
format(Querysizeof(Query), "SELECT * FROM `Usuarios` WHERE `Nome` = '%s'"DB_Escape(PegarNome(playerid)));
    
Result db_query(ContasQuery);
    if(
db_num_rows(Result)) ShowPlayerDialog(playeridD_LoginDIALOG_STYLE_PASSWORD"[Login]""Account Status: Registred\nInsert your Password to Login!""Login""Cancel");
    else 
ShowPlayerDialog(playeridD_RegistroDIALOG_STYLE_INPUT"[Register]""Account Status: Unregistred\nInsert a Password to Register!""Register""Cancel");
    
db_free_result(Result);
    return 
1;
}
stock SalvarUsuario(playerid)
{
    new 
Query[120];
    
format(Querysizeof(Query), "UPDATE `Usuarios` SET Dinheiro = %i"GetPlayerMoney(playerid));
    
db_query(ContasQuery);
    return 
1;
}
stock CarregarUsuario(playerid)
{    
    new 
Dados[30], DBResult:ResultQuery[120];
    
format(Querysizeof(Query), "SELECT * FROM `Usuarios` WHERE `Nome` = '%s'"DB_Escape(PegarNome(playerid)));
    
Result db_query(ContasQuery);
    
db_get_field_assoc(Result,"Dinheiro"Dadossizeof(Dados)), GivePlayerMoney(playeridstrval(Dados));
    return 
1;
}
stock PegarNome(playerid)
{
    new 
name[MAX_PLAYER_NAME];
    
GetPlayerName(playeridnameMAX_PLAYER_NAME);
    return 
name;
}
stock DB_Escape(text[])
{
    new
    
ret[80 2],
    
ch,
    
i,
    
j;
    while ((
ch text[i++]) && sizeof (ret))
    {
        if (
ch == '\'')
        {
            if (
sizeof (ret) - 2)
            {
                
ret[j++] = '\'';
                
ret[j++] = '\'';
            }
        }
        else if (
sizeof (ret))
        {
            
ret[j++] = ch;
        }
        else
        {
            
j++;
        }
    }
    
ret[sizeof (ret) - 1] = '\0';
    return 
ret;

porem eu estou tendo alguns problemas e eu gostaria que alguem me ajudasse, entгo eu nгo sei se й algum problema no script acima ou й algum problema no Database, o que acontece й que quando eu entro no servidor com uma conta tudo funciona perfeitamente, consigo efetuar o cadastro eo login e quando eu relogo no servidor os dados ficam salvos certinhos, o problema й que quando eu entro com outra conta, os dados da conta anterior exceto a senha sгo setados na conta atual e vice-versa, entгo nгo sei se o problema й no database ou no script

OBS: O Database abaixo й da minha outra gamemode onde eu adaptei o sistema acima e estou tendo problemas

Database anexado abaixo \/
Reply
#2

PHP код:
format(Querysizeof(Query), "UPDATE `Usuarios` SET Dinheiro = %i"GetPlayerMoney(playerid)); 
voce esqueceu de especificar qual player...

WHERE `Nome` = '%s'

nao precisas mais disto DB_Escape

nas versoes mais recente do samp tens o %q se nao estou em erro.
Reply
#3

Quote:
Originally Posted by PT
Посмотреть сообщение
PHP код:
format(Querysizeof(Query), "UPDATE `Usuarios` SET Dinheiro = %i"GetPlayerMoney(playerid)); 
voce esqueceu de especificar qual player...

WHERE `Nome` = '%s'

nao precisas mais disto DB_Escape

nas versoes mais recente do samp tens o %q se nao estou em erro.
Obrigado, tinha esquecido

porйm eu ainda estou com problema, talvez seja pq eu nгo sei configurar o database, se possнvel pode dar uma olhada no mesmo que foi anexado acima ?, agora o problema й que nгo estб reconhecendo a senha apуs efetuar o cadastro ou login, abaixo estб o sistema adaptado ao meu gamemode atual, alguma coisa errada nele?

PHP код:
stock Autenticar(playerid)
{
    
    new 
Query[120], DBResult:Result;
    
format(Querysizeof(Query), "SELECT * FROM `Usuarios` WHERE `Nome` = '%s'"DB_Escape(PegarNome(playerid)));
    
Result db_query(ContasQuery);
    if(
db_num_rows(Result)) ShowPlayerDialog(playeridD_LoginDIALOG_STYLE_PASSWORD"[Login]""Account Status: Registred\nInsert your Password to Login!""Login""Cancel");
    else 
ShowPlayerDialog(playeridD_RegistroDIALOG_STYLE_INPUT"[Register]""Account Status: Unregistred\nInsert a Password to Register!""Register""Cancel");
    
db_free_result(Result);
    return 
1;
}
stock SalvarUsuario(playerid)
{
    new 
Query[200];
    
GetPlayerPos(playeridpInfo[playerid][pX], pInfo[playerid][pY], pInfo[playerid][pZ]);
    
format(Querysizeof(Query), "UPDATE `Usuarios` WHERE `Nome` = '%s' SET \ 
    Fome = %i, Sede = %i, Vida = %f, Headshots = %i, Murders = %i, Bandits = %i, Reputation = %i, Slots = %i, SlotsUsados = %i, UsandoKPCT = %i, UsandoGPS = %i, X = %f, Y = %f, Z = %f"
PegarNome(playerid),
    
pInfo[playerid][pFome], pInfo[playerid][pSede], pInfo[playerid][pVida], pInfo[playerid][pHeadshots], pInfo[playerid][pMurders], pInfo[playerid][pBandits], pInfo[playerid][pReputation],
    
pInfo[playerid][pSlot], pInfo[playerid][pSlotUsed], pInfo[playerid][pUsandoKPCT], pInfo[playerid][pUsandoGPS], pInfo[playerid][pX], pInfo[playerid][pY], pInfo[playerid][pZ]);
    
db_query(ContasQuery);
    
SaveInventory(playerid);
    return 
1;
}
stock CarregarUsuario(playerid)
{   
    new 
Dados[30], DBResult:ResultQuery[120];
    
format(Querysizeof(Query), "SELECT * FROM `Usuarios` WHERE `Nome` = '%s'"DB_Escape(PegarNome(playerid)));
    
Result db_query(ContasQuery);
    
db_get_field_assoc(Result,"Fome"Dadossizeof(Dados)), pInfo[playerid][pFome] = strval(Dados);
    
db_get_field_assoc(Result,"Sede"Dadossizeof(Dados)), pInfo[playerid][pSede] = strval(Dados);
    
db_get_field_assoc(Result,"Vida"Dadossizeof(Dados)), pInfo[playerid][pVida] = floatstr(Dados);
    
db_get_field_assoc(Result,"Headshots"Dadossizeof(Dados)), pInfo[playerid][pHeadshots] = strval(Dados);
    
db_get_field_assoc(Result,"Murders"Dadossizeof(Dados)), pInfo[playerid][pMurders] = strval(Dados);
    
db_get_field_assoc(Result,"Bandits"Dadossizeof(Dados)), pInfo[playerid][pBandits] = strval(Dados);
    
db_get_field_assoc(Result,"Reputation"Dadossizeof(Dados)), pInfo[playerid][pReputation] = strval(Dados);
    
db_get_field_assoc(Result,"Slots"Dadossizeof(Dados)), pInfo[playerid][pSlot] = strval(Dados);
    
db_get_field_assoc(Result,"SlotsUsados"Dadossizeof(Dados)), pInfo[playerid][pSlotUsed] = strval(Dados);
    
db_get_field_assoc(Result,"UsandoKPCT"Dadossizeof(Dados)), pInfo[playerid][pUsandoKPCT] = strval(Dados);
    
db_get_field_assoc(Result,"UsandoGPS"Dadossizeof(Dados)), pInfo[playerid][pUsandoGPS] = strval(Dados);
    
db_get_field_assoc(Result,"X"Dadossizeof(Dados)), pInfo[playerid][pX] = floatstr(Dados);
    
db_get_field_assoc(Result,"Y"Dadossizeof(Dados)), pInfo[playerid][pY] = floatstr(Dados);
    
db_get_field_assoc(Result,"Z"Dadossizeof(Dados)), pInfo[playerid][pZ] = floatstr(Dados);
    
LoadInventory(playerid);
    return 
1;


@edit


PHP код:
if(dialogid == D_Login)
    {
        if(
response)
        {
            
format(Querysizeof(Query), "SELECT * FROM `Usuarios` WHERE `Nome` = '%s' AND `Senha` = '%s'"DB_Escape(PegarNome(playerid)), DB_Escape(inputtext));
            
Result db_query(ContasQuery);
            if(
db_num_rows(Result))
            {
                
pInfo[playerid][pConectado] = true;
                
CarregarUsuario(playerid);
                
SpawnPlayer(playerid);
                
FomeTimer[playerid] = SetTimerEx("DiminuirFome"120000true"i"playerid);
                
SedeTimer[playerid] = SetTimerEx("DiminuirSede"60000true"i"playerid);
                
WeaponTimer[playerid] = SetTimerEx("AtualizarArma"1000true"i"playerid);
                
LimparChat(playerid80);
            }
            else
            {
                
ShowPlayerDialog(playeridD_LoginDIALOG_STYLE_PASSWORD"[Login]""Account Status: Registred\nInsert your Password to Login!""Login""Cancel");
                
SendClientMessage(playerid, -1"[SERVER]: Invalid Password!, try again! (You have 3 chances before get Kicked).");
                
Tentativas[playerid]++;
                if(
Tentativas[playerid] == 3Kick(playerid);
            }
            
db_free_result(Result);
        }
        else 
Kick(playerid);
    }
    if(
dialogid == D_Registro)
    {
        if(
response)
        {
            if(
strlen(inputtext) < || strlen(inputtext) > 10) { ShowPlayerDialog(playeridD_RegistroDIALOG_STYLE_INPUT"[Register]""Your pass must be bigger than 5 and smaller than 10 characters.""Register""Cancel"); }
            else
            {
                
format(Querysizeof(Query), "INSERT INTO `Usuarios` (`Nome`, `Senha`) VALUES ('%s','%s')"DB_Escape(PegarNome(playerid)), DB_Escape(inputtext));
                
db_query(ContasQuery);
                
ShowPlayerDialog(playeridD_LoginDIALOG_STYLE_PASSWORD"[Login]""Your Account has been sucessfully Created!\nInsert your Password to Login.""Login""Cancel");
                
pInfo[playerid][pMorreu] = true;
                
            }
        }
    } 
Reply
#4

Cara nao te vou dizer que estou 100% certo...

Porem nunca vi essa instruзгo ser realizada com essa ordem:

PHP код:
"UPDATE `Usuarios` WHERE `Nome` = '%s' SET \  
    Fome = %i, Sede = %i, Vida = %f, Headshots = %i, Murders = %i, Bandits = %i, Reputation = %i, Slots = %i, SlotsUsados = %i, UsandoKPCT = %i, UsandoGPS = %i, X = %f, Y = %f, Z = %f" 
Porem se eu tiver errado outros membros que tambem saibam SQL que me corrigam.

Sempre foi o que vi:

UPDATE tabela SET coluna=valor WHERE algo=valor;

estude aqui:

https://sampforum.blast.hk/showthread.php?tid=262417
https://sampforum.blast.hk/showthread.php?tid=449536
Reply
#5

Quote:
Originally Posted by PT
Посмотреть сообщение
Cara nao te vou dizer que estou 100% certo...

Porem nunca vi essa instruзгo ser realizada com essa ordem:

PHP код:
"UPDATE `Usuarios` WHERE `Nome` = '%s' SET \  
    Fome = %i, Sede = %i, Vida = %f, Headshots = %i, Murders = %i, Bandits = %i, Reputation = %i, Slots = %i, SlotsUsados = %i, UsandoKPCT = %i, UsandoGPS = %i, X = %f, Y = %f, Z = %f" 
Porem se eu tiver errado outros membros que tambem saibam SQL que me corrigam.

Sempre foi o que vi:

UPDATE tabela SET coluna=valor WHERE algo=valor;

estude aqui:

https://sampforum.blast.hk/showthread.php?tid=262417
https://sampforum.blast.hk/showthread.php?tid=449536
Vou tentar arrumar aqui, comeзei a mecher com SQL hoje entгo tudo й novo pra min e Obrigado pela Ajuda, porйm ainda estou com algumas dъvidas nas definiзхes das tabelas no database
Reply
#6

Consegui arrumar o problema do servidor nгo reconhecer a senha, sу troquei isso

PHP код:
"UPDATE `Usuarios` WHERE `Nome` = '%s' SET \   
    Fome = %i, Sede = %i, Vida = %f, Headshots = %i, Murders = %i, Bandits = %i, Reputation = %i, Slots = %i, SlotsUsados = %i, UsandoKPCT = %i, UsandoGPS = %i, X = %f, Y = %f, Z = %f" 
por isso

PHP код:
"UPDATE `Usuarios` SET \   
    Fome = %i, Sede = %i, Vida = %f, Headshots = %i, Murders = %i, Bandits = %i, Reputation = %i, Slots = %i, SlotsUsados = %i, UsandoKPCT = %i, UsandoGPS = %i, X = %f, Y = %f, Z = %f WHERE `Nome` = '%s'" 
sу que os dados nгo estгo salvando apуs sair do servidor http://prntscr.com/9k4ixt ,talvez seja algum problema no database porйm eu nгo entendo muito sobre databases e talvez possa ter configurado algo errado
Reply
#7

Vocк nгo fechou o db.

db_close
Reply
#8

Notei que sua tabela nгo possui uma coluna primбria, portanto execute as seguintes consultas:

PHP код:
"ALTER TABLE `Usuarios` AUTO_INCREMENT = 1" 
PHP код:
"ALTER TABLE `Usuarios` ADD `id` INT(11) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`);" 
Agora teste novamente. Uma dica й trabalhar com o id ъnico dos jogadores, й mais otimizado fazer consultas assim.

OBS: Nгo sei se essas consultas sгo compatнveis com SQLite.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)