MySQL - Login/Register

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
  • Hallo,


    mal wieder ein MySQL Thema! Die Hände in die Höh', yüha!


    Spaß beiseite, ich befasse mich momentan mit MySQL und habe meinen Code nun soweit bekommen, dass er ohne Errors kompiliert und eine Verbindung zur Datenbank hergestellt wird.


    public OnPlayerConnect(playerid)
    {
    //MySQL - Login/Register
    TogglePlayerSpectating(playerid, true);


    new
    query[128],
    pName[MAX_PLAYER_NAME];


    GetPlayerName(playerid, pName, sizeof(pName));
    mysql_format(MySQL, query, sizeof(query), "SELECT `Password`, `DatabaseID` FROM `accounts` WHERE `Name` = '%e' LIMIT 1", pName);
    mysql_tquery(MySQL, query, "OnAccountCheck", "i", playerid);
    }


    forward OnAccountCheck(playerid);
    public OnAccountCheck(playerid)
    {
    new
    rows,
    fields;


    cache_get_data(rows, fields, MySQL);


    if(rows)
    {
    cache_get_field_content(0, "Password", pInfo[playerid][Password], MySQL, 129);
    pInfo[playerid][DatabaseID] = cache_get_field_content_int(0, "DatabaseID");


    new
    n[MAX_PLAYER_NAME],
    str[MAX_LANGUAGES][128];


    format(str[LANGUAGE_DE], sizeof(str[]), "Willkommen, %s!\nEs wurden Accountdaten zu diesem Namen gefunden.\nBitte gib unten das Passwort ein.", n);
    format(str[LANGUAGE_EN], sizeof(str[]), "Welcome, %s!\nAccount data has been found for this name.\nPleasy type in the password below.", n);


    ShowLanguageDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Login", "Login", str[LANGUAGE_DE], str[LANGUAGE_EN], "OK", "OK", "Verlassen", "Leave");
    }
    else ShowPlayerDialog(playerid, DIALOG_LANGUAGE, DIALOG_STYLE_LIST, "Sprache | Language", "Deutsch - German\nEnglisch - English.", "OK", "Exit");
    return 1;
    }


    Also: Der Spieler connected auf den Server, wobei er erst einmal in den Spectator Modus gesetzt wird, um die Class Selection zu deaktivieren. Danach soll eben überprüft werden, ob es Accountdaten zum Namen des Spielers in der Datenbank gibt, oder nicht. Wenn ja, dann kommt der Login Dialog. Wenn nicht, dann kommt zunächst einmal ein Dialog, in dem der Spieler die Sprache auswählen kann, also Deutsch oder Englisch, und im Anschluss daran der Registrations Dialog.


    Alles was jedoch passiert ist, dass der Spieler in den Spectator Modus gesetzt wird, mehr nicht. Was habe ich übersehen?


    Bitte gebt bescheid, wenn ihr weiteren Code benötigt.

  • Keine Ahnung wie, aber ich hab es irgendwie hingekriegt.


    Ich habe ein paar Syntaxfehler ausmerzen, und den Logindialog neu setzen müssen. Jetzt geht das Ganze.


    Allerdings hätte ich noch eine Frage. Was bedeutet in der Log "skipping result saving"?
    [11:20:26] [DEBUG] mysql_format - connection: 1, len: 128, format: "UPDATE `accounts` SET `Money` = %d, `Score` = %d, `Language` = %d WHERE `DatabaseID` = %d"
    [11:20:26] [DEBUG] mysql_tquery - connection: 1, query: "UPDATE `accounts` SET `Money` = 0, `Score` = 0, `Language` = 0 W", callback: "(null)", format: "(null)"
    [11:20:26] [DEBUG] CMySQLQuery::Execute[] - starting query execution
    [11:20:26] [DEBUG] CMySQLQuery::Execute[] - query was successfully executed within 2.781 milliseconds
    [11:20:26] [DEBUG] CMySQLQuery::Execute[] - no callback specified, skipping result saving

  • Okay, gut. Noch etwas: Ich versehe jeden Account mit einer einzigartigen DatabaseID, die ich auf AUTO_INCREMENT gestellt habe. Jetzt hab ich mal ein paar Testaccounts gelöscht, und mir ist aufgefallen, dass er nicht wieder bei 1 ansetzt, sondern intern einfach weiterzählt, wo er aufgehört hat, egal, ob der Account noch existiert oder nicht. Ich hab die ID mal manuell bearbeitet und wieder auf 1 gesetzt, in der Hoffnung, dass er sich immer am zuletzt erstellten Account orientiert, dem ist aber nicht so. Kann man diese interne Variable irgendwie zurücksetzen?