• SQL Help
    6 replies, posted
I am hopeless when it comes to databases, especially when I can't get feedback in the form of errors. [lua] function StoreData(object, ply, value) local r = sql.Query("SELECT "..object.." FROM Players WHERE steam = '" .. sql.SQLStr(ply:SteamID()) .. "';") if r then sql.Query("UPDATE Players SET "..object.." = " .. sql.SQLStr(value) .. " WHERE steam = '" .. sql.SQLStr(ply:SteamID()) .. "';") ply:ChatPrint(sql.Query("SELECT "..object.." FROM Players WHERE steam = '" .. sql.SQLStr(ply:SteamID()) .. "';")) else sql.Query("INSERT INTO Players('steamid', '"..object.."') VALUES('"..sql.SQLStr(ply:SteamID()).."', '"..sql.SQLStr(value).."');") ply:ChatPrint(sql.Query("SELECT "..object.." FROM Players WHERE steam = '" .. sql.SQLStr(ply:SteamID()) .. "';")) end end [/lua] I have this, so I can modularly save data. The only thing is, it doesn't save. I added the ChatPrint stuff to see if it was even saving the data, and it says [ERROR] gamemodes/testing/gamemode/saves.lua:76: attempt to concatenate a nil value I call it as [lua]StoreData("kills", attacker, attacker:Frags())[/lua] What am I doing wrong? Also, that code is probably really inefficient, so how would I make it better?
[lua] function StoreData(object, ply, value) local r = sql.Query("SELECT `"..object.."` FROM `Players` WHERE `steam` = '" .. ply:SteamID() .. "';") if r then sql.Query("UPDATE `Players` SET `"..object.."` = " .. sql.SQLStr(value) .. " WHERE steam = '" .. ply:SteamID() .. "';") else sql.Query("INSERT INTO `Players`(steamid, "..object..") VALUES('"..ply:SteamID().."', '"..sql.SQLStr(value).."');") end end [/lua] steamids are already sql safe [editline]29th September 2013[/editline] also it might help to look into this but its more or less optional [URL="http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html"]http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html[/URL]
[QUOTE=G4MB!T;42343047][lua] function StoreData(object, ply, value) local r = sql.Query("SELECT `"..object.."` FROM `Players` WHERE `steam` = '" .. ply:SteamID() .. "';") if r then sql.Query("UPDATE `Players` SET `"..object.."` = " .. sql.SQLStr(value) .. " WHERE steam = '" .. ply:SteamID() .. "';") else sql.Query("INSERT INTO `Players`(steamid, "..object..") VALUES('"..ply:SteamID().."', '"..sql.SQLStr(value).."');") end end [/lua] steamids are already sql safe [editline]29th September 2013[/editline] also it might help to look into this but its more or less optional [URL="http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html"]http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html[/URL][/QUOTE] Are they supposed to be the little ` gravemarks, or the ' single quotes?
[QUOTE=Ghost_Sailor;42343209]Are they supposed to be the little ` gravemarks, or the ' single quotes?[/QUOTE] Tables and columns use ` and values use '
Escape everything, including SteamIDs. There was a time when SteamIDs could be spoofed, and there's an age-old saying in the computer science world to never trust user-input/data. Because, if something does happen where spoofed SteamIDs happen again, and that segment of your DB is not-protected, and vulnerable to injection exploits, goodbye database! Escape it! You really don't need the `'s for tables / columns. I do use " or 's for data though.
[QUOTE=Acecool;42344772]Escape everything, including SteamIDs. There was a time when SteamIDs could be spoofed, and there's an age-old saying in the computer science world to never trust user-input/data. Because, if something does happen where spoofed SteamIDs happen again, and that segment of your DB is not-protected, and vulnerable to injection exploits, goodbye database! Escape it[/QUOTE] Definitely this. [QUOTE=Acecool;42344772]You really don't need the `'s for tables / columns. I do use " or 's for data though.[/QUOTE] You should, for example in a case where the name of your column conflicts with an SQL keyword.
[QUOTE=EvacX;42345540]Definitely this. You should, for example in a case where the name of your column conflicts with an SQL keyword.[/QUOTE] As long you use table/column prefixes you should be fine.
Sorry, you need to Log In to post a reply to this thread.