MySQL Speicher fehler? Warum???

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
  • Hallo Breadfish-Community,


    ich benötige Hilfe was mit MySQL zu tun hat :D


    Da ich mein Script von Dini auf MySQL am umschreiben bin komme ich mit einer Funktion irgendwie nicht zurecht, diese wäre die Account Speicherung Funktion!


    Ich habe mir sämtliche Tutorials, Threads auf Forun angeschaut aber diese Funktioniert kein Stück!


    Bei Gamemodeinit das es jede 15 Minuten Speichern soll:

    SetTimer("savePlayer", 900000, 1);//Jede 15 Minuten werden Spielerdaten gespeichert!


    Hier soll dies abgespeichert werden:

    forward savePlayer(playerid);
    public savePlayer(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    new query[2050], pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pName, sizeof(pName));
    format(query,sizeof(query),"UPDATE accounts SET Level='%d', Geld='%d', Muted='%d', Bank='%d', Kredit='%d' KreditDauer='%d', Kills='%d', Deaths='%d', Materials='%d' WHERE id='%i'",
    PlayerInfo[playerid][pLevel],GetPlayerMoney(playerid),PlayerInfo[playerid][pMuted],PlayerInfo[playerid][pAccount],PlayerInfo[playerid][pPlayerKredit],PlayerInfo[playerid][pKills],PlayerInfo[playerid][pDeaths],PlayerInfo[playerid][pMats],PlayerInfo[playerid][db_id]);
    mysql_function_query(dbhandle,query,false,"","");


    printf("SAVE: %s Account hat gespeichert!",pName);
    }
    return 1;
    }


    Falls der Spieler Disconnecten sollte dann soll sein Account auch gespeichert werden:

    Function OnPlayerDisconnect(playerid, reason)
    {
    if(IsPlayerConnected(playerid))
    {
    savePlayer(playerid);
    }


    Mein Problem ist folgendes, das wenn ich neues Level habe und auf meinem Bankkonto Geld drauf geladen habe und Geld von der Hand bezahlt hab und dann den Server verlasse
    steht zwar in den Serverlog das die Accounts vollständig gespeichert worden sind aber wenn ich nachschaue in der Datenbank dann wurde nichts gespeichert -.-


    Ich benötige Hilfe, da ich irgendwie verwirrt bin und nicht weiß was ich falsch gemacht habe!


    Vielen Dank für eure im Vorraus!!!


    Lg
    J0a9

  • Hallo Jeffry,


    ich habe es jetzt auch mit der MySQL Debug Funktion ausprobiert.
    Derzeitig bekomme ich diesen Fehler:



    [01:00:41] [ERROR] CMySQLQuery::Execute[()] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(Bank) VALUES ('100') WHERE id='2'' at line 1

    habe auch nachgeschaut im Script habe aber nicht die Zeile gefunden wo dieser Fehler steht...


    Außer dem Timer ist ja auch das wenn man den Server verlässt das dann auch gespeichert werden soll, meinst du ich soll unter OnPlayerDisconnect ohne "IsPlayerConnected" nehmen?


    Lg
    J0a9

  • Ja, das könntest du mal raus nehmen, wenn du das mit der Schleife noch nicht hast.


    Der Fehler ist auf jeden Fall ein INSERT, und die Uhrzeit passt auch nicht so ganz.
    Ggf. suche mal nach "(Bank)", da ist der Fehler im query, das hat aber nichts damit zu tun, dass dein Spieler nicht gespeichert wird.
    Da muss auf jeden Fall was drin stehen (auch von der Zeit her), wenn du den Server verlässt (die IsPlayerConnected Abfrage machst du mal raus).

  • Hallo Jeffry,


    so hab die Schleife rausgenommen und auch das mit (Bank) gefixt.
    Auch bei GamemodeInit habe ich den Timer herausgenommen aber es speichert immer noch nicht!


    Ich verstehe es nicht wenn ich bei /setstat das mache speichert er es sofort ein aber wenn ich ohne /setstat was aufm Server mache und normal geld erarbeite oder ausgebe wird dies nicht gespeichert aber ich meine jetzt nicht nur das Geld abspeichern sondern generell den Account.


    Ich weiß echt nicht warum bzw woran es liegt...


    Lg
    J0a9

  • Schreibe es bitte mal so, und poste dann was im Server Log und im MySQL Log steht (den MySQL Log zuvor leer machen, damit du weißt was neu ist).


    forward savePlayer();
    public savePlayer()
    {
    printf("savePlayer aufgerufen");
    for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    new query[512], pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pName, sizeof(pName));
    format(query,sizeof(query),"UPDATE accounts SET Level='%d', Geld='%d', Muted='%d', Bank='%d', Kredit='%d' KreditDauer='%d', Kills='%d', Deaths='%d', Materials='%d' WHERE id='%i'",
    PlayerInfo[playerid][pLevel],GetPlayerMoney(playerid),PlayerInfo[playerid][pMuted],PlayerInfo[playerid][pAccount],PlayerInfo[playerid][pPlayerKredit],PlayerInfo[playerid][pKills],PlayerInfo[playerid][pDeaths],PlayerInfo[playerid][pMats],PlayerInfo[playerid][db_id]);
    mysql_function_query(dbhandle,query,false,"","");
    printf("query: %s", query);
    printf("SAVE: %s Account hat gespeichert!",pName);
    }
    }
    return 1;
    }

  • Hallo Jeffry,


    so ich hab es getestet und dies wurde im Serverlog ausgeschrieben:



    [20:28:47] savePlayer aufgerufen
    [20:28:47] query: UPDATE accounts SET Level='4', Geld='984', Muted='0', Bank='0', Kredit='0' KreditDauer='0', Kills='0', Deaths='0', Materials='7' WHERE id=''
    [20:28:47] SAVE: Joa955 Account hat gespeichert!
    [20:28:47] [part] Joa955 has left the server (2:1)


    Wenn ich aber in der Datenbank per PHPMyAdmin nachschaue hat sich nichts geändert...


    Lg
    Joa9

  • Hey,


    so habs jetzt erneut getestet, dies wurde in den Serverlogs ausgeschrieben:



    [22:08:58] query: UPDATE accounts SET Level='4', Geld='984', Muted='0', Bank='0', Kredit='0' ,KreditDauer='0', Kills='0', Deaths='0', Materials='7' WHERE id=''
    [22:08:58] SAVE: Joa955 Account hat gespeichert!
    [22:08:58] [part] Joa955 has left the server (2:1


    Ich habe jetzt auch das Komma hingetahn funktioniert immer noch nich -.-


    Lg
    J0a9

  • Schau mal ganz hinten bei id, das ist leer. Und das liegt daran, dass die Kredit Dauer bei den Variablen (das ganze Zeug am Ende im format) fehlt. Da muss nach
    PlayerInfo[playerid][pPlayerKredit]
    noch die Variable mit der Dauer hin. ;)





    EDIT:
    J0a9: Perfekt! :good:

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Hallo Jeffry,




    aaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhh Funktioniert!!!!


    Vielen vielen Dank für deine Geduld und Hilfe und auch all den anderen die mir geholfen haben :D


    Ich hab einfach nicht ganz aufgepasst beim lesen des Serverloges aber jetzt habe ich etwas neues dazu gelernt was mit MySQL Speichern betrifft :D


    Lg
    Joa9