local db_host = \"127.0.0.1\" local db_username = \"root\" local db_password = \"\" local db_table = \"mtascript\"local db_port = \"3306\"local connection = falsefunction connect()connection = dbConnect(\"mysql\",\"dbname=\"..db_table..\";host=\"..db_host..\";port=\"..db_port..\";unix_socket=/var/run/mysqld/mysqld.sock\",db_username,db_password)if (connection) then outputDebugString(\"Sikeresen felcsatlakoztál!\") createTable() return trueelse outputDebugString(\"Hibás csatlakozás!\",1)endendaddEventHandler(\"onResourceStart\",resourceRoot,connect)function createTable()execute(\"CREATE TABLE IF NOT EXISTS vehiclesystem (id INT AUTO_INCREMENT PRIMARY KEY , model INT , tulaj TEXT , xp REAL, yp REAL , zp REAL)\")endfunction Create(player,command,model)if tonumber(model) and tonumber(model) >= 400 and tonumber(model) < 609 then outputChatBox(\"Jármű elkészült sikeresen!\") local vx,vy,vz = getElementPosition(player) local theCar = createVehicle(model,vx,vy,vz) local theOwner = getPlayerName(player) warpPedIntoVehicle(player,theCar, 0) execute(\"INSERT INTO vehiclesystem (model,tulaj,xp,yp,zp) VALUES (?,?,?,?,?)\", getElementModel(theCar), theOwner, vx , vy , vz)else outputChatBox(\"400-609 közötti modelszám a megengedett!\",player)endendaddCommandHandler(\"spawn-v\", Create)function check()if (connection) thenlocal queryHandle = dbQuery ( connection, \"SELECT id FROM vehiclesystem \")local result, num = dbPoll(queryHandle, -1)if #result > 0 then for _, rows in ipairs(result) do outputDebugString(tulajname) endendendend addCommandHandler(\"check\", check)
SELECT * FROM vehicles WHERE id = ?, id
SELECT * FROM vehicles WHERE id = ?, id https://wiki.multitheftauto.com/wiki/DbQuery
local db_host = \"127.0.0.1\" local db_username = \"root\" local db_password = \"\" local db_table = \"mtascript\"local db_port = \"3306\"local connection = falselocal vehs = {}function connect()connection = dbConnect(\"mysql\",\"dbname=\"..db_table..\";host=\"..db_host..\";port=\"..db_port..\";unix_socket=/var/run/mysqld/mysqld.sock\",db_username,db_password)if (connection) then outputDebugString(\"Sikeresen felcsatlakoztál!\") createTable() return trueelse outputDebugString(\"Hibás csatlakozás!\",1)endendaddEventHandler(\"onResourceStart\",resourceRoot,connect)function createTable()execute(\"CREATE TABLE IF NOT EXISTS vehiclesystem (id INT AUTO_INCREMENT PRIMARY KEY , model INT , tulaj TEXT , xp REAL, yp REAL , zp REAL)\")endfunction Create(player,command,model)if tonumber(model) and tonumber(model) >= 400 and tonumber(model) < 609 then outputChatBox(\"Jármű elkészült sikeresen!\") local vx,vy,vz = getElementPosition(player) local theCar = createVehicle(model,vx,vy,vz) local theOwner = getPlayerName(player) warpPedIntoVehicle(player,theCar, 0) execute(\"INSERT INTO vehiclesystem (model,tulaj,xp,yp,zp) VALUES (?,?,?,?,?)\", getElementModel(theCar), theOwner, vx , vy , vz)else outputChatBox(\"400-609 közötti modelszám a megengedett!\",player)endendaddCommandHandler(\"vcre\", Create)function LoadVehicles()local vehicles = dbQuery(connection, \"SELECT * FROM vehiclesystem\") for i, v in pairs (vehicles) do local newvehicle = createVehicle(v.model,v.xp,v.yp,v.zp) table.insert(vehs,newvehicle) setElementData(newvehicle,\"Tulajdonos\",v.tulaj) setElementData(newvehicle,\"Modellszama\",v.model)endoutputDebugString ( #vehicles..\" jármű elhelyezve a rendszer segítségével\" )endaddEventHandler(\"onResourceStart\",resourceRoot,LoadVehicles) addCommandHandler(\"getvdata\",function(player,command,vid) if(vid == nil) then if(vid == \"\") then local tuj = getElementData(vid,\"Tulajdonos\") local mosz = getElementData(vid,\"Modellszama\") outputChatBox(\"Tulajdonos: \"..tuj..\" Modellszáma: \"..mosz\"\", player) end endend) function singleQuery(str,...)if (connection) then local query = dbQuery(connection,str,...) local result = dbPoll(query,-1) if (type(result == \"table\")) then return result[1] else return result endelse return falseendendfunction execute(str,...)if (connection) then local query = dbExec(connection,str,...) return queryelse return falseendend
local qh = dbQuery( connection, \"SELECT * FROM table_name\" ) --Elküldi a lekérést és már megy is a következő parancsra a Lualocal result = dbPoll( qh, -1 ) --Itt meg azt mondjuk neki -1 tehát addig várjon míg nincs válasz a fenti lekérdezésre ezért itt várni fog a script --Callback:function aaa() dbQuery( myCallback, connection, \"SELECT * FROM table_name\" ) --Ugyan azt csinálja mint előbb csak megadtunk neki egy callback funkciót outputChatBox(\"Elment a lekérés\") --Kiírja ezt endfunction myCallback(qh)--Megérkezett a válasz kapott előbb egy callback funkciót úgyhogy meg is hívja ezt local result = dbPoll( qh, 0 ) --0 Mert tudjuk hogy már megvan a válasz, result változóban ott is vannak az adatok amiket lekértünk.end
Az a baj, hogy nincs dbPoll. A dbQuery annyit csinál, hogy elküld egy parancsot a MySql szervernek. (Nem tudom mennyire tudod mik azok az adatbázisok ezért leírom kb, az adatbázisok az adatok tárolásában keresésében nyújtanak segítséget. Sok féle adatbázis van az egyik ilyen a MySql. A legtöbb adatbázist SQL nyelven \"programozod\", igazából csak parancsokat adsz neki hogy mentsd le ezt keresd ki azt stb) Tehát fut-fut a scripted egyszer csak kell neki valami adat az adatbázisból. Ez akár viszonylag sok időt is felemészthet míg kikeres valamit. Ami nem jó, mert nem akarjuk hogy a script futása egyszer csak megálljon és várjon az adatra, mert ilyenkor nem tud csinálni semmit a scripted csak vár. Ezért találták ki úgy hogy meg lehessen ilyen callbackesen hívni. A callback csak annyi, hogy egy adat lekérdezéshez pl nálad a kocsik lekérdezéséhez hozzárendelsz egy függvényt amit majd akkor kell meghívni az MTAnak, ha választ kapott az adatbázistól megvannak a kocsik lehet őket használni. Ezért ketté szedték a lekérdezést két függvénybe: dbQuery - csak felküldi a parancsot a MySql nek és a visszatérési értéke egy handler (amit csak egy azonosító csak így nevezik. Mivel lehet hogy egyszerre több lekérésre is vár az MTA, ezért meg kell tudni különböztetni melyik melyik olyan kb mint egy id) dbPoll - ez dolgozza fel a tényleges választ és a visszatérési értéke egy tábla amit lekérdeztünk. Úgy van elkészítve hogy első bemenete egy handler, hogy melyik lekérést adatait dolgozza fel 2. bemenete pedig, hogy mit meddig várjon ha az a bizonyos lekérés még nem tért vissza semmivel nincs adat még amit feldolgozzon. (A -1 jelenti, hogy addig várjon amíg meg nem jön a válasz)ű És mivel a callback csak akkor hívódik meg ha már van válasz ezért ott lehet mondani a dbPollnak hogy meddig várjon -> 0 msig hisz tudjuk hogy már megvan a válasz.
function aaa() dbQuery( myCallback, connection, \"SELECT * FROM vehiclesystem\" ) outputDebugString(\"info: aaaa\") endaddCommandHandler(\"adat\",aaa)function myCallback(qh) local result = dbPoll( qh, 0 ) for i=1, #result do for column, value in pairs ( row) do outputDebugString ( column .. \" : \"..value ) end end end
for i,v in ipairs(result) dooutputChatBox(i..\"-edik sornal tartok\")outputChatBox(\"Kocsi tulaja:\"..result[\"tulaj\"] end
vehIDs[ row.vehicleID ] = newvehiclevehs[ vehicle ] = { vehicleID = row.vehicleID, ownerID = row.tulaj, engine = row.engine, allapot = row.allapot,benzin = row.benzin, rX = row.xp, rY = row.yp,rZ = row.zp,rtX = row.txp,rtY = row.typ,rtZ = row.tzp }
Error: table index is nil
function saveAll()for key, vehicle in ipairs( getElementsByType( \"vehicle\" ) ) do if ( getElementData( vehicle, \"vehicleID\" )) then local carX, carY, carZ = getElementPosition( vehicle ) local carRotX, carRotY, carRotZ = getElementRotation( vehicle ) local carHealth = getElementHealth( vehicle ) local carFuel = getElementData( vehicle, \"Benzin\" ) local engine = getVehicleEngineState ( vehicle ) local c1,c2,c3 = getVehicleColor(vehicle) local kulcsa = getElementData(vehicle,\"Kulcs\") local zar = getElementData(vehicle,\"Zarva\") execute(\"UPDATE `vehiclesystem` SET xp = \'\".. carX ..\"\', yp = \'\".. carY ..\"\', zp = \'\".. carZ ..\"\', txp = \'\".. carRotX ..\"\', typ = \'\".. carRotY ..\"\', tzp = \'\".. carRotZ ..\"\', c1 = \'\".. c1 ..\"\',c2 = \'\".. c2 ..\"\',c3 = \'\".. c3 ..\"\',locked = \'\".. zar ..\"\',kulcs = \'\".. kulcsa ..\"\', allapot = \'\".. carHealth ..\"\', benzin = \'\".. carFuel ..\"\', engine = \'\".. engine ..\"\'\") outputDebugString(vehicle..\" elmentve az adatbázisba\") endendend
Elsőnél az a baj hogy vagy row.vehicleID vagy a vehcile változód nil. Az pedig nem lehet az indexe egy táblának. Index csak szám, szöveg és userdata lehet (booleanba nem vagyok biztos de talán az is) A 2-nál meg nem tudom, hogy hol bukik el de valószínűleg a getElementData-nal falseval tér vissza. Lehet elfelejtetted set-elni az elementDatát. (Majd ha már menni fog a dolog rendesen, akkor érdemes lesz optimalizálni egy kicsit rajta, mert sok kocsinál ez megfoghatja a szervert. Érdemes lenne majd külön \"threadra\" pakolni van rá egy könyvtár)