Globale Variabel in MySQL speichern

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 liebe Breadfish User,


    Ich kam auf die Idee Globale Variabeln die auf lägere Zeit wichtig sind in einer MySQL Tabelle zu speichern.
    Ich habe jetzt momentanaber das Problem, dass ich die Datenbank nicht abfragen kann.


    Bei einem Spieler statet man ja normalerweise so:

    new name[MAX_PLAYER_NAME],query[128];
    GetPlayerName(playerid,name,sizeof(name));
    format(query,sizeof(query),"SELECT id FROM accounts WHERE name='%s'",name);
    mysql_function_query(dbhandle,query,true,"OnUserCheck","i",playerid);

    Bei der Server Tabelle muss ich das ganze ja anders Abfrage, weil ich ja keinen Namen habe, doch was soll ich abfragen?
    Ich wollte es so machen, dass bei OnGameModeInit abgefragt wird ob es eine Datenbank mit der ID 1 gibt.



    new query[128];
    format(query,sizeof(query),"SELECT ? FROM server WHERE id='%i'",1);
    mysql_function_query(dbhandle,query,true,"IsServerDateThere","i",id);

    Was soll ich denn jetzt bei SELECT abfragen oder muss ich da nix Abfragen?



    public IsServerDateThere(id)
    {
    new num_rows,num_fields;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows==0)
    {
    }
    else
    {
    }
    }

    Wie soll ich das ganze denn jetzt bei IsServerDateThere abfragen?


    Desweiteren bekomme ich einen Error: warning 213: tag mismatch in der Zeile

    mysql_function_query(dbhandle,query,true,"IsServerDateThere","i",id);



    Da ich mich mit MySQL nun wirklich nicht auskenne, habe ich leider keine richtige Vorstellung wie das gehen soll.


    Ich freue mich über jede Hilfe
    Hammerfaul


  • format(query,sizeof(query),"SELECT ? FROM server WHERE id='%i'",1);

    In MySQL gibt es soweit ich weiß kein "?" statement.
    Wenn du alles auslesen möchtest, was wohl der fall hier ist benutze " * "

    format(query,sizeof(query),"SELECT * FROM server WHERE id='%i'",1);

  • Und du brauchst dafür keinen unnötigen format, da du ja weißt, dass die ID = 1 sein wird, kannst du das auch einfach so eintragen.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'


  • new dbhandle;


    enum sInfo
    {
    eingeloggt,
    level,
    s_id,
    geld,
    job,
    alevel,
    db_id,
    bank,
    exp,
    geschlecht,
    familie,
    fraktion,
    ZbP,
    VIP,
    Lotto,
    Wanted,
    Fische,
    Drogen,
    Zeit,
    iq
    }


    public OnGameModeInit()
    {
    //MySQL
    dbhandle = mysql_connect(db_host,db_user,db_db,db_pass);
    }


    public OnPlayerConnect(playerid)
    {
    //Login/Register
    new name[MAX_PLAYER_NAME],query[128];
    GetPlayerName(playerid,name,sizeof(name));
    format(query,sizeof(query),"SELECT id FROM accounts WHERE name='%s'",name);
    mysql_function_query(dbhandle,query,true,"OnUserCheck","i",playerid);
    }


    public OnUserCheck(playerid)
    {
    new num_rows,num_fields;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows==0)
    {
    //Registrierung
    ShowPlayerDialog(playerid,DIALOG_REG,DIALOG_STYLE_INPUT,"Registrierung","Willkommen bei der Registrierung von ihrem neuen Account.\nDas Passwort muss aus Sicherheitsgründen mindestens 5 Zeichen lang sein.\nGeben sie bitte ihr gewünschtes Passwort ein:","Bestätigen","Beenden");
    }
    else
    {
    //Login
    if(pwtry[playerid] < 2) //noch versuche frei
    {
    ShowPlayerDialog(playerid,DIALOG_LOG,DIALOG_STYLE_PASSWORD,"Login","Ihr Account wurde gefunden.\nBitte geben sie ihr Passwort ein:","Bestätigen","Beenden");
    }
    else //keine versuche frei
    {
    SendClientMessageToAll(SERVER,"Fehler 3");
    kText(playerid,"Sie haben das Passwort 3 Mal falsch eingegeben und wurden nun vom Server gebannt.");
    kText(playerid,"Setzen sie sich mit einem Admin in Verbindung damit dieser sie wieder entbannt.");
    }
    }
    return 1;
    }


    public OnPasswortResponse(playerid)
    {
    new num_fields,num_rows;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(pwtry[playerid] < 2) //noch versuche frei
    {
    if(num_rows==1)
    {
    //Passwort richtig
    SpielerInfo[playerid][eingeloggt] = 1; //eingeloggt setzen
    SpielerInfo[playerid][db_id] = cache_get_field_content_int(0,"db_id",dbhandle); //db_id setzen
    SpielerInfo[playerid][job] = cache_get_field_content_int(0,"job",dbhandle); //job setzen
    SpielerInfo[playerid][alevel] = cache_get_field_content_int(0,"alevel",dbhandle); //alevel setzen
    SpielerInfo[playerid][s_id] = cache_get_field_content_int(0,"id",dbhandle); //id setzen
    SpielerInfo[playerid][level] = cache_get_field_content_int(0,"level",dbhandle); //level setzen
    SpielerInfo[playerid][bank] = cache_get_field_content_int(0,"bank",dbhandle); //bank setzen
    SpielerInfo[playerid][exp] = cache_get_field_content_int(0,"exp",dbhandle); //exp setzen
    SpielerInfo[playerid][geschlecht] = cache_get_field_content_int(0,"geschlecht",dbhandle); //geschlecht setzen
    SpielerInfo[playerid][familie] = cache_get_field_content_int(0,"familie",dbhandle); //familie setzen
    SpielerInfo[playerid][fraktion] = cache_get_field_content_int(0,"fraktion",dbhandle); //fraktion setzen
    SpielerInfo[playerid][ZbP] = cache_get_field_content_int(0,"ZbP",dbhandle); //ZbP setzen
    SpielerInfo[playerid][VIP] = cache_get_field_content_int(0,"VIP",dbhandle); //VIP setzen
    SpielerInfo[playerid][Lotto] = cache_get_field_content_int(0,"Lotto",dbhandle); //Lotto setzen
    SpielerInfo[playerid][Wanted] = cache_get_field_content_int(0,"Wanted",dbhandle); //Wanted setzen
    SpielerInfo[playerid][Fische] = cache_get_field_content_int(0,"Fische",dbhandle); //Fische setzen
    SpielerInfo[playerid][Drogen] = cache_get_field_content_int(0,"Drogen",dbhandle); //Drogen setzen
    SpielerInfo[playerid][Zeit] = cache_get_field_content_int(0,"Zeit",dbhandle); //Zeit setzen
    SpielerInfo[playerid][iq] = cache_get_field_content_int(0,"iq",dbhandle); //iq setzen
    SetPlayerMoney(playerid,cache_get_field_content_int(0,"geld",dbhandle)); //geld setzen
    SetPlayerScore(playerid,SpielerInfo[playerid][level]); //level setzen
    SendClientMessage(playerid,RICHTIG,"Sie haben sich erfolgreich eingeloggt");
    //noob spawn
    //SetSpawnInfo( playerid,0,0,-207.3559,1118.9818,20.4297,273.1605,0,0,0,0, 0, 0 );
    SetSpawnInfo( playerid,0,0,-188.7771,1170.0776,19.5993,273.1605,0,0,0,0, 0, 0 );
    if(SpielerInfo[playerid][eingeloggt] == 1)
    {
    SpawnPlayer(playerid);
    if(SpielerInfo[playerid][iq] == 0)
    {
    ShowPlayerDialog(playerid,DIALOG_IQTEST1,DIALOG_STYLE_MSGBOX,"IQ Test","Sie müssen nun 10 Fragen beantworten.","Weiter","Verlassen");
    }
    }
    loadPlayerCars(playerid);
    }
    else
    {
    //Passwort falsch
    pwtry[playerid] = pwtry[playerid] +1;
    new ueberschirft[50],text[128],versuche;
    versuche = 3-pwtry[playerid];
    format(ueberschirft,sizeof(ueberschirft),"{00FF00}Login - {FF0000}Versuch %i/%i",versuche,maxpw);
    format(text,sizeof(text),"Sie haben nur noch %i Versuche.\nBitte geben sie ihr Passwort ein:",versuche,maxpw);
    ShowPlayerDialog(playerid,DIALOG_LOG,DIALOG_STYLE_PASSWORD,ueberschirft,text,"Bestätigen","Beenden");
    }
    }
    else //keine versuche frei
    {
    kText(playerid,"Sie haben das Passwort 3 Mal falsch eingegeben und wurden nun vom Server gebannt.");
    kText(playerid,"Setzen sie sich mit einem Admin in Verbindung damit dieser sie wieder entbannt.");
    }
    return 1;
    }


    if(dialogid==DIALOG_REG)
    {
    if(response)
    {
    new name[MAX_PLAYER_NAME],query[128],passwort[35];
    GetPlayerName(playerid,name,sizeof(name));
    if(strlen(inputtext) < 5)
    {
    //kleiner als 5 Zeichen
    ShowPlayerDialog(playerid,DIALOG_REG,DIALOG_STYLE_INPUT,"Registrierung","Bitte beachten sie die mindestens Anzahl von 5 Zeichen.\nGeben sie bitte ihr gewünschtes Passwort ein:","Bestätigen","Beenden");
    }
    else
    {
    //registrierung
    mysql_escape_string(inputtext,passwort,dbhandle);
    format(query,sizeof(query),"INSERT INTO accounts (name,passwort) VALUES ('%s',MD5('%s'))",name,passwort);
    mysql_function_query(dbhandle,query,true,"OnPlayerRegister","i",playerid);
    SendClientMessage(playerid,RICHTIG,"Die Registierung ist abgeschlosen. Sie sind nun eingeloggt.");
    ShowPlayerDialog(playerid,DIALOG_IQTEST1,DIALOG_STYLE_INPUT,"IQ Test","Sie müssen nun 20 Fragen beantworten.","Weiter","Verlassen");
    SpielerInfo[playerid][eingeloggt] = 1;
    //SetSpawnInfo( playerid,0,0,-207.3559,1118.9818,20.4297,273.1605,0,0,0,0, 0, 0 );
    SetSpawnInfo( playerid,0,0,-188.7771,1170.0776,19.5993,273.1605,0,0,0,0, 0, 0 );
    if(SpielerInfo[playerid][eingeloggt] == 1)
    {
    SpawnPlayer(playerid);
    }
    }
    }
    else
    {
    kText(playerid,"Sie haben die Registierungsvorgang abgebrochen.");
    }
    return 1;
    }


    SpielerSpeichern(playerid) //Speichern
    {
    if(SpielerInfo[playerid][eingeloggt]==0)return 1;
    new query[1024];
    format(query,sizeof(query),"UPDATE accounts SET level = '%i',geld = '%i',job = '%i',alevel = '%i',db_id = '%i',bank = '%i',exp = '%d',geschlecht = '%i',familie = '%i',fraktion = '%i',ZbP = '%i',VIP = '%i',Lotto = '%i',Wanted = '%i',Fische = '%i',Drogen = '%i',Zeit = '%i',iq = '%i' WHERE `id` = %i",
    SpielerInfo[playerid][level], //Speichern Level
    GetPlayerMoney(playerid), //Speichern Geld
    SpielerInfo[playerid][job], //speichern job
    SpielerInfo[playerid][alevel], //speichern admin
    SpielerInfo[playerid][db_id], //speichern db_id
    SpielerInfo[playerid][bank], //speichern bank
    SpielerInfo[playerid][exp], //speichern exp
    SpielerInfo[playerid][geschlecht],//geschlecht speichern
    SpielerInfo[playerid][familie], //familie speichern
    SpielerInfo[playerid][fraktion], //fraktion speichern
    SpielerInfo[playerid][ZbP], //ZbP speichern
    SpielerInfo[playerid][VIP], //VIP speichern
    SpielerInfo[playerid][Lotto], //Lotto speichern
    SpielerInfo[playerid][Wanted], //Wanted speichern
    SpielerInfo[playerid][Fische], //Fische speichern
    SpielerInfo[playerid][Drogen], //Drogen speichern
    SpielerInfo[playerid][Zeit], //Zeit speichern
    SpielerInfo[playerid][iq], //iq speichern
    SpielerInfo[playerid][s_id]
    );
    mysql_function_query(dbhandle,query,false,"","");
    return 1;
    }


    Halt das Typische aber es geht ja garnicht um die accounts sondern wie erstelle ich einen neue Zeile in meiner tabelle für meinen Server und wie update ich die.
    Dazu kommt der Error denn ich nicht verstehe weil die Zeile von accounts und server sich ähnlich sind und ich da eig nichts vergessen habe.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Sorry, hab ich gar nicht gesehen. Daran liegt es auch nicht.


    Bleibt eigentlich nur noch, dass du "id" irgendwie falsch definiert hast.
    Poste mal die um
    mysql_function_query(dbhandle,"SELECT * FROM server WHERE id='1'",true,"IsServerDateThere","i",id);
    dazugehörigen Zeilen, vor allem mit der Deklaration von "id".


    Und kommt die Warnung wenn du die Zeile auskommentierst?

  • Da haben wir doch den Fehler. Du kannst keinen enum-Eintrag als Variable verwenden.
    Du musst dort die Variable nehmen, für die du das enum erstellt hast.


    Irgendwo musst du "new irgendwas[SerInfo]" haben, oder? Post das mal.



    Oder du machst es eben so, wenn du nur die 1 mitgeben willst.
    mysql_function_query(dbhandle,query,true,"IsServerDateThere","i",1);


  • [17:23:40] [DEBUG] mysql_tquery - connection: 1, query: "SELECT * FROM server WHERE id='1'", callback: "IsServerDateThere", format: "i"
    [17:23:40] [DEBUG] CMySQLQuery::CMySQLQuery() - constructor called
    [17:23:40] [DEBUG] mysql_tquery - scheduling query "SELECT * FROM server WHERE id='1'"..
    [17:23:40] [DEBUG] cache_get_data - connection: 1
    [17:23:40] [WARNING] cache_get_data - no active cache
    [17:23:40] [DEBUG] CMySQLQuery::Execute[IsServerDateThere(i)] - starting query execution
    [17:23:40] [DEBUG] CMySQLQuery::Execute[IsServerDateThere(i)] - query was successful
    [17:23:40] [DEBUG] CMySQLResult::CMySQLResult() - constructor called
    [17:23:40] [DEBUG] CMySQLQuery::Execute[IsServerDateThere(i)] - data being passed to ProcessCallbacks()
    [17:23:40] [DEBUG] Calling callback "IsServerDateThere"..
    [17:23:40] [DEBUG] cache_get_data - connection: 1
    [17:23:40] [DEBUG] CMySQLResult::~CMySQLResult() - deconstructor called
    [17:23:40] [DEBUG] CMySQLQuery::~CMySQLQuery() - deconstructor called

  • Da lese ich sie aus.



    public IsServerDateThere(ser_id)
    {
    new num_rows,num_fields;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows==0)
    {


    }
    else
    {


    }
    return 1;
    }


    Hier soll erstellt oder abgefragt werden doch da habe ich ja um hilfe gebeten weil ich da ja nicht weiß wie ich das machen soll.


    So mir ist grade aufgefallen, dass ich beim server das IsServerDaraThere weglassen könne und dann das IsServerDaraThere direkt in GameModeInit schreiben könne.


    Das sieht jetzt so aus:

    public OnGameModeInit()
    {
    //MySQL
    dbhandle = mysql_connect(db_host,db_user,db_db,db_pass);

    mysql_debug(1);

    //server daten
    new num_rows,num_fields;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows==0)
    {

    }
    else
    {
    mysql_function_query(dbhandle,"SELECT * FROM server WHERE id='1'",true,"IsServerDateThere","i",1);
    }
    }


    Ich kann sie jetzt nur abfragen aber noch nicht erstellen. Wie soll das denn gehen?


    So ich bin jetzt soweit das ich meiner meinung nach alles richtig gemacht ahbe doch ich bekomme momentan noch mysql fehler:


    [21:02:54] [DEBUG] cache_get_data - connection: 1
    [21:02:54] [WARNING] cache_get_data - no active cache
    [21:02:54] [DEBUG] cache_get_field_content_int - row: 0, field_name: "buergerm", connection: 1
    [21:02:54] [WARNING] cache_get_field_content_int - no active cache
    [21:02:54] [DEBUG] cache_get_field_content_int - row: 0, field_name: "lottoerg", connection: 1
    [21:02:54] [WARNING] cache_get_field_content_int - no active cache

    Einmal editiert, zuletzt von Hammerfaul ()