Account wird nicht erstellt [MySQL]

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,


    bei mir wird kein Account in der Datenbank erstellt.
    Die MySQL Log sagt mir folgendes...

    SQL
    [17:38:57] [DEBUG] mysql_tquery - connection: 1, query: "INSERT INTO (Username, Password,Registrierung) VALUES  ('Shine',", callback: "(null)", format: "(null)"
    [17:38:57] [DEBUG] CMySQLQuery::Execute[] - starting query execution
    [17:38:57] [ERROR] CMySQLQuery::Execute[] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(Username, Password,Registrierung) VALUES  ('Shine',MD5('testpw'),'2014.12.15')' at line 1
    [17:38:57] [DEBUG] CMySQLQuery::Execute[] - error will be triggered in OnQueryError


    Würde mich über Hilfe freuen.


    Gruß,
    Jean

  • Funktioniert alles soweit. Es gibt jedoch eine Sache, die mich schon lange beschäftigt.


    Wie man in meinem Register System kann, setze ich den Wert "Eingeloggt" und "Level" per SpielerInfo auf 1.
    Dies funktioniert aber jedoch nicht. Der Query z.B funktioniert einwandfrei. Wieso kann ich nach der Registrierung kein SpielerInfo zum Werte setzten verwenden?
    case DIALOG_REGISTER:
    {
    new tag, monat, jahr, datum[16];
    if(!response) return Kick(playerid);
    if(strlen(inputtext) < 6) return ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT, ""#SERVERNAME": Registrierung", "Es wurde kein Account unter diesen Namen in der Datenbank gefunden.\nBitte gebe nun dein gewünschtes Passwort ein.\nNach der Registrierung folgt eine Einführung in unseren Server.\n\nWir wünschen dir viel Spaß auf "#SERVERNAME"", "Registrieren", "Abbrechen");
    format(key, 50, "%s", inputtext);
    mysql_escape_string(Spielername(playerid), Spielername(playerid)), mysql_escape_string(key, key);
    getdate(tag, monat, jahr);
    format(datum, sizeof(datum), "%02d.%02d.%d", tag, monat, jahr);
    format(query, sizeof(query), "INSERT INTO Accounts (Username, Password,Registrierung,LastLogin) VALUES ('%s',MD5('%s'),'%s','%s') ", Spielername(playerid), key,datum,datum);
    mysql_tquery(Handle, query);
    SendClientMessage(playerid, -1, "Dein Account wurde erstellt.");
    SetPlayerScore(playerid, 1);
    SpielerInfo[playerid][pEingeloggt] = 1;
    SpielerInfo[playerid][pLevel] = 1;
    SetPlayerColor(playerid,COLOR_WHITE);
    }

  • Gibt dir die Werte mal aus:
    //...
    SpielerInfo[playerid][pEingeloggt] = 1;
    SpielerInfo[playerid][pLevel] = 1;
    printf("%d, %d", SpielerInfo[playerid][pEingeloggt], SpielerInfo[playerid][pLevel]);
    SetPlayerColor(playerid,COLOR_WHITE);


    Wenn da zwei 1'er im Server Log stehen, dann setzt du die Variablen-Werte woanders wieder zu 0, danach solltest du dann mal suchen.


    Falls du das Speichern des Accounts meinst, musst du das in den INSERT INTO mit einfügen, oder eben zur Speicherfunktion (SpielerSpeichern?).

  • Werte sind auf 1 und ich setze den Wert nur beim verlassen des Servers auf 0.
    public OnPlayerDisconnect(playerid, reason)
    {
    //Account Speicherung nach verlassen des Servers
    if(SpielerInfo[playerid][pEingeloggt] == 1)
    {
    SpielerInfo[playerid][pEingeloggt] = 0;
    SpielerSpeichern(playerid);
    }
    return 1;
    }

  • Hab den vorherigen Post überlesen, sorry.
    stock SpielerSpeichern(playerid)
    {
    new query[256];
    if(SpielerInfo[playerid][pEingeloggt] == 0)return 1;
    mysql_escape_string(Spielername(playerid), Spielername(playerid));
    format(query, sizeof(query), "UPDATE Accounts SET Eingeloggt='%i',Level='%i',Adminlevel='%i' WHERE Username='%s'",SpielerInfo[playerid][pEingeloggt],GetPlayerScore(playerid),SpielerInfo[playerid][pAdminlevel], Spielername(playerid));
    mysql_tquery(Handle, query);
    return 1;
    }

  • Du setzt Eingeloggt auf 0, vor SpielerSpeichern, sprich du returnst dann:


    public OnPlayerDisconnect(playerid, reason)
    {
    if(SpielerInfo[playerid][pEingeloggt] == 1)
    {
    SpielerSpeichern(playerid);
    SpielerInfo[playerid][pEingeloggt] = 0;
    }
    return 1;
    }


  • Hatte ich vorhin schon geändert, gibt leider immer noch das Problem.

  • Dann schreib es mal so:
    stock SpielerSpeichern(playerid)
    {
    new query[256], name[MAX_PLAYER_NAME];
    format(name, sizeof(name), Spielername(playerid));
    mysql_escape_string(name, name);
    format(query, sizeof(query), "UPDATE Accounts SET Eingeloggt='%i',Level='%i',Adminlevel='%i' WHERE Username='%s'",SpielerInfo[playerid][pEingeloggt],SpielerInfo[playerid][pLevel],SpielerInfo[playerid][pAdminlevel], name);
    mysql_tquery(Handle, query);
    return 1;
    }


    Wenn das auch nicht geht, poste den MySQL Log wenn du den Spieler speicherst.

  • Das funktioniert nun alles soweit. Mein Passwort ist jedoch richtig, wird aber als falsch angezeigt?
    case DIALOG_LOGIN:
    {
    if(!response) return Kick(playerid);
    format(key, 50, "%s", inputtext);
    mysql_escape_string(Spielername(playerid), Spielername(playerid)), mysql_escape_string(key, key);
    format(query, sizeof(query), "SELECT * FROM Accounts WHERE Username='%s' AND Password='%s'", Spielername(playerid), key);
    mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);
    }


    forward OnPasswordResponse(playerid);
    public OnPasswordResponse(playerid)
    {
    new query[256],tag, monat, jahr, datum[16],string[128];
    new num_fields, num_rows;
    cache_get_data(num_rows, num_fields);
    if(num_rows == 0)
    {
    //Passwort falsch
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD, ""#SERVERNAME": Login", "Du hast ein falsches Passwort eingegeben\n\nDein Account wurde in der Datenbank gefunden.\nBitte gebe nun das Passwort ein, welches du bei der Registrierung gewählt hast.\n\nWir wünschen dir viel Spaß auf "#SERVERNAME"","Login","Abbrechen");
    }
    else
    { //Was nach einloggen passiert
    SpielerInfo[playerid][pEingeloggt] = 1;
    LoadAccount(playerid);
    SpawnPlayer(playerid);
    SetPlayerColor(playerid,COLOR_WHITE);
    //Letztes Login wird in die Tabelle gespeichert
    getdate(tag, monat, jahr);
    format(datum, sizeof(datum), "%02d.%02d.%d", tag, monat, jahr);
    format(query, sizeof(query), "UPDATE Accounts SET LastLogin='%s' WHERE Username='%s'",datum, Spielername(playerid));
    mysql_tquery(Handle, query);

    format(string,sizeof(string),"Du hast dich als %s eingeloggt.",Adminrang(playerid));
    SendClientMessage(playerid,-1,string);
    }
    return 1;
    }

  • Du speicherst es mit MD5.
    format(query, sizeof(query), "SELECT * FROM Accounts WHERE Username='%s' AND Password='%s'", Spielername(playerid), key);
    zu:
    format(query, sizeof(query), "SELECT * FROM Accounts WHERE Username='%s' AND Password='MD5('%s')'", Spielername(playerid), key);

  • Dann schreibe es mal so, anscheinend braucht man die Anführungszeichen da doch nicht. :whistling:
    format(query, sizeof(query), "SELECT * FROM Accounts WHERE Username='%s' AND Password=MD5('%s')", Spielername(playerid), key);


    Wenn das auch nicht klappt, poste bitte den MySQL Log.