Inputtext mit Datenbankeintrag vergleichen(PUSH)

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


    bin gerade an einem System dran und komme irgendwie nicht drauf, wie ich den Eingabetext, also den Inputtext
    vom Spieler, mit einem Datenbankeintrag vergleichen kann. Sagen wir mal es ist ein Sicherheitspasswort, was
    der Spieler bei der Registration angegeben hat. Sein Problem ist, dass er sein Passwort vergessen hat, aber
    sein Sicherheitscode weiß und die Möglichkeit hat sein Passwort zu ändern. Er macht es und ab da will ich halt
    mal wissen, wie ich seine Eingabe mit seinem früheren Datenbankeintrag vergleichen kann.


    /E: PUSH
    Arbeite weiter an diesem System und habe immer noch das Problem mit der Abfrage.
    Habe zwar, wie von einigen vorgeschlagen, via strcmp verglichen, stoße aber jetzt schon seit einigen
    Stunden auf das Problem, dass der weitere Dialog nicht angezeigt wird:



    if(dialogid == DIALOG_PASSCHANGE_CONFIRM)
    {
    if(!response) return SCM(playerid, -1, "Abgebrochen.");
    if(response)
    {
    if(!strcmp(inputtext, Spieler[playerid][SavePass], false))
    {
    ShowPlayerDialog(playerid, DIALOG_CHANGEPASS_TRUE, DIALOG_STYLE_INPUT,"Passwort-Änderung","Achtung: Du bist gerade dabei dein Passwort zu ändern! Mach dir damit bewusst, dass du erneut /saveacc Vorgang\nmachen >> musst <<, denn wenn dein Passwort geändert werden muss, muss auch das Sicherheitspasswort geändert werden!","Ändern","Abbrechen");
    }
    else
    {
    ocmd_changepassword(playerid, "");
    }
    }
    }

  • Beitrag von Zim30 ()

    Dieser Beitrag wurde vom Autor gelöscht ().
  • Die Abfragen sind schon korrekt. strcmp gibt den Wert zurück, wenn sich die Zeichenketten entsprechen.


    Zeig mal, wie SavePass der Wert zugewiesen wird.



    //Der Enum, wo SavePass als erstes definiert wird (im Enum ist mehr, nur habe ich es zur Übersicht entfernt)
    enum SPDaten
    {
    SavePass,
    }
    new Spieler[MAX_PLAYERS][SPDaten];


    //Dann bei OnPlayerConnect auf 0 gesetzt, damit die ganzen Werte(die ich so habe) per OnUserLogin richtig geladen werden
    Spieler[playerid][SavePass] = 0;


    //Dann bei OnUserLogin
    new spstring[128];
    Spieler[playerid][SavePass] = cache_get_field_content(0, "savepass", spstring, handle);


    //Und als letztes wo es abgespeichert wird unter stock SaveUserStats(playerid);
    new fourthQuery[200];
    format(fourthQuery, sizeof(fourthQuery),"UPDATE users SET savepass = '%s' WHERE id='%d'",
    Spieler[playerid][SavePass],
    Spieler[playerid][p_id]);
    mysql_function_query(handle, fourthQuery, false, "", "");


    // das wars auch schon.

  • Okay ich versuchs nochmal,


    Da SavePass kein String ist, brauchst du auch nicht strcmp sondern den "=="(isequal) oder "!="(isnot) Operator


    ersetze if(!strcmp(inputtext, Spieler[playerid][SavePass], false))
    durch if(strval(inputtext) == Spieler[playerid][SavePass])

  • Okay ich versuchs nochmal,


    Da SavePass kein String ist, brauchst du auch nicht strcmp sondern den "=="(isequal) oder "!="(isnot) Operator


    ersetze if(!strcmp(inputtext, Spieler[playerid][SavePass], false))
    durch if(strval(inputtext) == Spieler[playerid][SavePass])


    Sowohl Inputtext als auch SavePass sind Zeichenketten, also Strings. Es sollen ja nicht nur Zahlen als "Sicherheitspasswort"
    gespeichert und abgefragt werden, sondern alles im Sinne von Zeichen. Also: Zahlen, Buchstaben, Symbole.


    @Zim30


    /E: Habs Probiert, so wie du es geschrieben hast, es wird aber dennoch kein Dialog angezeigt.

  • Also reihen sich einige Fehler aneinander.


    • Du definierst im enum "SavePass" als Integer. Du willst es aber als Zeichenkette nutzen, weshalb du da eine entsprechende Zeichenlänge/Arraygröße anhängen musst.
      BSP: SavePass[4] -> Kannst du als String mit maximal vier Zeichen nutzen
    • Nutz zum Zurücksetzen von Zeichenketten lieber "strdel" -> http://wiki.sa-mp.com/wiki/Strdel
    • Die Zuweisung eines Wertes an Variablen mithilfe von cache_get_field_content funktioniert ein wenig anders als den simplen Rückgabewert zuzuweisen.
      Der dritte Parameter (hier "spstring") bekommt den entsprechend richtigen Inhalt zugewiesen. Somit musst du den Wert von spstring an SavePass weitergeben und diese Zuweisung, die du momentan nutzt, überarbeiten.
      Für die Übergabe kannst du "format" nutzen.
    • Speichern sollte mit den drei Verbesserungen oben funktionieren.
  • So wie du es im enum hast ist es ein Integer


    Code
    enum SPDaten
    {
    	SavePass,
    }


    wenn es ein string werden soll musste der variable noch ne länge zuweisen.



    Code
    enum SPDaten
    {
    	SavePass[SIZE],
    }
  • Der weitere Dialog wird nun angezeigt, aber wenn ich das SaveAcc-Passwort aus der Datenbank eingebe, wird
    die else-Abfrage abgespielt und ich bekomme erneut diesen Dialog; es ist also falsch, obwohl die Eingabe identisch
    dem Datenbankeintrag ist.



    enum SPDaten
    {
    SavePass[128]
    }
    new Spieler[MAX_PLAYERS][SPDaten];


    //OnPlayerConnect
    Spieler[playerid][SavePass] = 0;


    //Der Befehl
    ocmd:changepassword(playerid, params[])
    {
    ShowPlayerDialog(playerid, DIALOG_CHANGEPASSWORD, DIALOG_STYLE_INPUT, "Passwort-Änderung","Gebe hier zuersteinmal das Sicherheitspasswort ein, damit wir uns sicher sind, dass das dein Account ist.\nEs geht um das Sicherheitspasswort, dass du im Befehl /saveacc am Anfang eingegeben hast und es dir gut merken/notieren solltest!","Identifizieren","Abbrechen");
    return 1;
    }


    //Die beiden aufeinanderfolgenden Abfragen
    if(dialogid == DIALOG_CHANGEPASSWORD)
    {
    if(!response) return SCM(playerid, -1, "Abgebrochen.");
    if(response)
    {
    //
    if(!strcmp(inputtext, Spieler[playerid][SavePass], false))
    {
    ShowPlayerDialog(playerid, DIALOG_CHANGEPASS_TRUE, DIALOG_STYLE_INPUT,"Passwort-Änderung","Achtung: Du bist gerade dabei dein Passwort zu ändern! Mach dir damit bewusst, dass du erneut /saveacc Vorgang\nmachen >> musst <<, denn wenn dein Passwort geändert werden muss, muss auch das Sicherheitspasswort geändert werden!","Ändern","Abbrechen");
    }
    else
    {
    ocmd_changepassword(playerid, "");
    }
    }
    }
    if(dialogid == DIALOG_CHANGEPASS_TRUE)
    {
    if(!response) return SCM(playerid, -1, "Abgebrochen.");
    if(response)
    {
    if(strlen(inputtext) < 6 || strlen(inputtext) > 35) return ShowPlayerDialog(playerid, DIALOG_CHANGEPASS_TRUE, DIALOG_STYLE_INPUT,"Passwort-Änderung","Das Passwort darf nicht kürzer als 6 und nicht länger als 35 sein!\nAchtung: Wenn du das Accountpasswort änderst, so musst du das Sicherheitspasswort auch ändern.(/saveacc)","Ändern","Abbrechen");
    mysql_format(handle, pwquery, sizeof(pwquery), "UPDATE users SET password = (MD5('%e')) WHERE pid = '%d'", inputtext, Spieler[playerid][p_id]);
    mysql_function_query(handle, pwquery, true, "OnUserLogin", "d", playerid);
    Spieler[playerid][accSave] = 0;
    ocmd_saveacc(playerid, "");
    }
    }


    //OnUserLogin
    new spstring[128];
    Spieler[playerid][SavePass] = cache_get_field_content(0, "savepass", spstring, handle);


    //Speicherung
    format(fourthQuery, sizeof(fourthQuery),"UPDATE users SET savepass = '%s' WHERE id='%d'",
    Spieler[playerid][SavePass],
    Spieler[playerid][p_id]);


    mysql_function_query(handle, fourthQuery, false, "", "");


    //Das wars mal wieder.

    Einmal editiert, zuletzt von Kristik47 ()

  • Im wiki findet man folgenden schönen Satz: "Return Values: This function does not return any specific values."
    Du kannst die Zuweisung doch einfach machen:


    cache_get_field_content(0, "savepass", Spieler[playerid][SavePass], handle, (Größe)); //Hier editiert: es fehlt die Größe im Fall von direkter Zuweisung zu enum Strings


    bzw.



    cache_get_field_content(0, "savepass", spstring, handle);
    format(Spieler[playerid][SavePass], (Größe), spstring);

  • Vielen Dank, ich habe meinen Fehler gefunden. Ich glaube ich sollte
    pennen gehen :D war ein echt blöder Konzentrationsfehler von mir.


    Ich danke allen, die geholfen habe :)

    Einmal editiert, zuletzt von Kristik47 ()