Speicher fehler

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
  • Folgendes Problem: Beim Registrieren eines neuen Spielers gibt er das Level aber kein Geld. Beim Speichern Speichert er das Level aber nicht.


    if(dialogid == DIALOG_REGISTER){
    if(response){
    new query[1024],passwort[35];
    if(strlen(inputtext) >= 6){
    mysql_escape_string(inputtext,passwort,mysql);
    format(query,sizeof(query),"INSERT INTO accounts (Name,Passwort) VALUES ('%s',MD5('%s')) ",SpielerName(playerid),passwort);
    mysql_function_query(mysql,query,false,"","");

    sInfo[playerid][pEingeloggt] = 1;
    sInfo[playerid][pLevel] = 1;

    SetSpawnInfo( playerid, 0, 289, 1511.8359, -1713.5916, 14.0469, 222.1692, 0, 0, 0, 0, 0, 0 );
    SpawnPlayer(playerid);

    SetPlayerScore(playerid,sInfo[playerid][pLevel]);
    SetPlayerMoney(playerid,150);
    } else {
    new input[200];
    format(input,sizeof(input),"{908B8E}Das Passwort ist nicht lang genug. (min. {FF9E00}6{908B8E} Zeichen)\nGebe hier dein gewünschtes Passwort ein, mit welchem du dich registrieren möchtest!");
    ShowPlayerDialog(playerid,DIALOG_REGISTER,3,"{FF9E00}Registrierung",input,"Absenden","Verlassen");
    }
    } else {
    Kick(playerid);
    }
    return 1;
    }


    stock SpielerSpeichern(playerid){


    if(sInfo[playerid][pEingeloggt] == 0) return 1;
    new query[1024];
    format(query,sizeof(query),"UPDATE accounts SET Level='%i',Geld='%i', Admin='%i' WHERE ID='%i'",sInfo[playerid][pLevel],GetPlayerMoney(playerid),sInfo[playerid][pAdmin],sInfo[playerid][pDBID]);
    mysql_function_query(mysql,query,false,"","");
    return 1;
    }


    stock SetPlayerMoney(playerid,money){
    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid,money);
    return 1;
    }

    Mit freundlichen Grüßen,
    Derakar

  • Ein Anticheat habe ich nicht.


    Hier der Code:

    Code
    [21:21:53] [DEBUG] CMySQLQuery::Execute[] - starting query execution
    [21:21:53] [DEBUG] CMySQLQuery::Execute[] - query was successfully executed within 37.678 milliseconds
    [21:21:53] [DEBUG] CMySQLQuery::Execute[] - no callback specified, skipping result saving

    Mit freundlichen Grüßen,
    Derakar

  • Da fehlt der Code vom Query.
    Schreibe es mal so, und poste dann was im server_log.txt steht:
    stock SpielerSpeichern(playerid){


    printf("SpielerSpeichern für %d", playerid);
    if(sInfo[playerid][pEingeloggt] == 0) return 1;
    new query[1024];
    format(query,sizeof(query),"UPDATE accounts SET Level='%i',Geld='%i', Admin='%i' WHERE ID='%i'",sInfo[playerid][pLevel],GetPlayerMoney(playerid),sInfo[playerid][pAdmin],sInfo[playerid][pDBID]);
    printf("query: %s", query);
    mysql_function_query(mysql,query,false,"","");
    return 1;
    }

  • So hier der Code:

    Code
    [21:36:09] [join] awdawd has joined the server (0:127.0.0.1)
    [21:36:16] SpielerSpeichern für 0
    [21:36:16] query: UPDATE accounts SET Level='1',Geld='150', Admin='0' WHERE ID='0'
    [21:36:16] [part] awdawd has left the server (0:1)


    Hier in der DB:

    Mit freundlichen Grüßen,
    Derakar

  • Mhm vielleicht liegt es da dran. Hier mal ein Screen der ganzen DB:


    Wobei es aber beim Speichern von bereits vorhandenen Accounts funktioniert.
    Das liegt auf jedenfall beim Registrieren.

    Mit freundlichen Grüßen,
    Derakar

  • Beim Connecten hole ich mir ja die ID siehe OnPlayerConnect:


    new query[128];
    format(query,sizeof(query),"SELECT ID FROM accounts WHERE Name='%s'",SpielerName(playerid));
    mysql_function_query(mysql,query,true,"CheckUser","i",playerid);

    Mit freundlichen Grüßen,
    Derakar

  • ok aber in welchen mysql_function_query muss dann das dann? oder kommt der Rest davon dann in den Callback vom auslesen?


    Also so funktioniert das auch nicht:


    new query[1024],query2[1024],passwort[35];
    if(strlen(inputtext) >= 6){
    mysql_escape_string(inputtext,passwort,mysql);
    format(query,sizeof(query),"INSERT INTO accounts (Name,Passwort) VALUES ('%s',MD5('%s')) ",SpielerName(playerid),passwort);
    mysql_function_query(mysql,query,false,"","");
    format(query2,sizeof(query2),"SELECT ID FROM accounts WHERE Name='%s'",SpielerName(playerid));
    mysql_function_query(mysql,query,true,"Registered","i",playerid);
    }


    public Registered(playerid)
    {
    sInfo[playerid][pEingeloggt] = 1;
    sInfo[playerid][pLevel] = 1;

    SetSpawnInfo( playerid, 0, 289, 1511.8359, -1713.5916, 14.0469, 222.1692, 0, 0, 0, 0, 0, 0 );
    SpawnPlayer(playerid);

    SetPlayerScore(playerid,sInfo[playerid][pLevel]);
    GivePlayerMoney(playerid,150);
    mysql_log(LOG_ALL);
    return 1;
    }

    Mit freundlichen Grüßen,
    Derakar

    Einmal editiert, zuletzt von Derakar ()

  • Warum so umständlich? Schreibe doch einfach das bei der Registrierung rein:
    format(query,sizeof(query),"SELECT ID FROM accounts WHERE Name='%s'",SpielerName(playerid));
    mysql_function_query(mysql,query,true,"CheckUser","i",playerid);


    Dein CheckUser, welches du nicht gepostet hast, sollte ja das machen, was ich annehme.

  • Der CheckUser ist der hier: Der hoch sich ja die ID und schaut ob es den Spieler gibt.


    public CheckUser(playerid)
    {
    new num_rows, num_fields;
    cache_get_data(num_rows, num_fields, mysql);
    if(num_rows == 0){
    //Registrierung
    new input[200];
    format(input,sizeof(input),"{908B8E}Herzlich Willkommen auf {FF9E00}%s{908B8E}!\nDein Account wurde nicht in der Datenbank gefunden.\nGebe hier dein gewünschtes Passwort ein, mit welchem du dich registrieren möchtest!",SERVERNAME);
    ShowPlayerDialog(playerid,DIALOG_REGISTER,3,"{FF9E00}Registrierung",input,"Absenden","Verlassen");
    }
    else
    {
    //Login
    new input[200];
    format(input,sizeof(input),"{908B8E}Willkommen zurück auf {FF9E00}%s{908B8E}!\nDein Account wurde in der Datenbank gefunden.\nGebe hier bitte dein Passwort ein, welches du bei der Registrierung gewählt hast.",SERVERNAME);
    ShowPlayerDialog(playerid,DIALOG_LOGIN,3,"{FF9E00}Login",input,"Absenden","Verlassen");
    }
    return 1;
    }

    Mit freundlichen Grüßen,
    Derakar

  • Oh ich denke das ist dann nur hier:


    public OnPasswortResponse(playerid)
    {
    new num_rows,num_fields;
    cache_get_data(num_rows,num_fields,mysql);
    if(num_rows == 1){
    sInfo[playerid][pEingeloggt] = 1;
    sInfo[playerid][pDBID] = cache_get_field_content_int(0,"ID",mysql); // HIER
    sInfo[playerid][pLevel] = cache_get_field_content_int(0,"Level",mysql);
    SetPlayerScore(playerid,sInfo[playerid][pLevel]);
    SetPlayerMoney(playerid,cache_get_field_content_int(0,"Geld",mysql));
    sInfo[playerid][pAdmin] = cache_get_field_content_int(0, "Admin",mysql);

    SetSpawnInfo( playerid, 0, 289, 1511.8359, -1713.5916, 14.0469, 222.1692, 0, 0, 0, 0, 0, 0 );
    SpawnPlayer(playerid);
    } else {
    new input[200];
    format(input,sizeof(input),"{908B8E}Das angegebene Passwort ist nicht korrekt.\nGebe hier bitte dein Passwort ein, welches du bei der Registrierung gewählt hast.",SERVERNAME);
    ShowPlayerDialog(playerid,DIALOG_LOGIN,3,"{FF9E00}Login",input,"Absenden","Verlassen");
    }
    return 1;
    }

    Mit freundlichen Grüßen,
    Derakar

  • Ok, das ist ja dann das Problem, dass es nur für registrierte Spieler geladen wird, aber nicht für Spieler die sich neu registrieren.
    public AfterRegister(playerid)
    {
    new num_rows,num_fields;
    cache_get_data(num_rows,num_fields,mysql);
    if(num_rows == 1){
    sInfo[playerid][pDBID] = cache_get_field_content_int(0,"ID",mysql);
    }
    return 1;
    }


    Und beim registrieren:
    format(query,sizeof(query),"SELECT ID FROM accounts WHERE Name='%s'",SpielerName(playerid));
    mysql_function_query(mysql,query,true,"AfterRegister","i",playerid);

  • So hast du ein Callback weniger :D



    format(query,sizeof(query),"INSERT INTO accounts (Name,Passwort) VALUES ('%s',MD5('%s')) ",SpielerName(playerid),passwort);
    mysql_function_query(mysql,query,true,"GetDBID","i",playerid);


    forward GetDBID(playerid);
    public GetDBID(playerid) {
    sInfo[playerid][pDBID] = cache_insert_id();
    return 1;
    }