MySQL setzt Werte zurück

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
  • Habe in meinem Login/Register System MySQL benutzt und das speichert auch alles korrekt. Wenn ich aber ein falsches Passwort eingebe, werden alle Werte zurückgesetzt, bis auf den Namen, das Passwort, das Geschlecht und das Alter. warum?
    public PasswortAbfrage(playerid)
    {
    new num_fields,num_rows;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows>0)
    {
    TextDrawShowForPlayer(playerid, Time), TextDrawShowForPlayer(playerid, Date);
    pInfo[playerid][Logged] = 1;
    pInfo[playerid][Level] = cache_get_field_content_int(0,"level",dbhandle);
    pInfo[playerid][Geschlecht] = cache_get_field_content_int(0,"sex",dbhandle);
    pInfo[playerid][Alter] = cache_get_field_content_int(0,"age",dbhandle);
    pInfo[playerid][Adminlevel] = cache_get_field_content_int(0,"adminlevel",dbhandle);
    pInfo[playerid][Geld] = cache_get_field_content_int(0,"money",dbhandle);
    pInfo[playerid][Fraktion] = cache_get_field_content_int(0,"faction",dbhandle);
    pInfo[playerid][Rang] = cache_get_field_content_int(0,"rank",dbhandle);
    SetPlayerScore(playerid,pInfo[playerid][Level]);
    new altmoney = GetPlayerMoney(playerid);
    GivePlayerMoney(playerid,-altmoney);
    GivePlayerMoney(playerid,pInfo[playerid][Geld]);
    SetSpawnInfo(playerid,0,29,-1969.4128,137.6455,27.6875,91.5533,0,0,0,0,0,0);
    SpawnPlayer(playerid);
    }
    else
    {
    SetPVarInt(playerid,"badlogin",GetPVarInt(playerid,"badlogin")+1);
    if(GetPVarInt(playerid,"badlogin")<3)
    {
    SendClientMessage(playerid,Rot,"Dieses Passwort war falsch!");
    ShowPlayerDialog(playerid,DIALOG_LOGIN1,DIALOG_STYLE_PASSWORD,"Login","Dein Passwort:","OK","Abbrechen");
    }
    if(GetPVarInt(playerid,"badlogin") >=3)
    {
    SendClientMessage(playerid,Rot,"Du wurdest gekickt, weil du dein Passwort dreimal falsch eingegeben hast!");
    Kick(playerid);
    }
    }
    return 1;
    }

    Wird hier aufgerufen (OnDialogResponse)
    switch(dialogid)
    {
    case DIALOG_LOGIN1:
    {
    if(response)
    {
    new query[256],passwort[40];
    if(strlen(inputtext)>0)
    {
    mysql_escape_string(inputtext,passwort,dbhandle);
    format(query,sizeof(query),"SELECT username,password,sex,age,adminlevel,level,money,faction,rank FROM user WHERE username='%s' AND password='%s'",pname,passwort);
    mysql_function_query(dbhandle,query,true,"PasswortAbfrage","");
    }
    else
    {
    SendClientMessage(playerid,Gelb,"Gib ein Passwort ein!");
    ShowPlayerDialog(playerid,DIALOG_LOGIN1,DIALOG_STYLE_PASSWORD,"Login","Dein Passwort:","OK","Abbrechen");
    }
    }
    else
    {
    Kick(playerid);
    }
    }
    Wenn ich auf dem Server bin und ein Kumpel dazujoint, vertauscht MySQL außerdem einige Werte.. Was los? Ich denke, das liegt daran, dass ich beim Disconnect alle Werte in der Database update. Wenn er gekickt wird, hat er natürlich keine Werte - und alles ist zurückgesetzt. Ich hatte die Idee, dies mit einer Variable zu lösen (wenn sie 1 ist, speichern, wenn 0 nicht), doch es sind ja unterschiedliche Callbacks... Wie dann?

    Greetz

    Einmal editiert, zuletzt von Uppermost ()

  • format(query,sizeof(query),"SELECT username,password,sex,age,adminlevel,level,money,faction,rank FROM user WHERE username='%s' AND password='%s'",pname,passwort);


    Du gibst hier die leere Variable "passwort" aus,
    die Variable brauchst du aber garnicht. Nutze dafür einfach den inputtext:


    format(query,sizeof(query),"SELECT username,password,sex,age,adminlevel,level,money,faction,rank FROM user WHERE username='%s' AND password='%s'",pname,inputtext);



    Wenn ich dir noch einen Tipp geben darf:
    Verwende mysql_format in Kombination mit %e für strings.
    So vermeidest du Query-Fehler :)

  • Naja, die Variable Passwort ist ja oben mit mysql_escape_string definiert, anstatt dem Inputtext, damit keiner Query-Befehle als Passwort schreiben kann und somit die Datenbanken verändern. Wie funktioniert mysql_format genau, und was würde es mir in dieser Situation bringen?? Im Moment geht es mir ja nur darum, dass die Werte beim Disconnect (also beim kick wegen des falschen Passworts) zurückgesetzt werden

    Greetz

  • Fehler gefunden :)


    mysql_function_query(dbhandle,query,true,"PasswortAbfrage","");


    du hast vergessen die parameter zu übergeben.
    So müsste es richtig sein:


    mysql_function_query(dbhandle,query,true,"PasswortAbfrage","i",playerid);