Szerző Téma: Lekérdezés  (Megtekintve 1866 alkalommal)

Nem elérhető Lömpi

  • 1257
    • Profil megtekintése
Lekérdezés
« Dátum: 2017. Május 21. - 19:46:03 »
0
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)

 
 

Nem elérhető Enigma

  • 391
    • Profil megtekintése
Lekérdezés
« Válasz #1 Dátum: 2017. Május 21. - 19:55:55 »
0

SELECT * FROM vehicles WHERE id = ?, id

 
https://wiki.multitheftauto.com/wiki/DbQuery

Nem elérhető Xenius

  • 668
    • Profil megtekintése
Lekérdezés
« Válasz #2 Dátum: 2017. Május 21. - 20:01:06 »
0
A -1es dbPoll-al csak saját magad szúrod tökön (ha az van). Használj callbacket mindig

Nem elérhető Lömpi

  • 1257
    • Profil megtekintése
Lekérdezés
« Válasz #3 Dátum: 2017. Május 21. - 20:26:57 »
0
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.. :\\

Nem elérhető Enigma

  • 391
    • Profil megtekintése
Lekérdezés
« Válasz #4 Dátum: 2017. Május 21. - 20:34:04 »
0
Idézetet írta: Enigma date=1495389355


   

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.

Nem elérhető id100

  • 903
    • Profil megtekintése
Lekérdezés
« Válasz #5 Dátum: 2017. Május 21. - 20:35:08 »
0
row[\'érték\'] kezelést is tudok adni amint a saját gépem közelében leszek.

Nem elérhető Lömpi

  • 1257
    • Profil megtekintése
Lekérdezés
« Válasz #6 Dátum: 2017. Május 21. - 21:45:28 »
0
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

 
 

Lekérdezés
« Válasz #7 Dátum: 2017. Május 21. - 22:37:08 »
+2
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

 
 

Nem elérhető Lömpi

  • 1257
    • Profil megtekintése
Lekérdezés
« Válasz #8 Dátum: 2017. Május 22. - 09:35:33 »
0
Idézetet írta: dugasz1 date=1495399028


   
      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 :(
« Utoljára szerkesztve: 2017. Május 22. - 10:03:09 írta Lömpi »

Lekérdezés
« Válasz #9 Dátum: 2017. Május 22. - 10:37:08 »
0
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.

Nem elérhető Lömpi

  • 1257
    • Profil megtekintése
Lekérdezés
« Válasz #10 Dátum: 2017. Május 22. - 12:49:16 »
0
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

 
 
« Utoljára szerkesztve: 2017. Május 22. - 12:51:30 írta Lömpi »

Lekérdezés
« Válasz #11 Dátum: 2017. Május 22. - 13:41:00 »
0
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)

Nem elérhető Lömpi

  • 1257
    • Profil megtekintése
Lekérdezés
« Válasz #12 Dátum: 2017. Május 22. - 13:55:56 »
0
Idézetet írta: dugasz1 date=1495453260


   
      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

Lekérdezés
« Válasz #13 Dátum: 2017. Május 22. - 14:06:49 »
0
Oké nem gond. Küldj egy TS ipt.

Nem elérhető Lömpi

  • 1257
    • Profil megtekintése
Lekérdezés
« Válasz #14 Dátum: 2017. Május 22. - 14:20:09 »
0
Ment az üzenet!

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal