mysql login & register problem [cache]

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
  • unter Ondialogresponse
    case DIALOG_LOGIN:
    {
    if(response == 0)
    {
    SendClientMessage(playerid,COLOR_GREY,"Du hast den Vorgang abgebrochen.");
    Kick(playerid);
    }
    if(response == 1)
    {
    if(strlen(inputtext) == 0)
    {
    // ungültiges pw
    }
    new query[160];
    format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerName(playerid));
    mysql_function_query(mysql, query, true, "Passwortabfrage", "si", inputtext, playerid);
    }
    }




    forward Passwortabfrage(inputtext[],playerid);
    public Passwortabfrage(inputtext[],playerid)
    {
    new speicher[64];
    cache_get_row(0,2,speicher);
    if(!strcmp(MD5_Hash(inputtext),speicher),true) // hier der Warningcode
    {
    SetPVarInt(playerid, "loggedin", 1);
    }
    else
    {
    // login dialog usw..
    }
    }


    jetzt bekomme ich folgenden Warning code:


    Code
    warning 206: redundant code: constant expression is non-zero


    weiß jemand evtl. weswegen dieser Warning-Code zustande kommt bzw. wie man ihn entfernt?

  • Alles soweit richtig, bis auf die markierte Zeile.
    Änder diese zu:


    if(!strcmp(MD5_Hash(inputtext),speicher, false))


    Noch was zum Nachlesen dazu: Strcmp.


    Außerdem noch ein Tipp:
    Warum fragst du alle Daten vom Account ab, wenn du nur das Passwort benötigst?


    format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerName(playerid));


    Trage dort statt dem * den Spaltennamen vom Passwort ein.


    Mfg,
    UncleSub

  • Vielen Dank für die Hilfe, jedenfalls würde


    cache_get_row(0,2,speicher);


    sich mit


    format(query, sizeof(query), "SELECT `Passwort` FROM `accounts` WHERE `Name` = '%s'", PlayerName(playerid));


    irgendwie nicht vertragen, bzw. ich wüsste nicht wie ich dann nur das Passwort in eine Variable abspeicher.


  • Sollte es ihrgend welche problem mit cache_get_row geben hast du noch eine zusätzliche möglichkeit


    cache_get_field_content zu benutzen


    verwendungsbeispiel:


    cache_get_field_content(0,"Password",speicher);


    er bezieht sich dann direkt auf die Spalte da muss man dann nicht die Spalten abzählen um die richtige auszulesen.


    Was man noch anmerken sollte ist das du am besten mysql_format benutzt und beim Platzhalter für den namen '%e'
    damit werden die strings escaped und somit kannst du auch SQL Injections vermeiden sollte auch dort gemacht werden wo der spieler
    eingriff auf die querys hat.

  • Du kannst es auch so gestalten:


    format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `Name` = '%s' AND `pass` = '%s';", PlayerName(playerid), MD5_Hash(inputtext));


    Wenn nichts returnt wird ist das Passwort inkorrekt ansonsten kannst gleich den Account laden.

  • Ich würde gerne Wissen wie ich nun Variablen setzen kann die ich aus der DB auslese, ich hab versucht es so zu machen:


    forward LoadAccount(playerid);
    public LoadAccount(playerid)
    {
    if(GetPVarInt(playerid, "loggedin") == 1)
    {
    cache_get_field_content(0,"Name", SpielerInfo[playerid][pName]);
    cache_get_field_content(0,"Adminrang", SpielerInfo[playerid][pAdminrang]);
    cache_get_field_content(0,"Fraktion", SpielerInfo[playerid][pFraktion]);
    }
    }


    kp, geht jedenfalls nicht ^^

  • forward LoadAccount(playerid);
    public LoadAccount(playerid)
    {
    if(GetPVarInt(playerid, "loggedin") == 1)
    {
    new data[20];
    cache_get_field_content(0,"Name", SpielerInfo[playerid][pName]);
    cache_get_field_content(0,"Adminrang", data);
    cache_get_field_content(0,"Fraktion", data);
    }
    }



    da musst du konvertieren mit strval oder floatstr entweder in ein integer oder in eine float je nach dem bei bools reicht es auch in ein integer da es ein zuweisungsoperator gibt
    um werte zu "konvertieren" in true oder false.



    beispiel bei dir :
    strval(data) = SpielerInfo[playerid][pAdminrang];


    warum nun data ?
    Es wird ein string zurück gegeben und das immer um diesen nutzen zu können brauchst du einen zweit string umbedingt ist das nicht möglich man könnte auch alles mti dem name machen und diesen zum schluss auslesen aber nun gut du brauchst einen string da die ganze cache funktionen strings zurück geben in ihrem so gesehen 3 Parameter wenn man 0 nicht bei 0 beginnt , jedoch sieht man e sja eindeutig. Den jeweiligen string kann man nicht an integer weiter geben mit dem selben wert den sie enthalten somit muss man das
    ganze umkonvertieren wie schon genannt mit strval oder floatstr je nach dem.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen