Vazern

[AJUDA] Erro em database

Recommended Posts

Olá pessoal! Tudo bem? Espero que sim.

Então, estou fazendo um sistema de uma moeda diferente, que seriam "diamantes", fiz todo o código, ele armazena no banco de dados SQLite normalmente, mas na hora de carregar os dados (no evento onPlayerLogin que utiliza a função que eu fiz {loadDiamonds}) eles simplesmente não são carregados para o element-data.

Poderiam me falar o que fiz de errado?

 

bR1Tm9v.png

 

 

local db = exports.ds_sqlite
db:exec("CREATE TABLE IF NOT EXISTS Diamonds (Nick TEXT, Usuario TEXT, Serial TEXT, Diamantes INT)")


function loadDiamonds(player, acc)
    local accName = getAccountName(getPlayerAccount(player))
    local datas = db:query("SELECT * FROM Diamonds WHERE Usuario=? LIMIT 1", accName)
    if (#datas == 0) then
        setElementData(player, "CRP:Diamonds", 10)
        db:exec("INSERT INTO Diamonds VALUES (?, ?, ?, ?)", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementData(player, "CRP:Diamonds")) 
    else
        db:query("UPDATE Diamonds SET Nick=?, Usuario=?, Serial=?, Diamantes=?", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), datas[4]["Diamantes"])
        setElementData(player, "CRP:Diamonds", tonumber(datas[4]["Diamantes"]))
    end    
end

function saveDiamonds(player, acc)
    if (getElementData(player, "CRP:Diamonds")) then
        local accName = getAccountName(getPlayerAccount(player))
        local datas = db:query("SELECT * FROM Diamonds WHERE Usuario=? LIMIT 1", accName)
        if (#datas > 0) then
            db:query("UPDATE Diamonds SET Nick=?, Usuario=?, Serial=?, Diamantes=?", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementData(player, "CRP:Diamonds"))
        end 
    end
end

addEventHandler("onPlayerLogin", root,
    function()
        for index, players in ipairs(getElementsByType("player")) do
            local account = getPlayerAccount(players)
            loadDiamonds(players, account)
        end
    end
)

addEventHandler("onPlayerQuit", root,
    function()
        for index, players in ipairs(getElementsByType("player")) do
            local account = getPlayerAccount(players)
            if (account) then
                saveDiamonds(players, account)
            end
        end
    end
)

 

Share this post


Link to post

Tenta isto:

function loadDiamonds(player, acc)
	local accName = getAccountName(getPlayerAccount(player))
	local datas = db:query("SELECT * FROM Diamonds WHERE Usuario=? LIMIT 1", accName)
	if (datas and type(datas) == "table" and #datas > 0) then
		datas = datas[1]
		db:query("UPDATE Diamonds SET Nick=?, Usuario=?, Serial=?, Diamantes=?", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), datas["Diamantes"])
		setElementData(player, "CRP:Diamonds", tonumber(datas["Diamantes"]))
	else
		setElementData(player, "CRP:Diamonds", 10)
		db:exec("INSERT INTO Diamonds VALUES (?, ?, ?, ?)", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementData(player, "CRP:Diamonds") or 10)
	end
end

Edit: correção.

Edited by DNL291
  • Thanks 1

Share this post


Link to post

 

24 minutes ago, DNL291 said:

Tenta isto:


function loadDiamonds(player, acc)
	local accName = getAccountName(getPlayerAccount(player))
	local datas = db:query("SELECT * FROM Diamonds WHERE Usuario?=? LIMIT 1", accName)
	if (datas and type(datas) == "table" and #datas > 0) then
		datas = datas[1]
		db:query("UPDATE Diamonds SET Nick=?, Usuario?=?, Serial=?, Diamantes=?", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), datas["Diamantes"])
		setElementData(player, "CRP:Diamonds", tonumber(datas[4]["Diamantes"]))
	else
		setElementData(player, "CRP:Diamonds", 10)
		db:exec("INSERT INTO Diamonds VALUES (?, ?, ?, ?)", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementData(player, "CRP:Diamonds") or 10)
	end
end

 

Obrigado!
Mas ainda continua praticamente a mesma coisa, ele definiu o valor padrão (10), porém, eu alterei este valor, e após isto quando reconectei, ficou salvo no banco de dados, mas ao logar, não é definido valor nenhum, ao utilizar o execute no painel admin ele simplesmente retorna "false".

NOTA: Eu removi o "tonumber" e continua a mesma coisa, o que poderia ser?

11 minutes ago, VazErn said:

 

Obrigado!
Mas ainda continua praticamente a mesma coisa, ele definiu o valor padrão (10), porém, eu alterei este valor, e após isto quando reconectei, ficou salvo no banco de dados, mas ao logar, não é definido valor nenhum, ao utilizar o execute no painel admin ele simplesmente retorna "false".

NOTA: Eu removi o "tonumber" e continua a mesma coisa, o que poderia ser?

Consegui!

Havia esqueci de mudar de datas[4]["Diamantes"] para datas["Diamantes"], rs.

Muito obrigado.

 

Edited by VazErn

Share this post


Link to post
10 minutes ago, VazErn said:

 

Obrigado!
Mas ainda continua praticamente a mesma coisa, ele definiu o valor padrão (10), porém, eu alterei este valor, e após isto quando reconectei, ficou salvo no banco de dados, mas ao logar, não é definido valor nenhum, ao utilizar o execute no painel admin ele simplesmente retorna "false".

NOTA: Eu removi o "tonumber" e continua a mesma coisa, o que poderia ser?

Consegui!

Havia esqueci de mudar de datas[4]["Diamantes"] para datas["Diamantes"], rs.

Muito obrigado.

 

Eu tinha mandado o código com o [4], depois corrigi o erro kk.

E aquele loop nos players no onPlayerLogin? o certo não seria chamar só pra quem logou? E o loop no evento onResourceStart.

Share this post


Link to post
10 minutes ago, DNL291 said:

Eu tinha mandado o código com o [4], depois corrigi o erro kk.

E aquele loop nos players no onPlayerLogin? o certo não seria chamar só pra quem logou? E o loop no evento onResourceStart.

Boa observação. No caso eu faria:

addEventHandler("onPlayerLogin", root,
    function()
        for index, players in ipairs(getElementsByType("player")) do
            if (players == source) then
                local account = getPlayerAccount(players)
                loadDiamonds(players, account)
            end
        end
    end
)

addEventHandler("onPlayerQuit", root,
    function()
        for index, players in ipairs(getElementsByType("player")) do
            if (players == source) then
            local account = getPlayerAccount(players)
                if (account) then
                    saveDiamonds(players, account)
                end
            end
        end
    end
)

Certo?

Share this post


Link to post

Não entendi o propósito do loop aí, se for executar só pro source então mais fácil você tirar o resto que é desnecessário:

addEventHandler("onPlayerLogin", root,
	function()
		loadDiamonds(source)
	end
)
--quit
addEventHandler("onPlayerQuit", root,
	function()
    	if not (isGuestAccount(getPlayerAccount(source))) then
			saveDiamonds(source)
		end
	end
)

 

Share this post


Link to post
24 minutes ago, DNL291 said:

Não entendi o propósito do loop aí, se for executar só pro source então mais fácil você tirar o resto que é desnecessário:


addEventHandler("onPlayerLogin", root,
	function()
		loadDiamonds(source)
	end
)
--quit
addEventHandler("onPlayerQuit", root,
	function()
    	if not (isGuestAccount(getPlayerAccount(source))) then
			saveDiamonds(source)
		end
	end
)

 

Então, é que quando eu altero para source, simplesmente não funciona, por isso o loop.

Em relação ao código do tópico, uma coisa que gostaria de ressaltar, e caso alguém veja isto, talvez sirva de ajuda.

Eu utilizei datas[4] porque pensei que o o índice "4" era a 4° coluna do banco de dados, sendo que um amigo meu (@Blowid) me explicou que se refere a linha do banco de dados, por isso os dados não eram definidos, já que quando eu colocava [4] além do LIMIT 1 não permitir, não havia uma 4° linha de dados para aquele usuário.

Share this post


Link to post

Entendi. Mas deveria funcionar com o source, pode ser que você tenha definido uma variável global com esse mesmo nome e esteja dando conflito.

Sobre o LIMIT 1 ele vai fazer retornar apenas 1 resultado da consulta; e valor do banco de dados, é retornado numa tabela definida com chaves (o datas["Diamantes"] por exemplo).

 

  • Thanks 1

Share this post


Link to post

Eu usaria o programa DB Browser For SQLite para mexer no banco de dados. Outra coisa que eu faria é usar setAccountData pra salvar a quantidade de diamantes na conta do jogador em vez de criar uma tabela nova no banco de dados e getAccountData para obter essa quantidade depois.

Edited by Lord Henry
  • Thanks 1

Share this post


Link to post
10 hours ago, Lord Henry said:

Eu usaria o programa DB Browser For SQLite para mexer no banco de dados. Outra coisa que eu faria é usar setAccountData pra salvar a quantidade de diamantes na conta do jogador em vez de criar uma tabela nova no banco de dados e getAccountData para obter essa quantidade depois.

O salvamento em banco de dados no lugar do setAccountData acho que foi uma escolha dele, em banco de dados pode ser feito um sistema para mostrar os dados fora do server por exemplo.

E o set/get dos diamantes no server está sendo feito com element-data fazendo com que o banco de dados seja utilizado quando é realmente necessário - pelo que eu vejo no código e que está correto em questão de otimização. Embora seja uma forma melhor armazenar temporariamente com tabelas, mas se tiver usando esses dados no lado cliente então não vejo problemas; se não tiver usando esses dados no lado cliente, de fato, o mínimo a se fazer é desativar a sinc no setElementData.

  • Thanks 1

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.