Fraktionen aus MySQL Datenbank laden

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
  • Hey Leute,
    es bleibt mir nichts anderes als einfach mal hier zu fragen.
    Ich
    habe etwas ganz Simples vor, und zwar möchte ich Fraktionen per
    Hand/Manuell in der MySQL Datenbank anlegen und diese dann auslesen.
    Leider stehe ich auf dem Schlauch und komme nicht weiter.


    #define MAX_FRAKTION 20


    enum fraktionInfo{
    fdb_idf,
    fdb_id,
    fdb_name,
    fdb_kasse,
    fdb_bluem,
    fdb_meth,
    fdb_skasse
    }


    new fdbInfo[MAX_FRAKTION][fraktionInfo];
    forward loadFrak();


    public OnGameModeInit()
    {
    mysql_function_query(dbhandle,"SELECT * FROM fraktionen",true,"loadFrak()","");
    loadFrak();
    }


    loadFrak()
    {
    new num_rows,num_fields;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(!num_rows) return 1;
    for(new i=0; i<num_rows; i++)
    {
    fdbInfo[i][fdb_kasse] = cache_get_field_content_int(0,"kasse",dbhandle);
    fdbInfo[i][fdb_bluem] = cache_get_field_content_int(0,"bluemagic",dbhandle);
    fdbInfo[i][fdb_meth] = cache_get_field_content_int(0,"meth",dbhandle);
    fdbInfo[i][fdb_id] = cache_get_field_content_int(0,"id",dbhandle);
    fdbInfo[i][fdb_skasse] = cache_get_field_content_int(0,"schwarzkasse",dbhandle);
    return 1;
    }
    return 1;
    }
    }


    Es scheint nicht zu funktionieren, da ich folgenden Fehler bekomme:


    [17:40:33] [WARNING] cache_get_data - no active cache


    Kann mir vielleicht jemand auf die Sprünge helfen?


    Mfg The.Boonze

  • public OnGameModeInit()
    {
    mysql_function_query(dbhandle,"SELECT * FROM fraktionen",true,"loadFrak","");
    return 1;
    }


    forward loadFrak();
    public loadFrak()
    {
    new num_rows,num_fields;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(!num_rows) return 1;
    for(new i=0; i<num_rows; i++)
    {
    new id = getFreeFraktion();
    fdbInfo[id][fdb_kasse] = cache_get_field_content_int(i,"kasse",dbhandle);
    fdbInfo[id][fdb_bluem] = cache_get_field_content_int(i,"bluemagic",dbhandle);
    fdbInfo[id][fdb_meth] = cache_get_field_content_int(i,"meth",dbhandle);
    fdbInfo[id][fdb_id] = cache_get_field_content_int(i,"id",dbhandle);
    fdbInfo[id][fdb_skasse] = cache_get_field_content_int(i,"schwarzkasse",dbhandle);
    return 1;
    }
    return 1;
    }


    stock getFreeFraktion()
    {
    for(new i;i<sizeof fdbInfo;i++)
    {
    if(fdbInfo[i][fdb_id] == 0)return i;
    return 0;
    }
    return 0;
    }
    So aus dem Kopf, versuch mal :)

  • Danke erstmal für die schnelle Antwort.
    Habe deinen Code so eingefügt, beim compilen kommen keine Fehler.
    Wenn ich jedoch das public loadFrak(); aufrufe schmeißt die Datenbank wieder den selben Fehler:


    [WARNING] cache_get_data - no active cache



    Hier mal ein Auszug der Datenbank, nicht das ich da was vermasselt habe:


    Mit freundlichen Grüßen,


    The.Boonze

  • Zeig mir mal bitte dein OnGameModeInit, du lässt den Callback ja nicht noch extra aufrufen oder?

  • Muss ich das public loadFrak(); nicht noch irgendwo aufrufen?


    //---------------------------------------MySQL Verbinden------------------------


    dbhandle = mysql_connect(db_host,db_user,db_db,db_pass);
    SetTimer("savePlayer",update_time,true);
    mysql_function_query(dbhandle,"SELECT * FROM fraktionen",true,"loadFrak","");


    Hier rufe ich das public auf:


    ocmd:fkasse(playerid,params[])
    {
    loadFrak();
    new string[128];
    switch(sInfo[playerid][fraktion])
    {
    case 0:
    {
    SendClientMessage(playerid,grau,"Du bist in keiner Fraktion.");
    }
    case 1:
    {
    format(string,sizeof(string),"Du hast %i$ in deiner Fraktionskasse.",fdbInfo[1][fdb_kasse]);
    SendClientMessage(playerid,hblau,string);
    }
    case 2:
    {
    format(string,sizeof(string),"Du hast %i$ in deiner Fraktionskasse.",fdbInfo[2][fdb_kasse]);
    SendClientMessage(playerid,hblau,string);
    }

    case 3:
    {
    format(string,sizeof(string),"Du hast %i$ in deiner Fraktionskasse.",fdbInfo[3][fdb_kasse]);
    SendClientMessage(playerid,hblau,string);
    }
    }
    return 1;
    }



    sInfo[playerid][fraktion] gibt dabei aus in welcher Fraktion er ist:


    sInfo[playerid][fraktion]=0 --> Zivi
    sInfo[playerid][fraktion]=1 --> LSPD


    etc.


    Mit freundlichen Grüßen,


    The.Boonze

  • Wenn du etwas aus der Datenbank auslesen möchtest, dann musst du es mit einer Query abschicken, das geht nicht einfach so.
    Du kannst so eine Auslesung nicht einfach über diese Funktion "loadFrak();" aufrufen, sondern wie bei OnGameModeInit so: "mysql_function_query(dbhandle,"SELECT * FROM fraktionen",true,"loadFrak","");"
    Bei dem Befehl "ocmd:fkasse" brauchst du es doch nicht mehr auslesen, dass machst du doch wenn du den Server startest. Wenn aber jemand etwas einzahlt, musst du den Wert natürlich auf der Variable addieren, damit das auch aktualisiert wird.

  • Okay also nehme ich das loadFrak(); einfach wieder daraus.
    Jetzt bin ich aber in der Fraktion LSPD, habe in der Datenbank Geld in die kasse geschrieben.
    Wenn ich nun jedoch das ocmd:fkasse ausführe zeigt er mir jedesmal 0 Dollar an. Obwohl ja laut Datenbank etwas drin ist.
    Habe ich da im Befehl fkasse etwas falsch gescriptet?


    Mit freundlichen Grüßen,


    The.Boonze

  • Du wirst wahrscheinlich immer noch den Fehler haben, oder?
    ([WARNING] cache_get_data - no active cache)

  • So hast du alle Fraktionen in einem kleinen Befehl :)
    ocmd:fkasse(playerid,params[])
    {
    if(sInfo[playerid][fraktion] == 0)SendClientMessage(playerid,grau,"Du bist in keiner Fraktion.");
    else
    {
    new string[144],f_ID;
    f_ID = sInfo[playerid][fraktion];
    format(string,sizeof string,"Du hast %d$ in deiner Fraktionskasse!",fdbInfo[f_ID][fdb_kasse]);
    SendClientMessage(playerid,hblau,string);
    }
    return 1;
    }
    Kannst es ja mal ausprobieren.

  • So. Zu aller erst entfernst du das "return 1;" in diesem Code.
    for(new i=0; i<num_rows; i++)
    {
    new id = getFreeFraktion();
    fdbInfo[id][fdb_kasse] = cache_get_field_content_int(i,"kasse",dbhandle);
    fdbInfo[id][fdb_bluem] = cache_get_field_content_int(i,"bluemagic",dbhandle);
    fdbInfo[id][fdb_meth] = cache_get_field_content_int(i,"meth",dbhandle);
    fdbInfo[id][fdb_id] = cache_get_field_content_int(i,"id",dbhandle);
    fdbInfo[id][fdb_skasse] = cache_get_field_content_int(i,"schwarzkasse",dbhandle);
    return 1;
    }
    Sprich zu:
    for(new i=0; i<num_rows; i++)
    {
    new id = getFreeFraktion();
    fdbInfo[id][fdb_kasse] = cache_get_field_content_int(i,"kasse",dbhandle);
    fdbInfo[id][fdb_bluem] = cache_get_field_content_int(i,"bluemagic",dbhandle);
    fdbInfo[id][fdb_meth] = cache_get_field_content_int(i,"meth",dbhandle);
    fdbInfo[id][fdb_id] = cache_get_field_content_int(i,"id",dbhandle);
    fdbInfo[id][fdb_skasse] = cache_get_field_content_int(i,"schwarzkasse",dbhandle);
    }
    Danach lässt du die Funktion "getFreeFraktion" so laufen:
    stock getFreeFraktion()
    {
    for(new i = 1;i<sizeof fdbInfo;i++)
    {
    if(fdbInfo[i][fdb_id] == 0)return i;
    return 0;
    }
    return 0;
    }
    Nun sollte alles einwandfrei ablaufen :)

  • Aaaalso auf den ersten Blick bombastisch :) Also für die Fraktionsid 1 wurde das Geld perfekt angezeigt.
    Jedoch bei Fraktion 2 und 3 stehen 0 Dollar statt einem Wert. :(


    Wenn alles klappt kannst du vielleicht noch erklären warum du es so geschrieben hast? Das ich beim nächsten mal vielleicht selber drauf komme und es anwenden kann?!


    Mfg The.Boonze

  • stock getFreeFraktion()
    {
    for(new i = 0;i<sizeof fdbInfo;i++)
    {
    if(fdbInfo[i][fdb_id] == 0)return i;
    }
    return 0;
    }
    Schreib das so :)


    Du musstest oben das return 1; entfernen, weil sonst nur eine Fraktion geladen werden würde weil das return bewirkt das nach dem ersten Durchlauf es sofort angehalten und gestoppt wird.
    Hast du sonst noch Fragen?

  • Vielen Vielen Dank,


    in diesem kurzen Beispiel auch wie ich es richtig aus der Datenbank lade, habe ich es jetzt verstanden wie ich da vorgehe.


    Perfekt gelöst auch die kurze Schleife für die fkasse. Daumen hoch und respekt! :thumbup: :thumbup: :thumbup:


    Mfg The.Boonze