Tabelle in Datenbank in eine Tabelle auf MTA Server

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Tabelle in Datenbank in eine Tabelle auf MTA Server

    Moinsen,
    Ich würde gerne mehrere Daten aus einer Datenbank in eine Tabelle machen

    Also in der Datenbank stehen folgendes:

    UIDItem_Name
    Item_SpezItem_AnzIID
    1CK110
    1sda
    111

    Ich würde gerne den Output
    1,CK,1,1,0
    und
    1,sda,1,1,1
    haben.
    Ich bin momentan echt am verzweifeln :( ?(
    Code:

    LUA-Quellcode: inv_s.lua

    1. local query = dbQuery( dbhandler, 'SELECT IID FROM inventar WHERE UID=?', 1)
    2. local result1, num_rows = dbPoll( query, -1 )
    3. local rt = result1[1]
    4. for k,v in pairs(result1[1]) do
    5. print(#result1)
    6. print(k)
    7. print(v)
    8. local query1 = dbQuery( dbhandler, 'SELECT Item_Name FROM inventar WHERE IID=?', v)
    9. local result2, num_rows2 = dbPoll( query1, -1 )
    10. local query2 = dbQuery( dbhandler, 'SELECT Item_Spez FROM inventar WHERE IID=?', v)
    11. local result3, num_rows3 = dbPoll( query2 , -1 )
    12. local query3 = dbQuery( dbhandler, 'SELECT Item_Anz FROM inventar WHERE IID=?', v)
    13. local result4, num_rows4 = dbPoll( query3, -1 )
    14. inventar.Item_Name[v] = tostring(result2)
    15. inventar.Item_Spez[v] = tostring(result3)
    16. inventar.Item_Anz[v] = tostring(result4)
    17. end
    18. for k1,v1 in pairs(inventar.Item_Name) do
    19. print(k1..","..v1)
    20. end
    21. for k2,v2 in pairs(inventar.Item_Spez) do
    22. print(k2..","..v2)
    23. end
    24. for k3,v3 in pairs(inventar.Item_Anz) do
    25. print(k3..","..v3)
    26. end
    Alles anzeigen
    Und ich bekomme als output immer:
    0, table: 0x3b3ecc0
    0, table : usw....
    0, table: usw...

    Also wie bekomme ich a) Beide Spalten ausgegeben und b) die Werte angezeigt statt den tabellen?

    Entweder seh ich den Wald vor lauter Bäumen nicht oder der Code oben ist völliger mist.

    Vielen Dank im vorraus und verurteilt mich nicht, habe mit MySQL an sich noch nicht viel gearbeitet in Lua.
  • Wenn ich das richtig sehe (lange nix mehr mit MTA gemacht) sieht das für mich so aus als ob v deine Spalten beinhaltet.

    Mal versucht über v zu "iteraten"? also:

    LUA-Quellcode

    1. for k2, v2 in ipairs(v) do
    2. end



    Du gehst ja nur einmal alle Rows durch. Nicht aber die Columns..

    Also result wäre ungefähr folgendes:

    LUA-Quellcode

    1. result = {
    2. [1] = {
    3. UID = 0,
    4. ID = 1,
    5. Item_Spez = 0,
    6. Item_Anz = 256,
    7. Item_Name = "Hello"
    8. },
    9. [2] = {
    10. UID = 0,
    11. ID = 2,
    12. Item_Spez = 0,
    13. Item_Anz = 128,
    14. Item_Name = "World"
    15. }
    16. }
    Alles anzeigen

    PS:
    Wieso speicherst du die Item namen in der Datenbank Inventar? Wäre es nicht besser und einfacher die Namen in einer XML oder LUA Datei zu lagern und dann sowas wie so zu machen?

    LUA-Quellcode

    1. ItemNames = {
    2. [1] = "Coca Cola Drink",
    3. [2] = "Sprite",
    4. [3] = "Weed",
    5. [4] = "Keys"
    6. }
    7. local itemId = 2
    8. print(ItemNames[itemId])
    Damit müsstest du nicht x mal den selben Eintrag in der Datenbank haben, welcher unnötig dort ist

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Sub_tixx ()

  • Jannik schrieb:

    Moinsen,
    Entweder seh ich den Wald vor lauter Bäumen nicht oder der Code oben ist völliger mist.
    Das letztere.

    Wenn du DB Zeugs lernen willst, guck einfach hier rein:
    github.com/emre1702/Vio-Extend…62c1ee0abcc48ae576aaa1c37


    Also ...

    1. UID = "unique ID"
    UID sollte eigentlich etwas sein, was einzigartig ist und auf genau ein "Element"/Eintrag hinweist (z.B. auf einen Spieler, ein Geschäft, ein Chatlog-Eintrag usw.)
    Die ID sollte man als 1. Spalte nutzen.
    Wahrscheinlich ist bei dir die IID die eigentliche UID/ID hier und UID ist die UID vom Spieler, richtig?
    Dann nenn die lieber ordentlich, sonst kommt man schnell durcheinander.

    2. Arbeite mit so wenig Queries wie möglich.
    Du hast hier 4x dbQuery und dbPoll genutzt, das ist nicht gut.

    3. Arbeite bei dbQuery so oft wie möglich mit Callbacks.
    So, wie du das gemacht hast, wird das serverseitige geblockt, bis die Ergebnisse von der Datenbank gekommen sind (da Singlethreaded).

    LUA-Quellcode

    1. --[[ sehr einfach gemachte Funktion, um eben "1,CK,1,1,0" einfach ausgeben zu können ]]
    2. local function tableJoin(tabl, order)
    3. local str = "";
    4. for i=1, #order do
    5. str = str .. tabl[order[i]]..", "
    6. end
    7. return string.sub(str, 1, -3)
    8. end
    9. --[[ Callback, blockt daher nicht ]]
    10. local function getItemsInInventar(qh)
    11. local result = dbPoll(qh,0)
    12. local order = {"UUID", "Item_Name", "Item_Spez", "Item_Anz", "IID"}
    13. --[[ Es könnte auch sein, dass gar keine Einträge drin sind, also lieber checken ]]
    14. if result and result[1] then
    15. for i=1, #result do
    16. local data = result[i]
    17. local IID = data["IID"]
    18. inventar.Item_Name[IID] = data["Item_Name"]
    19. inventar.Item_Spez[IID] = data["Item_Spez"]
    20. inventar.Item_Anz[IID] = data["Item_Anz]
    21. print(tableJoin(data, order))
    22. end
    23. end
    24. end
    25. ...
    26. dbQuery( getItemsInInventar, dbhandler, 'SELECT * FROM inventar WHERE UID=1')
    27. ...
    Alles anzeigen

    Edit:
    sub_tixx hat mit dem Namen recht.
    Besser wäre es, wenn es eine einzelne Tabelle mit den ganzen Items mit ID und Namen stehen würden.
    Dann hier nicht mehr Item_Name reinschreiben, sondern eben die ID des Items.
    Dann haste da 3 IDs - die vom Eintrag, die vom Spieler und die vom Item.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Gelöschter Benutzer ()