Mysql retrieve row gibt nicht da aus was ich möchte

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,
    mein problem besteht darin das


    while(mysql_retrieve_row())
    {
    mysql_fetch_field_row(kID, "id");
    print(kID);
    format(kIDStr, sizeof(kIDStr), "%d", kID);
    format(type, sizeof(type), mysql_GetString("db_bank", "Type", "id", kIDStr));
    format(number, sizeof(number), "%d", mysql_GetInt("db_bank", "Number", "id", kIDStr));
    format(nick, sizeof(nick), mysql_GetString("db_bank", "Nickname", "id", kIDStr));
    if(strcmp(nick, "none", false))
    {
    format(str, sizeof(str), "{007DFF}%s, {FFFFFF}%s\n", number, nick);
    strcat(allStr, str);
    print("STRCAT");
    }
    else
    {
    format(str, sizeof(str), "{007DFF}%s, {FFFFFF}%s\n", number, type);
    strcat(allStr, str);
    }
    }


    die Funktion halt die schleife durchgiebt aber nicht 1,2,3,4,5,6 sondern nur irgendwie 6 ausgiebt d.h. ja das er die schleife sogesehen garnicht durch geht 8| und im Game steht auch nur -1 .


    mfg tdXkiller

    Einmal editiert, zuletzt von tdXkiller ()

  • Hallo tdXkiller,


    mein Post bezieht sich eigentlich auf deinen anderen Thread "Mysql Bank Account System schneller machen", habe wohl den falschen Tab beim Schreiben erwischt. Passiert schonmal bei der Uhrzeit :)


    Nun zur Sache. Dein Problem verursacht kurz gesagt der Einsatz von mysql_GetString.


    Du solltest wirklich überdenken ob du diese Funktion weiterhin nutzen möchtest. Wie du bei deinem Problem merkst führt sie bei jedem Aufruf eine neue MySQL Abfrage aus. Jede dieser Abfragen blockiert den Gamemode bis sie beendet ist. Das kann durchaus problematische Ausmasse annehmen. Angenommen eine Abfrage dauert 10 ms und du führst mit mysql_GetString ungewollt 300 Abfragen aus. Dein Server ist dann für 3 Sekunden blockiert, was sich für Spieler in Form von starken Laggs bemerkbar macht.


    Ich bin mir nicht ganz sicher was du für ein MySQL Plugin verwendest, aber ich kann das von BlueG nur empfehlen:
    http://forum.sa-mp.com/showthread.php?t=56564


    Das Plugin von BlueG ermöglicht Abfragen in separaten Threads ausführen zu lassen. Dies hat den großen Vorteil, dass der Gamemode nicht blockiert wird während die Abfrage läuft. Wenn die Abfrage fertig ist wird dann im Gamemode ein Callback aufgerufen, ganz ähnlich wie bei Dialogen und OnDialogResponse.


    Hier ein Beispiel:


    Eine mögliche Abfrage:
    (Code bei Pastebin: http://pastebin.com/7gVA2Q9Y)



    new queryString[128];
    format(queryString, sizeof(queryString), "SELECT `Type`, `Number`, `Nickname` FROM `db_bank` WHERE `user` = %d", playerData[playerid][p_dbid]);
    mysql_function_query(dbHandle, queryString, true, "OnBankReceiveData", "i", playerid);




    In mysql_function_query wird ein Callback für die Abfrage angegeben, in diesem Fall OnBankReceiveData mit dem Parameter
    playerid, also muss dieses noch definiert werden:


    forward OnBankReceiveData(playerid);
    public OnBankReceiveData(playerid) {
    new rows, fields;
    var tmp[32];
    var type, number, nickname[MAX_PLAYER_NAME];


    // Anzahl der zurückgegebenen Zeilen / Spalten herausfinden
    cache_get_data(rows, fields);


    // Schleife über alle Zeilen
    for(i = 0; i < rows; i++) {
    // Erster Parameter ist die Zeile, zweiter die Spalte.
    // Die Abfrage lautet "SELECT `Type`, `Number`, `Nickname` ... ", also
    // ist Type hier die erste, bzw. 0te Spalte.
    // Der Dritte Parameter gibt an wo das Ergebnis zwischengespeichert werden soll.
    cache_get_row(i, 0, tmp);


    // Zwischengespeicherten Wert von String zu Integer umwandeln
    type = strval(tmp);


    cache_get_row(i, 1, tmp);
    number = strval(tmp);


    cache_get_row(i, 2, nickname);


    // ...
    }
    }


    Das soll nur ein kurzes Beispiel sein. Alles weitere kannst du in den Offiziellen Tutorials und in der Dokumentation nachlesen. Die Abfragen so durchzuführen scheint zwar auf den ersten Blick etwas komplizierter zu sein die Abfragen so durchzuführen, aber man gewöhnt sich schnell daran.


    Trotzdem ist es eine Menge Arbeit einen kompletten Gamemode so umzuschreiben, aber ich kann dir versichern, dass es sich lohnt. Vor allen Dingen wenn du noch nicht so viel Code, bzw. nicht so viele Abfragen hast solltest du überlegen den Schritt zu wagen ;) Lass aber in jedem Fall die Finger von diesem mysql_GetString.


    Viele Grüße,
    Hagen



    Ich musste leider auf die Code Tags verzichten. Das Forum entfernt darin komischerweise alle Zeilenumbrüche. Ich nutze einen Mac, vielleicht liegts daran. Wenn das ein Moderator sieht kann er sich ja vielleicht mal der Problematik annehmen ;) Hier nochmal der Code bei Pastebin: http://pastebin.com/7gVA2Q9Y

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

    3 Mal editiert, zuletzt von Blowfish ()

  • Meine frage ist jetzt nur noch ob es gar nicht möglich ist mit der mysql_retrieve_row() Funktion so etwas ab zu fragen ? weil ich das jetzt mit den Threads nicht ganz verstehe also was sie machen schon aber ich finde es wiederum einen weg komplizierter als vorher also sollte ich die for schleife verwenden ? und ja ich benutze das Mysql Plugin von BlueG ^^


    Ps: um ehrlich zu sein verstehe ich Garnichts ^^ also vonwegen das man 100.00 publics machen muss weil der cache da verwertet wird usw finde ich recht zeitaufreibend -.- also wenn du ein gutes englisches Tutorial kennst vllt dann kannst du es ja posten denn die Tutorials hier aus dem Forum helfen mir alle nicht wirklich weiter D:


    Pss: noch ein Problem an der ganzen Sache währe das wenn ich alles in einen Query schreibe das da immer stehen würde input line too long weil ich z.b. beim Account laden über 25 Werte ausgeben lasse


    mfg tdXkiller

    3 Mal editiert, zuletzt von tdXkiller () aus folgendem Grund: Änderungen am Text

  • Das beste Tutorial was ich dazu kenne ist immer noch das hier:http://forum.sa-mp.com/showthread.php?t=337810


    edit: Ob du wirklich umsteigen möchtest bleibt dir überlassen. Wie gesagt: Auf den ersten Blick scheint es sehr kompliziert zu sein, aber man gewöhnt sich daran.


    Aus deinem Code ist nicht genau ersichtlich wie deine Tabellenstruktur ist, aber ich gehe mal davon aus, dass die id aus einer anderen Tabelle kommt
    als db_bank.


    Soweit ich mich erinnere kann man mit dem Plugin nur eine Abfrage zugleich durchführen, da stets der gleiche Zwischenspeicher genutzt wird für mysql_store_result() und mysql_free result(). Es ist also nicht möglich verschachtelte Abfragen wie in deinem Code zu machen, mir fallen für das Problem zwei Lösungsansätze ein.



    Der erste Weg ist nicht sehr elegant und führt immer noch dazu, dass du viele Abfragen machst. Du speicherst einfach in der Schleife alle IDs in ein Array und machst nach mysql_free_result() eine weitere Schleife, die über das Array geht.
    Diesen Weg kann ich jedoch nicht empfehlen.


    Der zweite Weg sind Joins. Durch Joins kannst du kurz gesagt Daten aus mehreren Tabellen in einer Abfrage verknüpfen. Dies macht deine Abfragen zwar etwas komplexer, aber macht deinen Code anschliessend deutlich einfacher.
    Hier ein Tutorial dazu: http://wiki.selfhtml.org/wiki/…_SQL/Einfuehrung_in_Joins
    Ich weiß nicht woher die ID kommt, aber ich nehme einfach mal an sie kommt aus deiner Spielertabelle:


    SELECT a.`id`, b.`type`, b.`number`, b.`nickname`
    FROM `db_users` a, `db_bank` b
    WHERE a.`id` = b.`id`

    Weiterhin kannst du durch dieses Konzept auch gleich den Spielernamen aus der db_bank Tabelle entfernen, da du ihn ja direkt aus der db_users Tabelle holen kannst.



    SELECT a.`id`, b.`type`, b.`number`, a.`nickname`
    FROM `db_users` a, `db_bank` b
    WHERE a.`id` = b.`id`


    Dadurch hast du weniger redundanzen in deiner Datenbank und letztendlich eine einfachere Tabellenstruktur.


    edit: Wenn deine Queries zu lang werden kannst du sie einfach mit strcat zusammenfügen:


    new teilstring[128];
    new string[512];


    format(teilstring, sizeof(teilstring) , ".......", ....);
    strcat(string, teilstring, sizeof(string));


    format(teilstring, sizeof(teilstring) , ".......", ....);
    strcat(string, teilstring, sizeof(string));


    Und so weiter... strcat hängt einfach teilstring an string an.

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • Ok danke erstmal werde mir alles man anschauen nur noch eine frage da ich wenn schon alles auf Threads umschreibe also
    mysql_format("SELECT `Level`, `Experience`, `Health`, `Armour`, `Money`, `Kills`, `Deaths`, `KontoCard`, `VehicleSlot`, `MaxVehicles`, `Warnings`, `Banns`, `Hunger`, `Thirst`, `Desire`, `PremiumTime`, `PremiumPoints`, `AdminRank`, `SkinID`, `SkinID`, `Job`, `PaydayTime`, `Faction`, `FactionSkinID`, `Wanteds`, `Minutes`, `Hours`, `BikeLicense`, `BoatLicense`, `CarLicense`, `ChopperLicense`, `FishingLicense`, `PlaneLicense`, `TruckLicense`, `TollLicense`, `WeaponLicense` FROM `db_accounts`");
    mysql_function_query(MySQLHandle, query, true, "OnPlayerLoad", "", "");


    kann ich mit der mysql_function_query auch Sachen übergeben ?


    also ich muss bei public OnPlayerLoad(playerid, key[]) den key auf das Public übergeben lassen der key stellt den Passwort hash da



    mfg tdXkiller


    Ps: sehe gerade das hast du schon geschrieben xDDD ok dann weiß ich's

    Einmal editiert, zuletzt von tdXkiller ()

  • Erstmal fällt mir auf, dass du in der Abfrage gar kein WHERE verwendest und so einfach alle Benutzer aus der Datenbank lädst. Das ist nicht sehr effizient ;) Versuchs mal mit dem Ansatz:



    new escapedName[MAX_PLAYER_NAME * 2];
    new name[MAX_PLAYER_NAME];
    new query[512];


    GetPlayerName(playerid, name, sizeof(name));


    // Verhindert mögliche SQL Injections. Beim Spielernamen zwar unwahrscheinlich, aber man weiß ja nie
    mysql_real_escape_string(name, escapedName);


    format(query, sizeof(query), "SELECT ... FROM ... WHERE `name` = '%s'", escapedName);


    mysql_function_query( // .......


    So bekommst du nur den Benutzer aus der Datenbank, der auch den entsprechenden Namen hat. Du kannst dies natürlich auch gleich mit einer Passwortabfrage verknüpfen:


    ... WHERE `name` = '%s' AND `password` = '%s'


    Bei Daten, die in Form von Strings so an die Datenbank übergeben werden solltest du jedoch immer darauf achten, dass du sie mit mysql_real_escape_string(source[], destination[]) escapest. Dadurch werden SQL Injections verhindert. Es wäre ja schade wenn das Passwort eines Users plötzlich lautet:


    '; DROP TABLE `db_bank` --

    Nun zu deiner eigentlichen Frage:
    Bei mysql_function_query läuft das ganz genau so wie bei SetTimerEx. Du gibst erst in einem String an was für Parameter übergeben werden sollen, bei dir eine Zahl und ein String, also:


    "is"

    Und darauf hin folgen dann die weiteren Parameter, also:



    mysql_function_query(MySQLHandle, query, true, "OnPlayerLoad", "is", playerid, key);

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

    2 Mal editiert, zuletzt von Blowfish ()

  • Ich werde es mal versuchen btw die "id" ist das AUTO_INCREMENT aus der Tabelle und ich habe es zur genauen Identifizierung benutzt ^^


    Ps: Ich habe schon was zu der Login Funktion hinzugefügt stock mysql_LoadAccount(playerid, hash[])
    {
    new query[1000];
    mysql_real_escape_string(PlayerName(playerid), PlayerName(playerid));
    mysql_real_escape_string(hash, hash);
    if(strcmp(mysql_GetPlayerPassword(playerid), hash, false))
    {
    SendClientMessage(playerid, COLOR_ERROR, "* Das eingegebene Passwort ist falsch!");
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{28DC28}Login", "{FFFFFF}Der Account ist registriert.\nUm dich anzumelden,\ngib bitte dein Passwort ein", "Einloggen", "Abbrechen");
    }
    else
    {
    mysql_format(query, sizeof(query), "SELECT `Password`, `Level`, `RegisterDate`, `Experience`, `Health`, `Armour`, `Money`, `Kills`, `Deaths`, `KontoCard`, `VehicleSlot`, `MaxVehicles`, `Warnings`, `Banns`, `Hunger`, `Thirst`, `Desire`, `PremiumTime`, `PremiumPoints`, `AdminRank`, `SkinID`, `SkinID`, `Job`, `PaydayTime`, `Faction`, `FactionSkinID`, `Wanteds`, `Minutes`, `Hours`, `BikeLicense`, `BoatLicense`, `CarLicense`, `ChopperLicense`, `FishingLicense`, `PlaneLicense`, `TruckLicense`, `TollLicense`, `WeaponLicense` FROM `db_accounts` WHERE `pName` = '%s' AND `Password` = '%s'", PlayerName(playerid), hash);
    mysql_function_query(MySQLHandle, query, true, "OnPlayerLoad", "i", playerid);
    }
    return 1;
    }


    Er soll eben prüfen ob das Passwort übereinstimmt und wenn ja dann soll er den query erst ausführen hoffe ich habe das richtig gemacht muss halt später noch die GetPlayerPassword funktion umändern aber sonst ^^ joah


    forward OnPlayerLoad(playerid);
    public OnPlayerLoad(playerid)
    {
    new rows, fields;
    cache_get_data(rows, fields);
    if(rows)
    {
    new temp[12];
    cache_get_row(0, 0, temp);
    pInfo[playerid][Level] = strval(temp);
    cache_get_row(0, 1, temp);
    pInfo[playerid][Experience] = strval(temp);
    cache_get_row(0, 2, temp);
    pInfo[playerid][Health] = strval(temp);
    cache_get_row(0, 3, temp);
    pInfo[playerid][Armour] = strval(temp);
    cache_get_row(0, 4, temp);
    pInfo[playerid][Money] = strval(temp);
    cache_get_row(0, 5, temp);
    pInfo[playerid][Kills] = strval(temp);
    cache_get_row(0, 6, temp);
    pInfo[playerid][Deaths] = strval(temp);
    cache_get_row(0, 7, temp);
    pInfo[playerid][Kontocard] = strval(temp);
    cache_get_row(0, 8, temp);
    pInfo[playerid][Vehicleslot] = strval(temp);
    cache_get_row(0, 9, temp);
    pInfo[playerid][Maxvehicles] = strval(temp);
    cache_get_row(0, 10, temp);
    pInfo[playerid][Warnings] = strval(temp);
    cache_get_row(0, 11, temp);
    pInfo[playerid][Banns] = strval(temp);
    cache_get_row(0, 12, temp);
    pInfo[playerid][Hunger] = strval(temp);
    cache_get_row(0, 13, temp);
    pInfo[playerid][Thirst] = strval(temp);
    cache_get_row(0, 14, temp);
    pInfo[playerid][Desire] = strval(temp);
    cache_get_row(0, 15, temp);
    pInfo[playerid][Premiumtime] = strval(temp);
    cache_get_row(0, 16, temp);
    pInfo[playerid][Premiumpoints] = strval(temp);
    cache_get_row(0, 17, temp);
    pInfo[playerid][Adminrank] = strval(temp);
    cache_get_row(0, 18, temp);
    pInfo[playerid][SkinID] = strval(temp);
    cache_get_row(0, 19, temp);
    pInfo[playerid][Job] = strval(temp);
    cache_get_row(0, 20, temp);
    pInfo[playerid][Paydaytime] = strval(temp);
    cache_get_row(0, 21, temp);
    pInfo[playerid][Faction] = strval(temp);
    cache_get_row(0, 22, temp);
    pInfo[playerid][FactionskinID] = strval(temp);
    cache_get_row(0, 23, temp);
    pInfo[playerid][Wanteds] = strval(temp);
    cache_get_row(0, 24, temp);
    pInfo[playerid][Minutes] = strval(temp);
    cache_get_row(0, 25, temp);
    pInfo[playerid][Hours] = strval(temp);
    cache_get_row(0, 26, temp);
    pInfo[playerid][Bikelicense] = strval(temp);
    cache_get_row(0, 27, temp);
    pInfo[playerid][Boatlicense] = strval(temp);
    cache_get_row(0, 28, temp);
    pInfo[playerid][Carlicense] = strval(temp);
    cache_get_row(0, 29, temp);
    pInfo[playerid][Chopperlicense] = strval(temp);
    cache_get_row(0, 30, temp);
    pInfo[playerid][Fishinglicense] = strval(temp);
    cache_get_row(0, 31, temp);
    pInfo[playerid][Planelicense] = strval(temp);
    cache_get_row(0, 32, temp);
    pInfo[playerid][Trucklicense] = strval(temp);
    cache_get_row(0, 33, temp);
    pInfo[playerid][Tolllicense] = strval(temp);
    cache_get_row(0, 34, temp);
    pInfo[playerid][Weaponlicense] = strval(temp);
    }
    SetPlayerEuro(playerid, mysql_GetInt("db_accounts", "Money", "pName", PlayerName(playerid)));
    SetPlayerSkin(playerid, pInfo[playerid][SkinID]);
    SetPlayerScore(playerid, pInfo[playerid][Level]);
    SetTimerEx("UpdateProgressBar", 0, false, "d", playerid);
    vLoad(playerid, pInfo[playerid][VehicleSlot]);
    SetPVarInt(playerid, "Login", 1);
    SpawnPlayer(playerid);
    return 1;
    }


    Ich hoffe mal das das richtig ist 8|

    5 Mal editiert, zuletzt von tdXkiller () aus folgendem Grund: Änderungen....

  • Hallo nochmal :)


    Zu der Zeile Hier:


    mysql_real_escape_string(PlayerName(playerid), PlayerName(playerid));

    Das funktioniert so leider nicht. Den escapten Namen musst du anschliessend in einem neuen String speichern.
    Also beispielsweise:


    new escapedName[MAX_PLAYER_NAME];
    mysql_real_escape_string(PlayerName(playerid), escapedName);




    Die Überprüfung des Passworts kannst du auch gleich im Callback machen. Die Abfrage lautet ja:


    `pName` = '%s' AND `Password` = '%s'


    Sie liefert also nur ein Ergebnis wenn ein Benutzer unter dem Namen gefunden wurde und auch das richtige Passwort angegeben wurde.
    Im Callback kannst du daher sehr einfach überprüfen ob der Login erfolgreich ist:

    new rows, fields;
    cache_get_data(rows, fields);
    if(rows == 0) {
    // Falsches Passwort
    return 0;
    } else {
    // Passwort korrekt, lade Daten
    }


    Auch die Zeile mit dem Geld kannst du anpassen:
    SetPlayerEuro(playerid, mysql_GetInt("db_accounts", "Money", "pName", PlayerName(playerid)));

    Hier hast du bereits das Geld aus der Datenbank geholt, also kannst du doch einfach folgendes schreiben:
    SetPlayerEuro(playerid, pInfo[playerid][Money]);


    Sieht aber schon ganz gut aus was du da machst ;)

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • Da bist du auf einen der Nachteile des Modells gestoßen. Wie du weißt wird die Abfrage in einem separaten Thread ausgeführt um den Gamemode nicht zu blockieren. Das Callback wird erst aufgerufen wenn die Abfrage beendet ist. Der Funktionsaufruf von mysql_GetPlayerPassword ist zu diesem Zeitpunkt jedoch bereits beendet.


    Du hast also keine Möglichkeit einfach per return im Callback den Wert an mysql_GetPlayerPasswort zu übergeben.
    Sprich du musst das Passwort bereits zu einem frühreren Zeitpunkt in einer Variable gespeichert haben, damit du eine derartige Funktion umsetzen kannst.
    Die andere Möglichkeit ist, dass du die nötige Überprüfung im Callback ausführst.
    Ich würde hier ersteres bevorzugen, da du ja sowieso die Userdaten aus der Datenbank ausliest.
    Das Plugin zwingt dich gewissermassen unnötige Abfragen zu vermeiden.

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • Ok bin voran gekommen ^^ nur mein Problem ist jetzt wenn ich das hier aus Notepad++ in mein Script füge


    stock mysql_PlayerVehicleLoad(playerid, fID)
    {
    new query[90];
    mysql_real_escape_string(PlayerName(playerid), PlayerName(playerid), 1, 18);
    format(query, sizeof(query), "SELECT * FROM `db_vehicles` WHERE `pName` = '%s' AND `vNumber` = '%i'", PlayerName(playerid), fID);
    mysql_function_query(MySQLHandle, query, true, "OnPlayerVehicleLoad", "di", playerid, fID);
    }


    forward OnPlayerVehicleLoad(playerid, fID);
    public OnPlayerVehicleLoad(playerid, fID)
    {
    cache_get_row(0, 1, pVehicle[playerid][fID][vName], MySQLHandle, 24);
    pVehicle[playerid][fID][Modelid] = cache_get_row_int(0, 3, MySQLHandle);
    cache_get_row(0, 6, pVehicle[playerid][fID][Numberplate], MySQLHandle, 11);
    pVehicle[playerid][fID][vPosX] = cache_get_row_float(0, 7, MySQLHandle);
    pVehicle[playerid][fID][vPosY] = cache_get_row_float(0, 8, MySQLHandle);
    pVehicle[playerid][fID][vPosZ] = cache_get_row_float(0, 9, MySQLHandle);
    pVehicle[playerid][fID][vPosA] = cache_get_row_float(0, 10, MySQLHandle);
    pVehicle[playerid][fID][Price] = cache_get_row_int(0, 11, MySQLHandle);
    pVehicle[playerid][fID][Fuel] = cache_get_row_float(0, 12, MySQLHandle);
    pVehicle[playerid][fID][Colour1] = cache_get_row_int(0, 13, MySQLHandle);
    pVehicle[playerid][fID][Colour2] = cache_get_row_int(0, 14, MySQLHandle);
    pVehicle[playerid][fID][Paintjob] = cache_get_row_int(0, 15, MySQLHandle);
    pVehicle[playerid][fID][Mod0] = cache_get_row_int(0, 16, MySQLHandle);
    pVehicle[playerid][fID][Mod1] = cache_get_row_int(0, 17, MySQLHandle);
    pVehicle[playerid][fID][Mod2] = cache_get_row_int(0, 18, MySQLHandle);
    pVehicle[playerid][fID][Mod3] = cache_get_row_int(0, 19, MySQLHandle);
    pVehicle[playerid][fID][Mod4] = cache_get_row_int(0, 20, MySQLHandle);
    pVehicle[playerid][fID][Mod5] = cache_get_row_int(0, 21, MySQLHandle);
    pVehicle[playerid][fID][Mod6] = cache_get_row_int(0, 22, MySQLHandle);
    pVehicle[playerid][fID][Mod7] = cache_get_row_int(0, 23, MySQLHandle);
    pVehicle[playerid][fID][Mod8] = cache_get_row_int(0, 24, MySQLHandle);
    pVehicle[playerid][fID][Mod9] = cache_get_row_int(0, 25, MySQLHandle);
    pVehicle[playerid][fID][Mod10] = cache_get_row_int(0, 26, MySQLHandle);
    pVehicle[playerid][fID][Mod11] = cache_get_row_int(0, 27, MySQLHandle);
    pVehicle[playerid][fID][Mod12] = cache_get_row_int(0, 28, MySQLHandle);
    pVehicle[playerid][fID][Mod13] = cache_get_row_int(0, 29, MySQLHandle);
    Vehicle[playerid][fID] = CreateVehicle(pVehicle[playerid][fID][Modelid], pVehicle[playerid][fID][vPosX], pVehicle[playerid][fID][vPosY], pVehicle[playerid][fID][vPosZ]+2, pVehicle[playerid][fID][vPosA], pVehicle[playerid][fID][Colour1], pVehicle[playerid][fID][Colour2], -1);
    SetVehicleNumberPlate(Vehicle[playerid][fID], pVehicle[playerid][fID][Numberplate]);
    if(pVehicle[playerid][fID][Paintjob] != 0) { ChangeVehiclePaintjob(Vehicle[playerid][fID], pVehicle[playerid][fID][Paintjob]); }
    if(pVehicle[playerid][fID][Mod0] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod0]); }
    if(pVehicle[playerid][fID][Mod1] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod1]); }
    if(pVehicle[playerid][fID][Mod2] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod2]); }
    if(pVehicle[playerid][fID][Mod3] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod3]); }
    if(pVehicle[playerid][fID][Mod4] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod4]); }
    if(pVehicle[playerid][fID][Mod5] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod5]); }
    if(pVehicle[playerid][fID][Mod6] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod6]); }
    if(pVehicle[playerid][fID][Mod7] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod7]); }
    if(pVehicle[playerid][fID][Mod8] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod8]); }
    if(pVehicle[playerid][fID][Mod9] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod9]); }
    if(pVehicle[playerid][fID][Mod10] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod10]); }
    if(pVehicle[playerid][fID][Mod11] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod11]); }
    if(pVehicle[playerid][fID][Mod12] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod12]); }
    if(pVehicle[playerid][fID][Mod13] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod13]); }
    return 1;
    }


    dann hängt sich der pawn compiler auf 8|

  • Vielleicht ist es diese Zeile:


    mysql_real_escape_string(PlayerName(playerid), PlayerName(playerid), 1, 18);


    Änder das mal in:

    new escapedName[MAX_PLAYER_NAME];
    mysql_real_escape_string(PlayerName(playerid), escapedName);


    Und nicht vergessen dann auch in der Abfrage escapedName statt PlayerName(playerid) zu nutzen :)

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • Nö also daran liegt es nicht wenn ich das Enum mal weg nehme steht da halt error 017: undefined symbol "pVehicle"
    warning 215: expression has no effect
    error 001: expected token: ";", but found "]"
    error 029: invalid expression, assumed zero
    fatal error 107: too many error messages on one line


    Das ist diese Zeile


    cache_get_row(0, 1, pVehicle[playerid][fID][vName], MySQLHandle, 24);

  • Hier die Signatur von cache_get_row.


    cache_get_row( row, idx, dest[] [, connectionHandle = 1] )


    Der fünfte Parameter in Zeile 12 und 15 gehört dort nicht hin.
    Das Connection Handle ist bei cache_get_row übrigends auch optional. Das musst du dort nicht überall hinschreiben wenn du sowieso nur eine Datenbankverbindung hast.

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • cache_get_row sieht nicht vor, dass man eine maximale Größe des Strings übergibt. Es wird einfach davon ausgegangen, dass dein String groß genug ist.
    Die maximale Länge setzt du ja in der Tabellenstruktur fest, daher kannst du den String auch hinreichend groß machen.

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • Bei cache_get_row kannst du es wegnehmen, da es dort ein optionaler Parameter ist. Das musst du natürlich nicht tun, macht den Code nur etwas übersichtlicher. Komm aber nicht auf die Idee es bei mysql_function_query zu entfernen ;) Da ist der Parameter nicht optional.

    German Chill RP v2
    Server: chillrp.de:7777


    ChillRP ist ein einzigartiger deutscher Server mit einem zu 100% selbst entwickelten Script, der ständig weiter entwickelt wird.
    Wir freuen uns auf Deinen Besuch!

  • ja schon klar ok werde ich machen ^^


    Hmm ok sieht schon übersichtlicher aus nur tritt der Fehler lieder immernoch auf hier nochmal alles + das Enum


    enum vInfo
    {
    vName[20],
    vNumber,
    Modelid,
    pName[20],
    Numberplate[10],
    Float:vPosX,
    Float:vPosY,
    Float:vPosZ,
    Float:vPosA,
    Price,
    Float:Fuel,
    Colour1,
    Colour2,
    Paintjob,
    Mod0,
    Mod1,
    Mod2,
    Mod3,
    Mod4,
    Mod5,
    Mod6,
    Mod7,
    Mod8,
    Mod9,
    Mod10,
    Mod11,
    Mod12,
    Mod13
    }
    new pVehicle[MAX_PLAYERS][MAX_PLAYER_VEHICLES][vInfo];
    new Vehicle[MAX_PLAYERS][MAX_PLAYER_VEHICLES];


    //*****************< mysql_PlayerVehicleLoad >*****************//


    stock mysql_PlayerVehicleLoad(playerid, fID)
    {
    new query[90], escapedName[20];
    mysql_real_escape_string(PlayerName(playerid), escapedName);
    format(query, sizeof(query), "SELECT * FROM `db_vehicles` WHERE `pName` = '%s' AND `vNumber` = '%i'", escapedName, fID);
    mysql_function_query(MySQLHandle, query, true, "OnPlayerVehicleLoad", "di", playerid, fID);
    }


    forward OnPlayerVehicleLoad(playerid, fID);
    public OnPlayerVehicleLoad(playerid, fID)
    {
    cache_get_row(0, 1, pVehicle[playerid][fID][vName]);
    pVehicle[playerid][fID][Modelid] = cache_get_row_int(0, 3);
    cache_get_row(0, 6, pVehicle[playerid][fID][Numberplate]);
    pVehicle[playerid][fID][vPosX] = cache_get_row_float(0, 7);
    pVehicle[playerid][fID][vPosY] = cache_get_row_float(0, 8);
    pVehicle[playerid][fID][vPosZ] = cache_get_row_float(0, 9);
    pVehicle[playerid][fID][vPosA] = cache_get_row_float(0, 10);
    pVehicle[playerid][fID][Price] = cache_get_row_int(0, 11);
    pVehicle[playerid][fID][Fuel] = cache_get_row_float(0, 12);
    pVehicle[playerid][fID][Colour1] = cache_get_row_int(0, 13);
    pVehicle[playerid][fID][Colour2] = cache_get_row_int(0, 14);
    pVehicle[playerid][fID][Paintjob] = cache_get_row_int(0, 15);
    pVehicle[playerid][fID][Mod0] = cache_get_row_int(0, 16);
    pVehicle[playerid][fID][Mod1] = cache_get_row_int(0, 17);
    pVehicle[playerid][fID][Mod2] = cache_get_row_int(0, 18);
    pVehicle[playerid][fID][Mod3] = cache_get_row_int(0, 19);
    pVehicle[playerid][fID][Mod4] = cache_get_row_int(0, 20);
    pVehicle[playerid][fID][Mod5] = cache_get_row_int(0, 21);
    pVehicle[playerid][fID][Mod6] = cache_get_row_int(0, 22);
    pVehicle[playerid][fID][Mod7] = cache_get_row_int(0, 23);
    pVehicle[playerid][fID][Mod8] = cache_get_row_int(0, 24);
    pVehicle[playerid][fID][Mod9] = cache_get_row_int(0, 25);
    pVehicle[playerid][fID][Mod10] = cache_get_row_int(0, 26);
    pVehicle[playerid][fID][Mod11] = cache_get_row_int(0, 27);
    pVehicle[playerid][fID][Mod12] = cache_get_row_int(0, 28);
    pVehicle[playerid][fID][Mod13] = cache_get_row_int(0, 29);
    Vehicle[playerid][fID] = CreateVehicle(pVehicle[playerid][fID][Modelid], pVehicle[playerid][fID][vPosX], pVehicle[playerid][fID][vPosY], pVehicle[playerid][fID][vPosZ]+2, pVehicle[playerid][fID][vPosA], pVehicle[playerid][fID][Colour1], pVehicle[playerid][fID][Colour2], -1);
    SetVehicleNumberPlate(Vehicle[playerid][fID], pVehicle[playerid][fID][Numberplate]);
    if(pVehicle[playerid][fID][Paintjob] != 0) { ChangeVehiclePaintjob(Vehicle[playerid][fID], pVehicle[playerid][fID][Paintjob]); }
    if(pVehicle[playerid][fID][Mod0] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod0]); }
    if(pVehicle[playerid][fID][Mod1] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod1]); }
    if(pVehicle[playerid][fID][Mod2] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod2]); }
    if(pVehicle[playerid][fID][Mod3] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod3]); }
    if(pVehicle[playerid][fID][Mod4] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod4]); }
    if(pVehicle[playerid][fID][Mod5] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod5]); }
    if(pVehicle[playerid][fID][Mod6] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod6]); }
    if(pVehicle[playerid][fID][Mod7] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod7]); }
    if(pVehicle[playerid][fID][Mod8] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod8]); }
    if(pVehicle[playerid][fID][Mod9] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod9]); }
    if(pVehicle[playerid][fID][Mod10] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod10]); }
    if(pVehicle[playerid][fID][Mod11] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod11]); }
    if(pVehicle[playerid][fID][Mod12] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod12]); }
    if(pVehicle[playerid][fID][Mod13] != 0) { AddVehicleComponent(Vehicle[playerid][fID], pVehicle[playerid][fID][Mod13]); }
    return 1;
    }

    Einmal editiert, zuletzt von tdXkiller ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen