[MySQL] Letzer Logout speichern

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 habe eine Frage an euch. Ich möchte gerne für Informationen die im UCP wiedergegeben werden den letzten Logout des Spielers speichern in der Spielerdatei, sprich z.B 05.03.2014.
    Hat jemand eine Idee/Tipp wie ich das mache?

  • Alles klar, trotzdem nochmal eine dringende Frage, ich möchte sobald der Spieler online ist der Wert 'Online' in der Tabelle auf 1 gesetzt wird.
    Letztendlich mache ich das mit SpielerInfo[playerid][pOnline] = 1; unter LoadPlayer.
    Der Wert bleibt aber bei 0, ich weiß nicht warum.


    Zeige euch hier mal meinen Code
    stock SavePlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    if(GetPVarInt(playerid,"Eingeloggt") == 1)
    {
    mysql_SetInt("accounts", "Level", SpielerInfo[playerid][pLevel], "Name", SpielerInfo[playerid][pName]);
    mysql_SetInt("accounts", "Adminlevel", SpielerInfo[playerid][pAdminlevel], "Name", SpielerInfo[playerid][pName]);
    mysql_SetInt("accounts", "Online", SpielerInfo[playerid][pOnline], "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pOnline] = 0;
    }
    }
    return 1;
    }


    stock LoadPlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    GetPlayerName(playerid, SpielerInfo[playerid][pName], MAX_PLAYER_NAME);
    SpielerInfo[playerid][pLevel] = mysql_GetInt("accounts", "Level", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pAdminlevel] = mysql_GetInt("accounts", "Adminlevel", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pOnline] = mysql_GetInt("accounts", "Online", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pOnline] = 1;
    }
    return 1;
    }


    enum SpielerDaten
    {
    pName[MAX_PLAYER_NAME],
    pLevel,
    pGeld,
    pAdminlevel,
    pOnline
    }
    new SpielerInfo[MAX_PLAYERS][SpielerDaten];


    Code wo ich die Tabelle erstelle

    SQL
    DROP TABLE IF EXISTS `accounts`;
    CREATE TABLE `accounts` (
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `Name` VARCHAR(24) NOT NULL,
      `Passwort` VARCHAR(128) NOT NULL,
      `Level` INT(11) NOT NULL DEFAULT '1',
      `Adminlevel` INT(11) NOT NULL DEFAULT '0',
      `Online` INT(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;


    //Edit: Tabellen Erstellung hinzugefügt


    Einmal editiert, zuletzt von SA:MP-Designs () aus folgendem Grund: //Edit: Tabellen Erstellung hinzugefügt

  • Ich möchte sobald der Spieler online ist der Wert 'Online' in der Tabelle auf 1 gesetzt wird.
    Letztendlich mache ich das mit SpielerInfo[playerid][pOnline] = 1; unter LoadPlayer.
    Der Wert bleibt aber bei 0, ich weiß nicht warum.


    Zeige euch hier mal meinen Code
    stock SavePlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    if(GetPVarInt(playerid,"Eingeloggt") == 1)
    {
    mysql_SetInt("accounts", "Level", SpielerInfo[playerid][pLevel], "Name", SpielerInfo[playerid][pName]);
    mysql_SetInt("accounts", "Adminlevel", SpielerInfo[playerid][pAdminlevel], "Name", SpielerInfo[playerid][pName]);
    mysql_SetInt("accounts", "Online", SpielerInfo[playerid][pOnline], "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pOnline] = 0;
    }
    }
    return 1;
    }


    stock LoadPlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    GetPlayerName(playerid, SpielerInfo[playerid][pName], MAX_PLAYER_NAME);
    SpielerInfo[playerid][pLevel] = mysql_GetInt("accounts", "Level", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pAdminlevel] = mysql_GetInt("accounts", "Adminlevel", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pOnline] = mysql_GetInt("accounts", "Online", "Name", SpielerInfo[playerid][pName]);
    SpielerInfo[playerid][pOnline] = 1;
    }
    return 1;
    }


    enum SpielerDaten
    {
    pName[MAX_PLAYER_NAME],
    pLevel,
    pGeld,
    pAdminlevel,
    pOnline
    }
    new SpielerInfo[MAX_PLAYERS][SpielerDaten];


    Code wo ich die Tabelle erstelle

    SQL
    DROP TABLE IF EXISTS `accounts`;
    CREATE TABLE `accounts` (
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `Name` VARCHAR(24) NOT NULL,
      `Passwort` VARCHAR(128) NOT NULL,
      `Level` INT(11) NOT NULL DEFAULT '1',
      `Adminlevel` INT(11) NOT NULL DEFAULT '0',
      `Online` INT(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
  • Ist ja auch kein wunder, du must den wert ja auch updaten beim Connecten..

    new query[128];
    format(query,128,"UPDATE `accounts` SET `Online`='1' WHERE `Name`='%s'",SpielerInfo[playerid][pName]);
    mysql_query(query);

    Und beim verlassen ebenso. Nur das da der wert auf 0 kommt.


  • Reicht das wenn ich das unter OnPlayerConnect und Disconnect verwende?

  • Ja reicht es.


    Du sölltest dir allgemein angucken wie du mit dem R5 Plugin Ordentlich lädst.!!
    /e Und speicherst natürlich.


    so?
    stock SavePlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    if(GetPVarInt(playerid,"Eingeloggt") == 1)
    {
    new query[200];
    format(query, sizeof(query), "UPDATE `accounts` SET `Level` = '%d',`Adminlevel` = '%d',`Online` = '%d' WHERE `Name` = '%s'",
    SpielerInfo[playerid][pLevel],SpielerInfo[playerid][pAdminlevel],SpielerInfo[playerid][pOnline],SpielerInfo[playerid][pName]);
    mysql_query(query);
    }
    }
    return 1;
    }

  • Erstmal danke für den Tipp, ist beim Speichern des Spielers deiner Meinung nach alles richtig?
    Habe noch ein Problem mit dem Laden, es liegt ein Fehler vor und könntest du mal eben noch drüber schauen ob das richtig ist, sprich der Query?
    GetPlayerName(playerid, SpielerInfo[playerid][pName], MAX_PLAYER_NAME);
    new query[256], data[128];
    format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `Name`='%s',`Level` = '%d',`Adminlevel` = '%d',`Online` = '%d'",SpielerInfo[playerid][pName],SpielerInfo[playerid][pLevel],SpielerInfo[playerid][pAdminlevel],SpielerInfo[playerid][pOnline]);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_field("Level", data); SpielerInfo[playerid][pLevel] = strval(data); /Errorcode
    mysql_fetch_field("Adminlevel", data); SpielerInfo[playerid][pAdminlevel] = strval(data);/Errorcode
    mysql_fetch_field("Online", data); SpielerInfo[playerid][pOnline] = strval(data);/Errorcode

    Code
    : error 035: argument type mismatch (argument 1)
  • Mach das ganze so.

    GetPlayerName(playerid, SpielerInfo[playerid][pName], MAX_PLAYER_NAME);
    new query[256], data[50]; //50 zeichen bei data reichen völlig aus.
    format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `Name`='%s'",SpielerInfo[playerid][pName]);//Lese `Alles` Von Accounts aus, wo der Name sich befindet
    mysql_query(query);//abschicken des queries
    mysql_store_result();//Auflisten aller ergebnisse
    if(mysql_num_rows())//Abfragen ob datensatz existiert
    {
    if(mysql_retrieve_row())//Weiß ich nicht genau was das bewirkt.
    {
    mysql_fetch_field_row(data,"Level");//Söllte eigendlich selbsterklärend sein
    SpielerInfo[playerid][pLevel]=strval(data);
    mysql_fetch_field_row(data,"Adminlevel");
    SpielerInfo[playerid][Adminlevel]=strval(data);
    mysql_fetch_field_row(data,"Online");//Ich sehe auch keinen sinn, nen LEEREN Wert zu laden aber naja.
    SpielerInfo[playerid][Online]=strval(data);
    }
    }
    mysql_free_result();//NIEMALS VERGESSEN!!!! gibt den benutzten speicher wieder frei

  • Ist doch einfach....


    Unter "OnPlayerDisconnect" folgende Query einbinden:


    format(string, sizeof(string), "UPDATE table SET lastOnlineDate=NOW() WHERE pName = SpielerName"); :sleeping:

    Chief Technology Officer (CTO)


    Interesse an folgenden Domains?

    fivemp.de - planet-zoo.de

    Jetzt anschreiben :)