Objekte aus MySQL-DB laden - ID Lücke überspringen

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
  • Halli hallo liebe brotfische ;)


    Ich bin momentan dabei, ein kleines System zu schreiben, welches Ingame erstellte Objekte in einer MySQL Datenbank speichert - und beim Serverstart wieder ausliest und erstellt. Dafür habe ich eine Tabelle in ungefähr diesem Stil angelegt:



    Wie man sieht, ist in der Spalte "id" zwischen dem Vorletzten und dem letzten Eintrag eine Lücke (in der Nummerierung [ 4002, 4003, 4005] ).
    Meine Frage ist nun, wie kann ich denn bitte Eintrag für Eintrag anhand der "id" auslesen, und diese Lücke überspringen.


    Mein Code bisher ist folgendermaßen: (Wenn ich den aber benutze, crasht mein Server aber beim Start, da eben diese "Lücke" vorhanden ist)

    Spoiler anzeigen

    stock LoadObjectsForPremiumUsers()
    {
    new Query[255], id;
    format(Query, sizeof(Query), "SELECT * FROM playerobjects2");
    mysql_query(Query);
    new firstid;

    Spoiler anzeigen
    mysql_store_result();

    mysql_fetch_field("id",data);
    firstid=strval(data);

    new durchgang = 1;
    new rows = mysql_num_rows();
    for ( new j = 0; j < (rows); j++)
    {



    if ( durchgang == 1)
    {
    format(Query, sizeof(Query), "SELECT * FROM playerobjects2 WHERE id = %i",firstid);
    mysql_query(Query);
    mysql_store_result();
    } else
    {
    firstid = firstid += 1;
    format(Query, sizeof(Query), "SELECT * FROM playerobjects2 WHERE id = %i",firstid);
    mysql_query(Query);
    mysql_store_result();
    }



    mysql_fetch_field("id",data);
    pObject[j][object_did]=strval(data);

    mysql_fetch_field("besitzer",data);
    pObject[j][object_besitzer]=strval(data);

    mysql_fetch_field("model",data);
    pObject[j][object_model]=strval(data);

    mysql_fetch_field("x",data);
    pObject[j][ox]=floatstr(data);

    mysql_fetch_field("y",data);
    pObject[j][oy]=floatstr(data);

    mysql_fetch_field("z",data);
    pObject[j][oz]=floatstr(data);

    mysql_fetch_field("a1",data);
    pObject[j][a1]=floatstr(data);

    mysql_fetch_field("a2",data);
    pObject[j][a2]=floatstr(data);

    mysql_fetch_field("a3",data);
    pObject[j][a3]=floatstr(data);

    mysql_fetch_field("world",data);
    pObject[j][object_world]=strval(data);

    mysql_fetch_field("interior",data);
    pObject[j][object_interior]=strval(data);

    new string[255];
    format(string,255,"Objekt %i erstellt:: X: %f Y: %f Z: %f ",pObject[j][object_did],pObject[j][ox],pObject[j][oy],pObject[j][oz]);
    printf(string);
    pObject[j][object_id] = CreateDynamicObject(pObject[j][object_model],pObject[j][ox],pObject[j][oy],pObject[j][oz],pObject[j][a1],pObject[j][a2],pObject[j][a3],pObject[j][object_world],pObject[j][object_interior],-1);
    durchgang = durchgang + 1;
    printf("Es wurde ein Objekt geladen");
    }
    }



    Ist keine Lücke bei den "id" 's in der Tabelle vorhanden, funktioniert dieser Code wunderbar, lediglich bei einer "Lücke" unter den "id" 's crasht er mit. Kann jemand mir bitte helfen, ich tüftle schon lange an einer Lösung, aber mein Geist scheint grade nicht bereit dafür...


    Vielen lieben dank schonmal im Voraus!


    Mit freundlichen Grüßen


    Madretsma


    IM AUFBAU!

    Einmal editiert, zuletzt von Madretsma () aus folgendem Grund: Titel angepasst

  • Ich habe es damals bei mir immer so gemacht:


    for(new i=0;i<50;i++)
    {
    new Query[128],idstr[16],count;
    valstr(idstr,i);
    mysql_real_escape_string(idstr, idstr);
    format(Query, sizeof(Query), "SELECT `OBJECT_NR (SLOT)` FROM `DEIN_TABLE` WHERE `OBJECT_NR (SLOT)` = '%s'", idstr);
    mysql_query(Query);
    mysql_store_result();
    count = mysql_num_rows();
    mysql_free_result();
    if(count == 1)
    {
    ZigInfo[i][ZigAutomat] = mysql_GetInt("DEIN_TABLE", "Automat", "OBJECT_NR", idstr);
    ZigInfo[i][ZigX] = mysql_GetFloat("DEIN_TABLE", "X", "Slot", idstr);
    ZigInfo[i][ZigY] = mysql_GetFloat("DEIN_TABLE", "Y", "Slot", idstr);
    ZigInfo[i][ZigZ] = mysql_GetFloat("DEIN_TABLE", "Z", "Slot", idstr);
    ZigInfo[i][ZigA] = mysql_GetFloat("DEIN_TABLE", "A", "Slot", idstr);
    // hier müsstest du weiter machen mit V-Welt, Interior...
    if(ZigInfo[i][ZigAutomat] == 1)
    {
    ZigInfo[i][ZigObject] = CreateDynamicObject(1776,ZigInfo[i][ZigX],ZigInfo[i][ZigY],ZigInfo[i][ZigZ],0,0,ZigInfo[i][ZigA]);
    }
    else
    {
    ZigInfo[i][ZigObject] = -1;
    }
    }
    }
    return 1;


    Da es sich bei mir um Zigarettenautomaten gehandelt hat, heißen der enum "ZigInfo" und dementsprechend das Objekt "ZigObject".


    Aber grundsätzlich kannst du es so wie ich machen, musst natürlich das ganze so modellieren, dass es nach deinen Vorstellungen die Objekte ausliest und setzt.

    Meine Werke

  • VIELEN DANK! Ich war schon am verzweifeln, weil mein unausgeschlafener Geist einfach nichts mehr hinbekommen hat. Vielen Dank für deinen Post, du hast mein Problem gelöst.


    ***MOD: Fehlende Bildquelle***


    IM AUFBAU!

    Einmal editiert, zuletzt von seegras ()


  • Sehr gute Erklärung *_*


    Das Problem ist einfach das du die Datenbank viel mehr beanspruchst als würdest du nur einmal drauf zugreifen :) (@TE)


    Ja, das mag stimmen, jedoch in diesem Fall auch nur beim Serverstart, da ich grad zu Faul bin (ja ich weiß, falsche Einstellung :P) werd ich das aber NOCH nicht bei mir ändern, mach ich später wenn ich geschlafen habe :P


    Mit freundlichen Grüßen


    Madretsma


    IM AUFBAU!

  • Es ist wirklich nicht sehr gut für jede weitere Abfrage aus der Datenbank einen neuen Datensatz anzufragen.


    Deswegen würde ich das so in dem Stil machen:


    mysql_query("SELECT * FROM `playerobjects2`"),
    mysql_store_result();
    while(mysql_retrieve_row()){
    mysql_fetch_field_row(query,"spalte");
    variable = strval(query); //falls integer.
    mysql_free_result();
    }


    Probier mal was damit anzufangen, ich habe denke seit 8 Monaten keine R5 mehr benutzt.


    mfg :thumbup:



  • Vielen Dank erstmal für deine Antwort!


    mysql_retrieve_row ist mir bisher gar nicht untergekommen, wenn ich das aber richtig verstehe, geht er mit dieser schleife alle Einträge durch? (Quasi -> Während Reihe da?) Oder wie darf ich die Schleife verstehen?



    mysql_query("SELECT * FROM `playerobjects2`"),
    mysql_store_result();
    while(mysql_retrieve_row()){
    mysql_fetch_field_row(query,"spalte"); //Hier jeweils eine Zeile der Tabelle, oder wie?
    variable = strval(query); //falls integer.
    mysql_free_result();
    }


    Sorry, ich kenne mich mit MySQL noch nicht so gut aus :D


    IM AUFBAU!