MySQL R38 - Simples Anmeldung´s System

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
  • Bessere bitte diese Dinge hier aus, ich habe es schon einige Male gesehen, dass Leute sich an dem Tutorial orientiert haben und immer wieder die gleichen Fehler machen. Die Fehler kommen aus dem Tutorial, und das ist nicht gut.
    Wenn man das Tutorial Schritt für Schritt befolgt, dann funktioniert das System auf Grund von Syntax-Fehlern im Query, sowie fehlerhaften Funktionsanwendungen nicht.


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    new query[256], key[50];
    if(dialogid == DIALOG_REGISTER)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    if(!strlen(inputtext) < 4)return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Anmeldung", "Es wurde kein Account unter diesem namen gefunden!", "Anmelden", "Abbrechen");
    format(key, 50, "%s", inputtext);
    mysql_escape_string(Spielername(playerid), Spielername(playerid)), mysql_escape_string(key, key);
    format(query, sizeof(query), "INSERT INTO (username, passwort) VALUES ('%s',MD5('%s')", Spielername(playerid), key);
    mysql_tquery(Handle, query);
    SendClientMessage(playerid, -1, "Dein Account wurde erstellt.");
    GivePlayerMoney(playerid, 50000), SetPlayerScore(playerid, 10);
    }
    return 1;
    }


    zu:
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid == DIALOG_REGISTER)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    if(!strlen(inputtext) < 4)return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Anmeldung", "Es wurde kein Account unter diesem namen gefunden!", "Anmelden", "Abbrechen");
    new query[256];
    mysql_format(Handle, query, sizeof(query), "INSERT INTO user (username, passwort) VALUES ('%e',MD5('%e'))", Spielername(playerid), inputtext);
    mysql_tquery(Handle, query);
    SendClientMessage(playerid, 0xFFFFFFFF, "Dein Account wurde erstellt.");
    GivePlayerMoney(playerid, 50000);
    SetPlayerScore(playerid, 10);
    }
    return 1;
    }




    Und:
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid == 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 user WHERE username='%s' AND password='%s'", Spielername(playerid), key);
    mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);
    }
    return 1;
    }


    zu:
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid == DIALOG_LOGIN)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    new query[256];
    mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' AND passwort=MD5('%e')", Spielername(playerid), inputtext);
    mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);
    }
    return 1;
    }


    Falls du wieder mal ein Tutorial machst, dann solltest du wenigstens die Grundfunktionen testen, bevor du es veröffentlichst.

    3HZXdYd.png

    2 Mal editiert, zuletzt von Jeffry () aus folgendem Grund: Noch einen Fehler ausgebessert. x2 / mysql_format

  • Jeffry: Warum nicht einfach mysql_format nutzen ?


    Spart u.a. das escapen.
    Ebenso kann man sich das hier sparen
    format(key, sizeof(key), inputtext);
    Ich mein ob inputtext oder key - im Grunde das selbe :D

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Hey, habe mich von deinem Tutorial inspirieren lassen und bin trotz eigener Programmierung an einen Fehler gestoßen...



    new query[256];
    mysql_escape_string(PlayerName(playerid), PlayerName(playerid));
    format(query, sizeof(query), "SELECT * FROM user WHERE username='%s'", PlayerName(playerid));
    SendClientMessageToAll(FARBE_ROT,"JOB 1");
    mysql_tquery(Handle, query, "UserCheck", "i", playerid);
    SendClientMessageToAll(FARBE_ROT,"JOB 2");

    Er springt nichtmal zu "UserCheck", d.h. bei Job 2 ist er fertig... Somit bekomm ich gar keine Dialoge gezeigt!

  • Guten Abend/Morgen xPuma:


    schön das du dich von meinem Tutorial hast inspirieren lassen.
    Mir stellt sich da ein paar Fragen wenn ich mir deinen Code und deinen dazu geschrieben Text genauer anschaue.


    1. Besteht eine Datenbank Verbindung ?
    2. Ist die Funktion PlayerName überhaupt funktionstüchtig ?
    3. Wieso versucht du den String manuell zu Escapen, dafür gibt es mysql_format und %e (statt dem %s ein %e)
    4. Der von dir deklarierte Query ist meiner Meinung nach viel zu groß, 90-128 hätten da bestimmt locker gereicht.
    5. Es wäre doch praktischer wenn du die `` Syntax "befolgst", sieht meiner Meinung nach besser aus und beugt Probleme vor.
    6. Voran erkennst du das UserCheck nicht aufgerufen wird ?


    Schreibe den Code letztes endlich mal so und antworte auf die Fragen.


    new query[128];
    mysql_format(Handle, query, sizeof query, "SELECT * FROM `user` WHERE `username`='%e', PlayerName(playerid)),
    printf("%i,mysql_pquery(dbhandle, query, "UserCheck", "i", playerid));
    Zeig danach mal die server_log.txt


    mfg :thumbup:

  • Hey, erstmal danke für deine Antwort!
    1. Datenbank Verbindung besteht, es wird kein Fehler in der mysqllog gezeigt.
    2. Ja, diese funktioniert einwandfrei!
    3. Kannte die andere Funktion nicht
    4. Hast du recht :D
    5. Done
    6. Ich bekomme Ingame meine Register/Login Dialoge nicht angezeigt. Und durch einen Debug indem ich einfach eine Message ausgegeben lasse wenn UserCheck ausgeführt wird sehe ich das diese Funktion gar nicht ausgeführt wird.


    Mit freundlichen Grüßen
    Puma


  • Hier gibt es ein Tutorial von der Version (R39-3). Vielleicht schaust du mal rein: MySQL R39-3 Register/Login. Hier Klicken!
    Aber wenn du dieses Tutorial auf einem vServer nutzen willst, musst du die R39-2 downloaden, und davon die mysql_static.so nutzen.


    MfG DjNightcore. :)

  • Die geht nicht, hab ich alles getestet. Man sollte die R39-2 mysql_static.so von Linux nehmen, nicht die von Debian.


    MfG DjNightcore. ;)


    Bitte höre auf in diesen Thread zu schreiben wenn du nicht damit auskennst, totaler Quatsch.
    Debian = Linux Betriebssystem.
    Außerdem benutze ich selber die mysql_static.so von R39-3, du kannst mit hoher Wahrscheinlichkeit einfach nicht mit Linux umgehen.


    mfg :thumbup: