aka Blue Posted September 7, 2016 Share Posted September 7, 2016 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 PD: Disculpad los dos temas, con el nuevo diseño no puedo borrar Link to comment
Bc# Posted September 7, 2016 Share Posted September 7, 2016 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. Link to comment
aka Blue Posted September 7, 2016 Author Share Posted September 7, 2016 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. Link to comment
Bc# Posted September 7, 2016 Share Posted September 7, 2016 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 Link to comment
aka Blue Posted September 7, 2016 Author Share Posted September 7, 2016 Quote NOTE: This function only acts upon registry.db. Use dbQuery to query a custom SQL databse Link to comment
Bc# Posted September 7, 2016 Share Posted September 7, 2016 Supongo que creaste el archivo userdata.db Link to comment
aka Blue Posted September 7, 2016 Author Share Posted September 7, 2016 No, no, no uso ese sistema. Esa nota sale en la wiki, sobre executeSQLQuery. Link to comment
aka Blue Posted September 8, 2016 Author Share Posted September 8, 2016 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. Link to comment
Recommended Posts