Mysql Frage

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
  • Guten Tag Community,


    Ich habe jetzt meinen stock SpielerSpeichern in Mysql querys umgeschrieben da es ja Ressourcen Schonender ist so sieht es jetzt. Als Beispiel nur 1 Zeile :



    new query[2048];
    format(query, sizeof(query), "UPDATE `accounts` SET Level = '%d',AdminLevel = '%d',Supporter = '%d',DonateRank = '%d',UpgradePoints = '%d',ConnectedTime = '%d',Registered = '%d',Sex = '%d',Alter = '%d',Origin = '%d' WHERE `name` = '%s'",
    PlayerInfo[playerid][pLevel],PlayerInfo[playerid][pAdmin],PlayerInfo[playerid][pSupporter],PlayerInfo[playerid][pDonateRank],PlayerInfo[playerid][gPupgrade],
    PlayerInfo[playerid][pConnectTime],PlayerInfo[playerid][pReg],PlayerInfo[playerid][pSex],PlayerInfo[playerid][pAge],PlayerInfo[playerid][pOrigin],PlayerInfo[playerid][pName]);
    mysql_query(query);



    So jetzt zu meiner Frage
    Wie soll ich das jetzt beim Spieler Laden machen ?
    Da habe ich derzeit alles so gemacht :


    PlayerInfo[playerid][pLevel] = mysql_GetInt("accounts","Level", "Name",PlayerInfo[playerid][pName]);



    Passt das so oder sollte ich es auch anders machen ? (ca. 150 Variablen)

    MFG

  • Wie soll ich das jetzt beim Spieler Laden machen ?


    SELECT * FROM Accounts WHERE Name = '%s'


    Dann gibt er dir einen string aus, wo jeder Parameter mit '|' getrennt ist.
    Diesen kannst du nun splitten, die Variablen umkonvertieren (Float,Integer),
    oder du kannst mit dem R7-Plugin von BlueG alles aus dem cache lesen.

  • Wenn du eine Tabelle wiefolgt anlegst:


    Code
    Name          Level     AdminLevel     Passwort
    Nightstr3am     5          1337          123


    Wenn du nun "SELECT * FROM Acconuts WHERE Name = 'Nightstr3am'" als query aussendest,
    kommt folgender string raus: "Nightstr3am|5|1337|123"


    Diesen kannst du jetzt splitten (strfind, strmid)



    Zweite Möglichkeit:
    mysql_format(connectionHandle,"SELECT * FROM Accounts WHERE Name= '%e",SpielerName(playerid));
    mysql_function_query(cH,string,true,"LoadAccount","i",playerid);


    forward LoadAccount(playerid);
    public LoadAccount(playerid)
    {
    new rows,fields;
    cache_get_data(rows,fields);
    if(rows==0) return 1; // Account existiert nicht
    new string[128];
    cache_get_row(0,1,string);
    PlayerInfo[playerid][Level]=strval(string); // etc.
    }

  • strfind gibt die Position des gefundenen Zeichens zurück


    Wenn du also den Output-Text nach '|' durchsuchst, müsste er 11 zurückgeben (Zähl mal an welcher Position das erste | steht ^^)
    Als freiwilligen Parameter kannst du die Position angeben, bei der er anfangen soll zu suchen.
    Um den zweiten Parameter herauszufinden musst du als Startposition die gefundene Position +1 angeben. Also 12.


    Dann fängt er hier an zu suchen:
    Nightstr3am|5|1337|123


    Wenn er wieder ein | gefunden hat, gibt er die Position zurück. Die dürfte 13 sein.
    Das machst du immer so weiter, bis du den ganzen String durchhast.


    Strmid kannst du übrigens benutzen,
    um den Teilstring in einen anderen zu speichern. Dazu gibst du die Start- und Endposition an.
    Die findest du heraus, in dem du bei strfind die Werte die er zurückgibst,
    logisch angibst ^^


    Du musst ein bisschen rumprobieren, das ist nicht schwer ;)


    Code
    Nightstr3am|5|1337|123
  • Er meint, das du es mit Sccanf Splitten sollst, da du es aber nicht kapierst und ich auch mal so unwissend war:


    new PlayerString[128];
    format(PlayerString,sizeof(PlayerString),"SELECT * FROM `Accounts` WHERE `Name` = '%s'", SpielerName(playerid));//Wir holen uns alle Daten aus der Datenbank
    mysql_query(PlayerString);
    mysql_store_result(); new resultline[256];
    if(mysql_fetch_row_format(resultline))
    {
    sscanf(resultline,"p<|>i",//i für Integer, f für Float und s für String
    SpielerInfo[playerid][pLevel]//Jetzt haben wir bei pLevel das Level vom Spieler
    }
    Vorrausetzung dafür das es funktioniert ist das du das ganze genau so auflistest wie in der Datenbank, also du hast z.b. Name ganz oben also musst du als erstes den Namen oben Einfügen.
    Hoffe jetzt verstehst du wie das ganze Funktioniert