Sign in to follow this  
aka Blue

SQLite de nuevo...

Recommended Posts

Estoy creando un sistema de guardado de cuentas en SQLite pero tengo problemas. Con el código a continuación, cuando le doy a registrar, siempre me dice que hay una cuenta ya creada (cuando la .db está vacía) y cuando le doy a loguear, con lo que sea, puedo entrar.

addEventHandler( "onResourceStart", resourceRoot,
	function(  )
		sql = dbConnect ( "sqlite" , "accounts.db" ) -- Create the connection 
		playersTable = dbQuery ( sql , "CREATE TABLE IF NOT EXISTS accounts (account TEXT,password TEXT,serial TEXT)" ) 	
		if fileExists( "accounts.db" ) and sql and playersTable then
			outputDebugString( "Succefully connected SQLite resource" )
		else
			outputDebugString( "Failed to connect SQLite" )
		end
	end
)

function tryRegister( player, username, password )
	if username and password then
		local exists = dbQuery ( sql , "SELECT * FROM accounts WHERE account = ?", username )
		local result = dbPoll( exists, 0 )
		if result then
			triggerClientEvent( player, "loginPanel:executeMessage", player, "Account already exists" )
			return
		else
			local serial = getPlayerSerial( player )
			if serial then
				local qh = dbQuery ( sql , "INSERT INTO accounts (account,password,serial) VALUES (?,?,?)", username, password, serial )
				local result = dbPoll( qh, -1 )
				if result then
					triggerClientEvent( player, "loginPanel:executeMessage", player, "Succefully registered. Welcome" )
					return true
				else
					triggerClientEvent( player, "loginPanel:executeMessage", player, "Error, contact with server admin" )
					return
				end	
			else
				triggerClientEvent( player, "loginPanel:executeMessage", player, "Fatal error. No serial found." )
				return
			end
		end
	else
		triggerClientEvent( player, "loginPanel:executeMessage", player, "Type username and password" )
		return
	end
end

function tryLogin( player, username, password )
	if username and password then
		local exists = dbQuery ( sql , "SELECT * FROM accounts WHERE account = ? AND password = ?", username, password )
		local result = dbPoll( exists, -1 )
		if result then
			local x, y, z = 2272.0419921875, 2354.5302734375, 4.8202133178711
			spawnPlayer( player, x, y, z )
			triggerClientEvent(client, "onClientPlayerLogin", client)
			return true
		else
			triggerClientEvent( player, "loginPanel:executeMessage", player, "Account does not exists" )
			return
		end
	else
		triggerClientEvent( player, "loginPanel:executeMessage", player, "Type username and password" )
		return
	end
end

function performLogin (username, password, type)
	local account = getAccount( username, password )
	if type == "login" then
		tryLogin( client, username, password )
	elseif type == "register" then
		if username and #username > 3 then
			if password and #password > 8 then
				tryRegister( client, username, password )
			else
				triggerClientEvent( client, "loginPanel:executeMessage", client, "Required password characters: 8" )
			end
		else
			triggerClientEvent( client, "loginPanel:executeMessage", client, "Incorrect username. More than 3 characters" )
		end
	elseif type == "leave" then
		kickPlayer ( client, "See you soon (Leaving)" )
	end
end
addEvent("loginPanel:performLogin", true)
addEventHandler("loginPanel:performLogin", root, performLogin )

¿Me echan una mano? No sé como funciona correctamente el dbPoll y demás :S 

PD: Disculpad los dos temas, con el nuevo diseño no puedo borrar :/

Share this post


Link to post

Pasa que estas haciendo mal el debug, fijate bien en los retornos de las funciones que usas. 

En este caso tu hiciste el debug pensando que  dbPoll te retornaría false si no encuentra la data. Pero  dbPoll por lo que leí en la wiki sirve solo para los errores. Ver DbPoll

Para hacer el debug tendrás que comprobar que la tabla retornada este vacía.

 

PD: Estoy viendo que estas trabajando duro en sql, te recomendaría estudiar un poco modelos de datos. Para que tu base de datos sea optima y no tengas que repetir tanta data, es recomendable tener un modelo de datos. 

Share this post


Link to post

Si te soy sincero, no termino de entender correctamente para qué se usa el dbPoll y eso me echa para atrás :/. Como que en un momento funcionó y luego toqué algo y ya no funcionaba... ni idea, la verdad.

Share this post


Link to post

Yo hace un tiempo estuve practicando sql en mta para crear un login panel, y no use dbpoll para nada. Te dejo un codigo que hice:

Quote



test_db = dbConnect( "sqlite", "userData.db" )


function testDB(player)
    local user = getSQLData("login", "007")
    if user then
        outputChatBox(user.getUser())
    else
        local user = login("007", "Bc", "testpw")
        setSQLData("login", user)
        testDB()
    end
    removeSQLData("login", user) 
end
addCommandHandler ( "a", testDB)

sql = executeSQLQuery
sql "CREATE TABLE IF NOT EXISTS login(Serial TEXT, Username TEXT, Password TEXT)"

--[[sql "CREATE TABLE IF NOT EXISTS player(Username TEXT NOT NULL,
                                      Rango TEXT NOT NULL,
                                      Exp TEXT NOT NULL,
                                      Money TEXT NOT NULL"]]

function setSQLData(tabla, data)
    local query
    if tabla == "login" then
        query = sql("SELECT * FROM login WHERE Serial=?", data.getSerial())
        if query and type(query) == "table" and #query == 1 then
            sql("UPDATE login SET Username=?, Password=?  WHERE Serial=?", data.getUser(), data.getPass(), data.getSerial())
        else
            sql("INSERT INTO login(Serial, Username, Password) VALUES(?, ?, ?)", data.getSerial(), data.getUser(), data.getPass())
        end
    end
    return true
end
 
function getSQLData(tabla, data)
    local query = sql("SELECT * FROM login WHERE Serial=?", data)
    if query and type(query) == "table" and #query == 1 then
        return login(query[1]["Serial"],query[1]["Username"],query[1]["Password"])
    end
    return false
end
 
function removeSQLData(tabla, data)
    return sql("DELETE FROM login WHERE Serial=?", data.getSerial())
end

function login(serial, username, password)
    if not serial or not username or not password then
        return false
    end

    self = {serial=serial, username=username, password=password}

    local getSerial = function() return self.serial end
    local getUser = function() return self.username end
    local getPass = function() return self.password end

    --[[local setSerial = function(v) return self.serial = v end
    local setUser = function(v) return self.username = v end
    local setPass = function(v) return self.password = v end]]
    
    return {getSerial=getSerial, getUser=getUser, getPass=getPass}
end

 

 


PD: No recuerdo si esto realmente funciona, pero te lo muestro para que te hagas una idea de que hay mas maneras de trabajar con sql

Share this post


Link to post
Quote

NOTE: This function only acts upon registry.db. Use dbQuery to query a custom SQL databse

:S 

Share this post


Link to post

Me leí correctamente el uso de cada función de db y ya lo entendí mucho mejor y fixeé el sistema con un pequeño check, éste:

local exists = dbQuery ( sql , "SELECT * FROM accounts WHERE account = ?", username )
local result = dbPoll( exists, -1 )
if result and #result > 0 then
	outputChatBox( "Account exists" )
else
  	outputChatBox( "Account does not exists, adding to database..." )
end

Lo comparto por si alguien llega a tener un error parecido. Básicamente el poll lo que hace es esperar una respuesta de la base de datos, obtenida, realizamos una condicional, la cual comprueba si existe el valor en la tabla. En caso de que esté en 'blank' o 'nil', la registra.

Gracias @Bc#, de todos modos.

Share this post


Link to post
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.