Mysql Anfänger

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
  • Guten Tag, ich bin neu in Sachen MySQL - meine Frage ist, wie soll ich den Spieler Speichern lassen? Soll ich alles einzeln setzen- mit mysql_Set, oder soll ich alles formatieren und Updaten lassen? Grüße

  • Also, so?


    new l = SpielerInfo[playerid][pLevel],
    g = SpielerInfo[playerid][pGeld],
    k = SpielerInfo[playerid][pKills],
    t = SpielerInfo[playerid][pTode],
    Float:h = SpielerInfo[playerid][pHealth],
    ge = SpielerInfo[playerid][Geschlecht],
    a = SpielerInfo[playerid][Admin],
    s = SpielerInfo[playerid][Skin],
    f = SpielerInfo[playerid][FirstSpawn];
    new query[228];
    format(query, sizeof(query), "UPDATE `accounts` SET `Level`='%d',`Geld`='%d',`Kills`='%d',`Tode`='%d',`Health`='%d',`Geschlecht`='%d',`Admin`='%d', `Skin`='%d',`FirstSpawn`='%d' WHERE `Name`='%s'", l, g, k, t, h, ge, a, s, f, SpielerInfo[playerid][pName]);
    mysql_query(query);

  • Super, klappt auch soweit, aber wenn ich einen SKin speichern möchte, dann passiert nichts - liegt es an dem Code?


    SetPlayerSkin(playerid, 101);
    new query[228];
    format(query, sizeof(query), "UPDATE `accounts` SET `Skin`='%d' WHERE `Name`='%s'", GetPlayerSkin(playerid), SpielerInfo[playerid][pName]);
    mysql_query(query);

  • Es kann sein (das kommt vor), dass das zurückgegebene Paket schneller war als das, was gesendet wurde, daher bekommst du noch die alte Zahl bei GetPlayerSkin.
    Mach es so:
    format(query, sizeof(query), "UPDATE `accounts` SET `Skin`='101' WHERE `Name`='%s'", SpielerInfo[playerid][pName]);


    Dann sollte es gehen.

  • Ganz Intelligent wäre es aber, wenn du direkt bei Variablen-Änderung in die Datenbank den neuen Wert speicherst. Dann sparst du dir das "Massenspeichern", wenn der Spieler die Verbindung trennt und der Server wäre sogar Ausfallsicher, wenn plötzlich der SAMP Server Offline geht, ohne OnPlayerDisconnect bei den Spielern aufzurufen.


    Beispiel:



    enum pInfo
    {
    pLevel,
    pAdmin,
    pRespekt,
    pDatabase,
    };
    new PlayerInfo[MAX_PLAYERS][pInfo];


    ConvertFloatToString(Float:value) { new cache[32]; format(cache,32,"%f",value); return cache; }
    ConvertIntegerToString(value) { new cache[32]; format(cache,32,"%i",value); return cache; }


    #define SetPlayerInteger(%0,%1,%2) SetPlayerString(%0,%1,ConvertIntegerToString(%2),PLAYER_VARTYPE_INTEGER)
    #define SetPlayerFloat(%0,%1,%2) SetPlayerString(%0,%1,ConvertFloatToString(%2),PLAYER_VARTYPE_FLOAT)
    stock SetPlayerString(playerid, pInfo:var, value[], vartype = PLAYER_VARTYPE_STRING)
    {
    if(strlen(value) < 1) return false;
    new database_id = PlayerInfo[playerid][pDatabase],
    query[128];
    switch(vartype) {
    case PLAYER_VARTYPE_INTEGER: PlayerInfo[playerid][var] = strval(value);
    case PLAYER_VARTYPE_FLOAT: PlayerInfo[playerid][var] = floatstr(value);
    case PLAYER_VARTYPE_STRING: format(PlayerInfo[playerid][var],strlen(value),"%s",value);
    default: return false;
    }
    format(query,sizeof(query),"UPDATE players SET %d = '%s' WHERE id = '%d' LIMIT 1;", _:var, value, database_id);
    mysql_function_query(1, query, false, "", "");
    return true;
    }

    Das oben sollte nur ein Gedankenanstoß sein. Nebenbei ist es vielleicht bezweifelhaft den Index vom Enum als Spaltennamen zu verwendet, aber ich wollt jetzt nicht allzuviel Zeit darin stecken. Man müsste eben einen weiteren Array anlegen, wo die Standardwerte und Spaltenname von der Datenbank drinnen stehen.


    // EDIT: Hab die Verwendung total vergessen :P


    Zum Auslesen verwendest es so normal


    printf("Player %d has Admin %d", playerid, PlayerInfo[playerid][pAdmin]);


    Und zum Speichern eben so:


    SetPlayerInteger(playerid, pAdmin, 1337); // Setzt den Spieler auf 1337

    Mfg Templer


    >>Dein Breadfish-Thema im Unterforum ScriptingBase / Scriptingwünsche wurde nicht richtig beantworter?<<
    >>Es handelt sich um ein Programmier Problem und du nicht einfach weiter kommst wo der Fehler sein könnte?<<
    Dann melde dich bei mir über die PN-Funktion indem du den Link zu deinem Breadfish-Themen Problem schickst.
    Voraussetzung:
    Thema älter als 1 Tag und im Breadfish Forum gespostet!