Datenbank wird falsch ausgelesen?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hi,


    ich arbeite an meinem Fraktionssystem. Dieses zieht Daten wie Entrancepickup, usw aus meiner Datenbank(@BlackAce: Wo Datensätze vorhanden sind^^).
    Leider, wird irgendetwas falsch gezogen. Das Entrancepickup ist in jedem Fall (13x) am Nullpunkt. Warum?
    Hier der Code, wo die Frak geladen wird:
    stock LoadFrak(FrakID, str[512])
    {
    sscanf(str,"e<p<|>dddddddddddddds[24]s[24]s[24]s[24]s[24]s[24]s[24]s[24]ddddddddffffffffffffddfff>",FrakInfo[FrakID]);
    printf("FrakID: %d | %s",FrakID,str);
    CreateDynamicPickup(1239,1,FrakInfo[FrakID][fWLiX],FrakInfo[FrakID][fWLiY],FrakInfo[FrakID][fWLiZ],FrakInfo[FrakID][fVW]);
    FrakInfo[FrakID][EntPickup] = CreateDynamicPickup(1318,1,FrakInfo[FrakID][fPosX],FrakInfo[FrakID][fPosY],FrakInfo[FrakID][fPosZ]);
    printf("FrakID: %d | EnterPickup |-> %f %f %f",FrakID,FrakInfo[FrakID][fPosX],FrakInfo[FrakID][fPosY],FrakInfo[FrakID][fPosZ]);
    FrakInfo[FrakID][ExtPickup] = CreateDynamicPickup(1318,1,FrakInfo[FrakID][fIntX],FrakInfo[FrakID][fIntY],FrakInfo[FrakID][fIntZ],FrakInfo[FrakID][fVW]);
    FrakInfo[FrakID][EntLabel] = Create3DTextLabel("Gebäude betreten: Z drücken",COLOR_LIGHTRED,FrakInfo[FrakID][fPosX],FrakInfo[FrakID][fPosY],FrakInfo[FrakID][fPosZ],10,0,0);
    FrakInfo[FrakID][ExtLabel] = Create3DTextLabel("Gebäude verlassen: Z drücken",COLOR_LIGHTRED,FrakInfo[FrakID][fIntX],FrakInfo[FrakID][fIntY],FrakInfo[FrakID][fIntZ],10,FrakInfo[FrakID][fVW],0);
    return 1;
    }
    Wie man sieht, habe ich schon versucht zu debuggen.
    Das kam dabei raus:


    Es geht mir hierbei start um die FrakIDs 1,8,9,10,11,12.
    Denn in der Datenbank haben die alle eine andere Entranceposition als 0.


    Woran liegt das ganze? Jeffry:
    Ich habe das Enum schon 1000x mit der Datenbank abgeglichen, um einen solchen Fehler zu vermeiden.


    lg
    Deagle


    P.S.: Die erste Float, die geladen wird ist die Position des Eingangs.

  • Aus der Datenbank werden die Daten ja geladen, sonst würden sie nicht im str sein. Irgendwas stimmt bestimmt an sscanf wieder nicht, dann kann ich dir aber ohne es zu testen nicht genau sagen.


    Kannst du bitte dein enum und die Variable bzw das Array dazu posten? Dann würde ich es heute Nachmittag wenn ich zu Hause bin kurz bei mir ausprobieren. Oder es kann jemand anderes ausprobieren, falls er/sie früher Zeit hat.

  • Kannst du bitte dein enum und die Variable bzw das Array dazu posten? Dann würde ich es heute Nachmittag wenn ich zu Hause bin kurz bei mir ausprobieren. Oder es kann jemand anderes ausprobieren, falls er/sie früher Zeit hat.


    Posten? Klar hier:
    #define MAX_FRAKS 13
    enum FrakDaten
    {
    fID,
    fKasse,
    fDrogen,
    fMats,
    fGangwaffen,
    fR1L,
    fR2L,
    fR3L,
    fR4L,
    fR5L,
    fR6L,
    fR7L,
    fR8L,
    fWLO,
    fR1N[24],
    fR2N[24],
    fR3N[24],
    fR4N[24],
    fR5N[24],
    fR6N[24],
    fR7N[24],
    fR8N[24],
    fR1S,
    fR2S,
    fR3S,
    fR4S,
    fR5S,
    fR6S,
    fR7S,
    fR8S,
    Float:fWLX,
    Float:fWLY,
    Float:fWLZ,
    Float:fPosX,
    Float:fPosY,
    Float:fPosZ,
    Float:fIntX,
    Float:fIntY,
    Float:fIntZ,
    Float:fWLiX,
    Float:fWLiY,
    Float:fWLiZ,
    fInterior,
    fVW,
    Float:fSpawnX,
    Float:fSpawnY,
    Float:fSpawnZ,
    Text3D:GW,
    Text3D:EntLabel,
    Text3D:ExtLabel,
    EntPickup,
    ExtPickup
    };
    new FrakInfo[MAX_FRAKS][FrakDaten];

  • Welches MySQL Plugin benutzt du denn?


    BlueG R5

    Wo rufst du die Funktion ab?


    Bei OnGameModeInit unter folgendem Code:
    mysql_query("SELECT * FROM `Frak`");
    mysql_store_result();
    new f,str[512];
    while(mysql_fetch_row(str)) {
    LoadFrak(f, str);
    f++;
    }
    mysql_free_result();

    Nutzt du BlueGs Plugin? Wenn ja, mehrere Versionen unterstützen angeblich sscanf nicht.


    Meine tut es aber, da bei mir so gut wie alles mit sscanf aus der DB gezogen wird.

  • Nutzt du BlueGs Plugin? Wenn ja, mehrere Versionen unterstützen angeblich sscanf nicht.


    Das halt ihr eher für ein Gerücht.
    Das Plugin gubt ja nicht mehr als einen String zurück und sscanf verarbeitet ihn, das eine hat mit dem anderen rein gar nichts zu tun ;)


    DJ Deagle: Es könnte sein, dass du den delimiter vor dem enum nutzen musst bnzw. solltest.
    In meinem GM mach ich das so und es funktioniert :D


    In der Dokumentation selbst finde ich dazu allerdings nichts, aber möglicherweise gibt es das Problem, das durch den 2. param in der definition der enum früher aufhört als er soll.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski


  • Die ID ist kein AUTO_INCREMENT :whistling:


    Naja, ich habe die komplette Datenbank nun mal geleert (alles auf 0 gesetzt) und im Spiel den Entrance sowie den Exit von Fraktion 1 umgesetzt (dynamik OP).
    Folgendes Ergebnis:


    Alles OK mit den Posis und der Speicherung. Naja fast, beim Auslesen hat er immer noch eine Probleme. Jetzt könnte man denken, es liegt am Speichersystem.
    Kein Problem, auch schon einen Blick drauf geworfen:
    stock SaveFrak(FrakID)
    {
    new query[1536],q[350];
    format(q,sizeof q,"UPDATE `Frak` SET `Kasse` = '%d', `Marihuana` = '%d', `Mats` = '%d', `Gangwaffen` = '%d', `Rank1lohn` = '%d', `Rank2lohn` = '%d', `Rank3lohn` = '%d', `Rank4lohn` = '%d',",FrakInfo[FrakID][fKasse],FrakInfo[FrakID][fMarihuana],FrakInfo[FrakID][fMats],FrakInfo[FrakID][fGangwaffen],FrakInfo[FrakID][fR1L],FrakInfo[FrakID][fR2L],FrakInfo[FrakID][fR3L],FrakInfo[FrakID][fR4L]);
    strcat(query,q);
    format(q,sizeof q,"`Rank5lohn` = '%d', `Rank6lohn` = '%d', `Rank7lohn` = '%d', `Rank8lohn` = '%d', `LagerOpen` = '%d', `Rank1name` = '%s', `Rank2name` = '%s', `Rank3name` = '%s', `Rank4name` = '%s',",FrakInfo[FrakID][fR5L],FrakInfo[FrakID][fR6L],FrakInfo[FrakID][fR7L],FrakInfo[FrakID][fR8L],FrakInfo[FrakID][fWLO],FrakInfo[FrakID][fR1N],FrakInfo[FrakID][fR2N],FrakInfo[FrakID][fR3N],FrakInfo[FrakID][fR4N]);
    strcat(query,q);
    format(q,sizeof q,"`Rank5name` = '%d', `Rank6name` = '%d', `Rank7name` = '%d', `Rank8name` = '%d', `Rank1skin` = '%d', `Rank2skin` = '%d', `Rank3skin` = '%d', `Rank4skin` = '%d', `Rank5skin` = '%d',",FrakInfo[FrakID][fR5N],FrakInfo[FrakID][fR6N],FrakInfo[FrakID][fR7N],FrakInfo[FrakID][fR8N],FrakInfo[FrakID][fR1S],FrakInfo[FrakID][fR2S],FrakInfo[FrakID][fR3S],FrakInfo[FrakID][fR4S],FrakInfo[FrakID][fR5S]);
    strcat(query,q);
    format(q,sizeof q,"`Rank6skin` = '%d', `Rank7skin` = '%d', `Rank8skin` = '%d', `WLX` = '%f', `WLY` = '%f', `WLZ` = '%f', `PosX` = '%f', `PosY` = '%f', `PosZ` = '%f', `IntX` = '%f',",FrakInfo[FrakID][fR6S],FrakInfo[FrakID][fR7S],FrakInfo[FrakID][fR8S],FrakInfo[FrakID][fWLX],FrakInfo[FrakID][fWLY],FrakInfo[FrakID][fWLZ],FrakInfo[FrakID][fPosX],FrakInfo[FrakID][fPosY],FrakInfo[FrakID][fPosZ],FrakInfo[FrakID][fIntX]);
    strcat(query,q);
    printf("%s",q);
    format(q,sizeof q,"`IntY` = '%f', `IntZ` = '%f', `WLiX` = '%f', `WLiY` = '%f', `WLiZ` = '%f', `Interior` = '%d', `VW` = '%d',",FrakInfo[FrakID][fIntY],FrakInfo[FrakID][fIntZ],FrakInfo[FrakID][fWLiX],FrakInfo[FrakID][fWLiY],FrakInfo[FrakID][fWLiZ],FrakInfo[FrakID][fInterior],FrakInfo[FrakID][fVW]);
    strcat(query,q);
    printf("%s",q);
    format(q,sizeof q,"`SpawnX` = '%f', `SpawnY` = '%f', `SpawnZ` = '%f', `SpawnA` = '%f', `Kokain` = '%d' WHERE `ID` = '%d'",FrakInfo[FrakID][fSpawnX],FrakInfo[FrakID][fSpawnY],FrakInfo[FrakID][fSpawnZ],FrakInfo[FrakID][fSpawnA],FrakInfo[FrakID][fKokain],FrakInfo[FrakID][fID]);
    strcat(query,q);
    mysql_query(query);
    return 1;
    }
    Die 2 Prints, gibt's exklusiv hier:

    Code
    //Eingang setzen (drausen)
    [13:33:24] `Rank6skin` = '0', `Rank7skin` = '0', `Rank8skin` = '0', `WLX` = '0.000000', `WLY` = '0.000000', `WLZ` = '0.000000', `PosX` = '1227.699707', `PosY` = '-1628.215209', `PosZ` = '13.420000', `IntX` = '0.000000',
    [13:33:24] `IntY` = '0.000000', `IntZ` = '0.000000', `WLiX` = '0.000000', `WLiY` = '0.000000', `WLiZ` = '0.000000', `Interior` = '0', `VW` = '0',
    
    
    //Ausgang setzen (drinnen)
    [13:34:53] `Rank6skin` = '0', `Rank7skin` = '0', `Rank8skin` = '0', `WLX` = '0.000000', `WLY` = '1227.699951', `WLZ` = '-1628.219970', `PosX` = '13.420000', `PosY` = '0.000000', `PosZ` = '0.000000', `IntX` = '188.550888',
    [13:34:53] `IntY` = '157.361541', `IntZ` = '1003.023437', `WLiX` = '0.000000', `WLiY` = '0.000000', `WLiZ` = '0.000000', `Interior` = '3', `VW` = '1',


    Hier nochmal die komplette Anweisung, nach welcher der Server aus der Datenbank ausliest:
    //Auszug aus dem "Eingang-setzen-Dialog" => Fraktion laden.
    //pInfo[playerid][pFraktion] ist genau das selbe wie FrakInfo[FrakID][fID], oder FrakID.
    format(str,sizeof str,"SELECT * FROM `Frak` WHERE `ID` = '%d'",pInfo[playerid][pFraktion]);
    mysql_query(str);
    format(str,sizeof str,"");
    mysql_store_result();
    while(mysql_fetch_row(str)) {
    LoadFrak(pInfo[playerid][pFraktion], str);
    }
    mysql_free_result();


    stock LoadFrak(FrakID, str[512])
    {
    sscanf(str,"e<p<|>dddddddddddddds[24]s[24]s[24]s[24]s[24]s[24]s[24]s[24]ddddddddffffffffffffddffffd>",FrakInfo[FrakID]);
    printf("FrakID: %d (DB-ID: %d) | %s",FrakID,FrakInfo[FrakID][fID],str);
    format(str,sizeof str,"%d Gangwaffen\nGangwaffen aus dem Lager nehmen: /gwaffen",FrakInfo[FrakID][fGangwaffen]);
    FrakInfo[FrakID][fGWP] = CreateDynamicPickup(1239,1,FrakInfo[FrakID][fWLiX],FrakInfo[FrakID][fWLiY],FrakInfo[FrakID][fWLiZ],FrakInfo[FrakID][fVW]);
    FrakInfo[FrakID][fEntPickup] = CreateDynamicPickup(1318,1,FrakInfo[FrakID][fPosX],FrakInfo[FrakID][fPosY],FrakInfo[FrakID][fPosZ]);
    printf("FrakID: %d (DB-ID: %d) | EnterPickup |-> %f %f %f",FrakID,FrakInfo[FrakID][fID],FrakInfo[FrakID][fPosX],FrakInfo[FrakID][fPosY],FrakInfo[FrakID][fPosZ]);
    FrakInfo[FrakID][fExtPickup] = CreateDynamicPickup(1318,1,FrakInfo[FrakID][fIntX],FrakInfo[FrakID][fIntY],FrakInfo[FrakID][fIntZ],FrakInfo[FrakID][fVW]);
    FrakInfo[FrakID][EntLabel] = Create3DTextLabel("Gebäude betreten: Z drücken",COLOR_LIGHTRED,FrakInfo[FrakID][fPosX],FrakInfo[FrakID][fPosY],FrakInfo[FrakID][fPosZ],10,0,0);
    FrakInfo[FrakID][ExtLabel] = Create3DTextLabel("Gebäude verlassen: Z drücken",COLOR_LIGHTRED,FrakInfo[FrakID][fIntX],FrakInfo[FrakID][fIntY],FrakInfo[FrakID][fIntZ],10,FrakInfo[FrakID][fVW],0);
    return 1;
    }


    Also irgendwie blicke ich den blöden Server nicht :D


    Jeffry: @BlackAce: @iEnergie:

  • Zitat

    Text3D:GW,
    Text3D:EntLabel,
    Text3D:ExtLabel,


    Vermute mal es liegt daran.


    Du hast die zwar bei FrakDaten drin, möchtest dort aber bestimmt keine Daten hinein laden aus der Datenbank (würde mMn sowieso keinen Sinn machen).
    Daher passt die Struktur innerhalb von e<> nicht mehr, da du nur 49 Werte angibst (und auch 49 Werte aus der DB bekommst) aber 52 innerhalb von FrakDaten zu Verfügung hast.
    Ich wüsste jetzt auch nicht direkt, wie du die Text3D:* skippen könntest.


    Mein Vorschlag:
    Ich würde eine extra enum Struktur anlegen als dummy-FrakDaten (identisch zu FrakDaten,nur ohne die Text3Ds), die genau mit der Datenbankstruktur übereinstimmt. Von dieser dann in FrakDaten kopieren.