• Lua SQL Error
    4 replies, posted
Hi, i'm trying to make a code that loads time on player join through a sql database, but i keep getting a really anoying error: [code]autorun/sv.utime:45: attempt to index field '?' <a nil value>[/code] I know whats causing the error (res[1][1]) If the player has a value in the database then it returns their SteamID but if theres no record it returns that error, which is causing the whole script to not to work. I dont need to use this code i just need a code that says 'If SteamID does exist, Load Account else Create Account' Heres the actual script: [lua] if not SERVER then return end require( "tmysql" ) local host = "***" local username = "***" local password = "***" local database = "***" local port = 3306 local connections = 6 local threads = 5 function LoadSQLConnection() Msg("==================================================================\n"); Msg("==================== Initializing SQL Connection =================\n"); Msg("==================================================================\n") tmysql.initialize(host, username, password, database, port, connections, threads) function Query(...) Msg("=== Query Executing === \n") return tmysql.query(...) end function Esc(esc) return tmysql.escape(esc) end function QueryErrors(res,status,error) Error( "Error: " ..error.. "\n") end Msg("========== Connection To SAS SQL Database Established! ===========\n"); Msg("==================================================================\n") end function LoadAccount( ply ) local steamid = Esc(ply:SteamID()) local nick = Esc(ply:Nick()) Query("SELECT * FROM sasserver WHERE SteamID = \'"..tostring(steamid).."\'", function(res,status,error) if !status then Error( "Error: " ..error.. "\n") end local timer = 0 if ( res[1][1] == steamid ) then timer = res[1][3] ply:PrintMessage( HUD_PRINTTALK, "Loaded "..tostring(nick).."'s SAS Profile!" ) end if (res[1][1] != steamid ) then timer = 0 Query("INSERT INTO sasserver ( SteamID, nick, time ) VALUES ( \'"..tostring(steamid).."\', \'"..tostring(nick).."\', \'"..tostring(timer).."\' )", function(result,succ,error2) if !succ then Error( "Error: " ..error2.. "\n") end ply:PrintMessage( HUD_PRINTTALK, "Creating SAS Profile For " ..tostring(nick).."!" ) end ) end ply:SetUTime( timer ) ply:SetUTimeStart( CurTime() ) end ) end function SaveAccount( ply ) local steamid = Esc(ply:SteamID()) local nick = Esc(ply:Nick()) local utime = math.floor(ply:GetUTimeTotalTime()) Query("UPDATE sasserver SET nick = \'"..tostring(nick).."\', time = \'"..tostring(utime).."\' WHERE SteamID = \'"..tostring(steamid).."\'") end function SaveAll() local players = player.GetAll() for _, ply in ipairs( players ) do if ply and ply:IsConnected() then SaveAccount( ply ) end end end timer.Create( "UTimeSaver", 60, 0, SaveAll ) hook.Add( "InitPostEntity", "SASSQLConnect", LoadSQLConnection ) hook.Add( "PlayerInitialSpawn", "SASPlayerSpawn", LoadAccount ) hook.Add( "PlayerDisconnected", "SASPlayerDisconnect", SaveAccount ) [/lua]
Are you sure you're accessing the table the right way? Shouldn't the SteamID be just res[1]? If you're unsure do PrintTable(res) Oh and also you're only accessing the the first entry? And your saving code doesn't seem very consistent. You seem to be using a different structure for loading and updating. May I suggest you use the steamID to index entries, and then associate the name and time to it? So your condition could be resumed as : [lua]for k,v in pairs(res) do if ( k == steamid ) then timer = v[2] ply:PrintMessage( HUD_PRINTTALK, "Loaded "..tostring(nick).."'s SAS Profile!" ) else timer = 0 Query("INSERT INTO sasserver ( SteamID, nick, time ) VALUES ( \'"..tostring(steamid).."\', \'"..tostring(nick).."\', \'"..tostring(timer).."\' )", function(result,succ,error2) //Honestly not sure about this if !succ then Error( "Error: " ..error2.. "\n") end ply:PrintMessage( HUD_PRINTTALK, "Creating SAS Profile For " ..tostring(nick).."!" ) end ) end end[/lua]
Thanks ill test it out, also as for the res[1] thing, if there is a steamid in the database res[1][1] will return the steamid, where as res[1] will return a string of numbers totaly unacosiated with steamid, but if no steamid was found in the database both res[1] and res[1][1] will return errors.
Is that because the table is empty? That's why you must not specify a key. Oh and the code I posted was dumb. [lua] local timer = 0 for k,v in pairs(res) do if ( v[1] == steamid ) then timer = v[3] ply:PrintMessage( HUD_PRINTTALK, "Loaded "..tostring(nick).."'s SAS Profile!" ) end end if timer == 0 then Query("INSERT INTO sasserver ( SteamID, nick, time ) VALUES ( \'"..tostring(steamid).."\', \'"..tostring(nick).."\', \'"..tostring(timer).."\' )", function(result,succ,error2) //Honestly not sure about this if !succ then Error( "Error: " ..error2.. "\n") end ply:PrintMessage( HUD_PRINTTALK, "Creating SAS Profile For " ..tostring(nick).."!" ) end end[/lua] So you check all of they keys for a matching steamID then if none were found you create the record.
It woooookredddd! Thanks!
Sorry, you need to Log In to post a reply to this thread.