-
Halihó skacok! Nagyon rég jártam már itt, és örülnék ha valaki megtudná mondani hogyan is tudom lekérni a dolgok mysql adatbázisból? Elkezdtem írni egy rendszert addig oké, hogy létrehozza adatbázist, a játékban sikerül is lekérnem a járművet, be is teszi adatbázisba.. de hogyan tovább?, hogy tudok lekérni dbPoll segítségével? Táblából, sorokat és hozzájuk tartozó értékeket? Igazából az utolsó funkció ami nem igazán érthető számomra, pedig csak tesztelgetem.. hogy tényleg miként is kérjek le adatokat. Ha valaki segítene, akkor hálával tartozom :)
local db_host = \"127.0.0.1\"
local db_username = \"root\"
local db_password = \"\"
local db_table = \"mtascript\"
local db_port = \"3306\"
local connection = false
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 true
else
outputDebugString(\"Hibás csatlakozás!\",1)
end
end
addEventHandler(\"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)\")
end
function 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)
end
end
addCommandHandler(\"spawn-v\", Create)
function check()
if (connection) then
local 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)
end
end
end
end
addCommandHandler(\"check\", check)
-
SELECT * FROM vehicles WHERE id = ?, id
https://wiki.multitheftauto.com/wiki/DbQuery
-
A -1es dbPoll-al csak saját magad szúrod tökön (ha az van). Használj callbacket mindig
-
Kérlek titeket, mutassatok példákat rá nekem, hogy tudnám lekérni a sorokat a scriptemben, és a sorokhoz tartozó értékeket, komolyan nem tudnám már megszámolni, hányszor olvastam át a db-s wikipedia oldalakat, egyszerüen nem jövök rá.. igazából elég sok mindennel elboldogulok de ez leizzaszt.. :\\
-
SELECT * FROM vehicles WHERE id = ?, id
https://wiki.multitheftauto.com/wiki/DbQuery
Itt egy példa. dbQuery(conn, \"SELECT * FROM vehicles WHERE id = ?\", id)
Ez kiválaszt minden értéket abból a sorból aminek az idje a megadott id.
-
row[\'érték\'] kezelést is tudok adni amint a saját gépem közelében leszek.
-
Próbálkozom, próbálkozom :\\ de egyszerűen nem jövök rá, hogy csináljam :\\\\
LoadVehicles-t megirtam [ami jött...igazából nem is biztos hogy jó sőt.. ] nem müködik.. bementi adatbázisba a dolgokat simán de utana mar nem spawnolja le.. :\\ aztán a getvdata-val is probálkoztam de az se igazán jött össze.. bemásolom most a teljes kódot.
local db_host = \"127.0.0.1\"
local db_username = \"root\"
local db_password = \"\"
local db_table = \"mtascript\"
local db_port = \"3306\"
local connection = false
local 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 true
else
outputDebugString(\"Hibás csatlakozás!\",1)
end
end
addEventHandler(\"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)\")
end
function 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)
end
end
addCommandHandler(\"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)
end
outputDebugString ( #vehicles..\" jármű elhelyezve a rendszer segítségével\" )
end
addEventHandler(\"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
end
end
)
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
end
else
return false
end
end
function execute(str,...)
if (connection) then
local query = dbExec(connection,str,...)
return query
else
return false
end
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.
local qh = dbQuery( connection, \"SELECT * FROM table_name\" ) --Elküldi a lekérést és már megy is a következő parancsra a Lua
local 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
end
function 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.
Nagyon szépen köszönöm ezt a magyarázatot, nagyon szépen leírtad, és most így meg is értettem, a különbséget.. viszont még mindig nem tudom, hogy osszem el az eredményt azaz a \"result\" lokális változót , sorokra, és értékekre :\\
function aaa()
dbQuery( myCallback, connection, \"SELECT * FROM vehiclesystem\" )
outputDebugString(\"info: aaaa\")
end
addCommandHandler(\"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
Valamiért nem az igazi :(
-
A result egy tábla és egy tábla igazából több tömbből áll.
Tehát címezhetnéd úgy is az értékeit hogy: result[sor][érték] pl.: result[10][\"tulaj\"] így a 10. lekért sorból kiveszed azt az értéket (oszlopot) aminek az a neve hogy tulaj. Persze ez nálad biztos már de az a lényeg hogy első mindig a sor 2. pedig az oszlop ami ugyan olyan nevet kap mint a mysql tábládban vannak oszlop nevek.
De persze legegyszerűbben ipairs al mehetsz rajtuk végig. (Vagy pairs is jó mint kettű működik itt):
for i,v in ipairs(result) do
outputChatBox(i..\"-edik sornal tartok\")
outputChatBox(\"Kocsi tulaja:\"..result[\"tulaj\"]
end
Annyival másabb így hogy az ipairs automatukusan veszi a sorokat a táblából és az i mindig az index tehát hanyadik sor, a v pedig egy sornak a tömbje, tehát abba van a sor összes oszlopa amivel dolgozhatsz.
-
Köszönöm szépen, most már tényleg sokat jutottam előre! Már sikeresen betölti a járműveket a szerverre, viszont most kaptam egy errort erre a két sorra címezve
vehIDs[ row.vehicleID ] = newvehicle
vehs[ 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 }
ezt a LoadVehicle résznél próbáltam irogatni, hogy ElementData-val tudjam kezelgetni az adatokat.. [természetesen local vehIDs = {} és local vehs = {} ottvannak a scriptem elején]
Az error a következő volt
Error: table index is nil
na meg próbáltam a Globális mentést, hogy minden autót ami van szerveren mentse le. de igazából játék közben nem reagál rá semmit hiába csináltam neki parancsot..
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\")
end
end
end
-
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)
-
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)
Esetleg ha van egy kis időd rám, esetleg egy 10 perced egy TS-szobában tudnál pár említést tenni nekem erről? Nem szeretnék az agyadra menni tényleg, csak én is szeretnék biztosra menni
-
Oké nem gond. Küldj egy TS ipt.
-
Ment az üzenet!