Beiträge von Campbell

    Das Jetzige ist uneffizient, du sendest viele Queries, obwohl du einen verwenden könntest:



    mysql_format(handle, query, sizeof(query), "SELECT `Level`, `Adminlevel`, `Geld` FROM `accounts` WHERE `Name` = '%e'", sSpieler[playerid][Name]); // usw.
    mysql_tquery(handle, query, "OnLoadPlayerData", "i", playerid);


    forward OnLoadPlayerData(playerid);
    public OnLoadPlayerData(playerid) {
    new rows,
    fields;


    cache_get_data(rows, fields);
    if(rows > 0) {
    sSpieler[playerid][Level] = cache_get_row_int(0, 0);
    sSpieler[playerid][Adminlevel] = cache_get_row_int(0, 1);
    sSpieler[playerid][Geld] = cache_get_row_int(0, 2);
    }
    }

    Ja, musst eben cache_get_row bzw. cache_get_row_float verwenden statt cache_get_row_int.


    Erster Teil kommt dort hin, wo du den Query ausführen musst.


    playerid und 2 steht für die playerid in Autos[playerid] und die 2 für die 2 in Autos[playerid][2]. Ich übergebe sie als Parameter zum Callback. playerid ist playerid in Callback und 2 vehicleIndex.


    0, 0 steht bei cache_get_row für rowID 0 und fieldID 0.


    Wenn du mehrere Rows hast:



    new intValue;
    for(new i = 0; i < rows; i++) {
    intValue = cache_get_row_int(i, 0);
    }


    Die fieldID steht hierbei für:


    SQL
    SELECT `field1`, `field2`, `field3` FROM `table` LIMIT 1;
    ID      0         1         2


    new query[88];
    mysql_format(handle, query, sizeof(query), "SELECT `Abgeschlossen` FROM `autosystem` WHERE `Besitzer` = '%e'", playerName);
    mysql_tquery(handle, query, "OnSelectLockStatus", "ii", playerid, 2);
    // Hier nun nichts mehr!


    forward OnSelectLockStatus(playerid, vehicleIdx);
    public OnSelectLockStatus(playerid, vehicleIdx) {
    new rows,
    fields;


    cache_get_data(rows, fields);
    if(rows > 0) {
    Autos[playerid][vehicleIdx][Abgeschlossen] = cache_get_row_int(0, 0);
    }


    // Hier Rest des Scripts.
    }

    %e ist nicht %s! %e wurde extra eingebaut um zu escapen. Verwende nicht diese Funktionen (mysql_GetInt, mysql_GetString, ...) - diese sind für die Tonne und das waren sie schon immer.


    // mysql_real_escape_string = %e in mysql_format.


    mysql_format(handle, query, sizeof(query), "UPDATE `table` SET `field` = %i WHERE `field2` = '%e'", someInteger, someString);


    // mysql_fetch_int = cache_get_row_int / mysql_fetch_float = cache_get_row_float


    mysql_tquery(handle, "SELECT `integer`, `float` FROM `table` LIMIT 1", "OnSelectingInteger", "");


    forward OnSelectingInteger();
    public OnSelectingInteger() {
    new rows,
    fields;


    cache_get_data(rows, fields);
    if(rows > 0) {
    new intValue = cache_get_row_int(0, 0), // Row: 0, Field: 0 - Wir fangen wie immer bei 0 an zu zählen.
    floatValue = cache_get_row_float(0, 1);


    // ...
    }
    }


    // mysql_ping, wurde entfernt, da es Server crash'te. Die normalen MySQL-Errors werden unter OnQueryError gehandhabt, daher ...


    public OnQueryError(errorid, error[], callback[], query[], connectionHandle) {
    // Hier MySQL-ErrorIDs handhaben (http://dev.mysql.com/doc/refman/5.1/en/error-messages-client.html bzw. http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html).
    }


    // Alternative wäre mysql_errno().

    Je nachdem, ob du die richtigen Lernquellen findest, kannst du normale Scripts bereits nach ein paar Monaten schreiben (3 - 4 Monate). Bis du jedoch ordentliche Datenstrukturen, Algorithmen bauen kannst und deinen Script gedanklich perfekt aufbauen und strukturieren kannst, brauchst du mehr als 3 - 4 Monate. Die Zeit kann dir dann niemand vorgeben, da dies von Lernfähigkeit und Ergeiz abhängt. Wenn du bereits Erfahrung aus anderen Programmiersprachen mitbringst (am besten C), dann schaffst du das in 1 - 2 Wochen, je nachdem wie schnell du Funktionsnamen auswendig lernen kannst und dich mit der Struktur vertraut machen kannst.

    Du benötigst den extra Callback nur, wenn du etwas abfangen musst. Grund dafür ist, dass auf einem extra Thread der Query ausgeführt wird und dein eigentliches Script weitergeführt wird. Demnach wird im eigentlichen Script nicht auf die Verarbeitung des Queries gewartet, was Lag verhindert. Wenn du etwas updatest, inserts, ..., dann brauchst du keinen extra Callback.


    Beispiel:



    mysql_format(handle, query, sizeof(query), "UPDATE `table` SET `field` = %i WHERE `field2` = '%e'", someInteger, someString);
    mysql_tquery(handle, query, "", "");
    // Hier einfach ohne Callback weitermachen, da du kein Resultat des Queries abfangen musst.