Beiträge von Zunno

    Ich denke mal dein Datenbank ist nach so einem Prinzip aufgebaut:


    Wenn du nun den Namen in der WHERE Anweisung benutzt, sucht er die komplette Datenbank nach dem namen ab, auch wenn schon einer gefunden wurde, da es möglich ist im Feld Name, doppelte Werte also zweimal z.B. User1 abspeichern lässt.
    Wenn du nun aber die ID in der WHERE Anweisung benutzt, dann gibt es diese ID nur einmal. Denn wenn deine Datenbank so eingestellt ist wie auf meinem Screen, kannst du eine ID nicht doppelt eintragen. Daher weiß MySQL auch genau, es gibt diesen Wert nur einmal und muss nicht alles miteinander vergleichen.


    Daher funktioniert das so schneller.
    Also einfach beim Registrieren die ID gleich auslesen lassen, und dann immer die ID benutzen beim Updaten.


    format(query,128,"INSERT INTO `accounts` (Name) VALUES ('%s')",username);
    mysql_query(query);
    PlayerInfo[playerid][pID] = mysql_insert_id();


    Kleines Beispiel wie es im Register stock aussehen könnte.


    Natürlich ändert sich die ID nicht, daher brauch man sie nicht abspeichern lassen bei jedem Disconnect. Sondern nur beim Connecten (Einloggen) auslesen.



    Ich kann mich vielleicht in der erklärung bischen vertun aber so wurde es mir mal erzählt, ich weiß aufjedenfall das es per ID schneller als per Namen geht :P
    Ich hoffe ich konnte helfen.


    Mit freundlichen Grüßen,
    Zunno

    Ja wobei die ID sollte schon als PRIMERY KEY difiniert sein.
    Dadurch weiß die Datenbank auch: "Hey das ist ein Wert den kann es nur einmal in der Datenbank geben."
    Und sucht demnach auch nicht weiter wenn er einen Wert gefunden hat.
    Und vergleicht auch nicht wie bei der Varriante mit dem Namen die ganzen Werte mit einander.


    Daher spart das schon ziemlich viel Zeit beim Updaten von Daten.

    Als ich meine Account immer mit der MySQL WHERE Name = 'Name' geupdatet habe, hat es bei mir auch gelaggt. Ein Account hat 20.000 ms zum speichern gebraucht (20 sek).
    Meine Lösung: Datenbank ID beim Login auslesen lassen. Und dann per Datenbank ID Updaten.

    SQL
    UPDATE `accounts` SET `Feld` = '24' WHERE `ID` = 23


    anstatt

    SQL
    UPDATE `accounts` SET `Feld` = '24' WHERE `Name` = 'EinerVonVielen'



    Probiers aus :P

    @PsyNet: Falsch, das standart Filterscript speichert dies nicht ab, es gibt nur den fertigen Code für SetPlayerAttachedObject in der Konsole aus.
    Und warum nicht selber machen? Ist doch auch nicht schwer ;)

    Zitat

    Langsamer als MySQL wird es sicherlich nicht sein. Lade mal einen GF Acc per MySQL System ... Der Server lalalalalagt wie sau.


    Naja, wenn man natürlich nicht mit MySQL umgehen kann, ist klar das ein Server dan laggt ;)
    War auch mein anfangs problem ^^


    Aber zum Tutorial: Ist auf jedenfall hilfreich wenn man z.B. Filterscripts erstellen möchte, welche man releasen will.
    Und man doch eine recht schnelle Verarbeitung von Daten haben möchte. Wozu Dini und co nicht zugehören.


    Mfg Zunno

    stock mysql_GetFloat(Table[], Field[], Where[], Is[])
    zu stock Float:mysql_GetFloat(Table[], Field[], Where[], Is[])


    Falls dann errors kommen, oben das hin:
    forward Float:mysql_GetFloat(Table[], Field[], Where[], Is[])



    Mit freundlichen Grüßen,
    [GSF]Zunno

    Dominik.
    1. Nein du musst das Callback OnQueryEnd nennen.
    2. Du kannst in dem Callback natürlich ein anderes aufrufen, klar warum nicht.
    3. Natürlich kannst du deine MySQL Funktionen die "INSERT, UPDATE oder DELETE" ausführen, umschreiben so das diese Multi Threaded sind.


    Zu 3, 4 und 5 ist zu beachten das es sich hier um StrickenKids MySQL Plugin handelt und nicht um das von BlueG.
    Daher können die Funktionen von Maddins Tutorial auch nicht kompatible mit diesem Plugin sein.



    Gruß, Zunno

    du wirst immer gekickt. nur es gibt denn bug, das er dich nicht direkt kickt sondern du immer reconnectest. guck also unter onplayerconnect
    bei was alles gekickt wird.

    Guten Abend,
    Ich muss sagen, gutes Tutorial, benutze diese Methode auch schon länger und bin zufrieden.
    Jedoch würde ich zum Tutorial noch dazu schreiben das dies nur auf StrickenKids MySQL Plugin bezogen ist, da bei BlueG alles wieder ein wenig anders ist.


    Lg, Zunno

    stock Float:mysql_GetFloat(Table[], Field[], Where[], Is[])
    Falls dann noch ein Warning kommt, mach oben noch
    forward Float:mysql_GetFloat(Table[], Field[], Where[], Is[])
    hin.


    Lg, Zunno

    CMD:bauszahlen(playerid,params[])
    {
    for(new b=0;b<MAX_BIZ;b++)
    {
    if(IsPlayerInRangeOfPoint(playerid,5,bInfo[b][PosX],bInfo[b][PosY],bInfo[b][PosZ]))
    {
    new Money;
    new BizDatei[64];
    format(BizDatei,sizeof(BizDatei),"/Biz/%d.txt",inBiz[playerid]);
    new kasse=dini_Int(BizDatei,"Kasse");
    if(sscanf(params,"u",Money))return SendClientMessage(playerid,ROT,"Fehler: /bauszahlen [anzahl]");
    {
    if(strcmp(bInfo[b][Besitzer],SpielerName(playerid),false)==0)
    if (Money >= dini_Int(BizDatei,"Kasse")) return SendClientMessage(playerid,ROT,"Du hast nicht soviel Geld in der Kasse!");
    {
    GivePlayerMoney(playerid,Money);
    dini_IntSet(BizDatei,"Kasse",kasse-Money);
    KillBiz(b);
    LoadBiz(b);
    }
    }
    }
    return 1;
    }
    return 1;
    }


    So sollte es funktionieren ;)


    Du musst die Schleife ja auch beenden, wenn du an einem Biz stehst. Daher das return 1 in der schleife.