Gang Fahrzeuge speichern nicht (MySQL)

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
  • Sonst wurden die Gang Fahrzeuge per File geladen und gespeichert, jetzt wo ich MySQL verwenden möchte, werden Sie nicht gespeichert. Ausgeführt wird SaveGangAutos(); bei /gmx und bei /saveserver. Code:



    public LoadGangAutos()
    {
    new string[128];
    mysql_free_result();
    for(new i = 0; i < sizeof(GangAutoInfo); i++)
    {
    format(string, sizeof(string),"SELECT * FROM `gangautos` WHERE `SlotID` = '%d'", i);
    mysql_query(string);
    mysql_store_result();
    if(mysql_num_rows() != 0)
    {
    new val[ 256 ];
    mysql_fetch_field("CarID", val); GangAutoInfo[i][cID] = strval( val );
    mysql_fetch_field("OwnerID", val); GangAutoInfo[i][cOwner] = strval( val );
    mysql_fetch_field("TypID", val); GangAutoInfo[i][cTyp] = strval( val );
    mysql_fetch_field("PosX", val); GangAutoInfo[i][cPosX] = floatstr( val );
    mysql_fetch_field("PosY", val); GangAutoInfo[i][cPosY] = floatstr( val );
    mysql_fetch_field("PosZ", val); GangAutoInfo[i][cPosZ] = floatstr( val );
    mysql_fetch_field("Rotation", val); GangAutoInfo[i][cRot] = floatstr( val );
    mysql_fetch_field("Farbe1", val); GangAutoInfo[i][cColor1] = strval( val );
    mysql_fetch_field("Farbe2", val); GangAutoInfo[i][cColor2] = strval( val );
    mysql_fetch_field("Status", val); GangAutoInfo[i][cStatus] = strval( val );
    mysql_fetch_field("Tank", val); GangAutoInfo[i][cTank] = strval( val );
    mysql_fetch_field("ReSpawnTime", val); GangAutoInfo[i][cReSpawnTime] = strval( val );
    //self_mysql_get_field("StandTime", val); GangAutoInfo[i][cStandTime] = strval( val );
    }
    else
    {
    GangAutoInfo[i][cID] = -1;
    GangAutoInfo[i][cOwner] = -1;
    GangAutoInfo[i][cTyp] = -1;
    GangAutoInfo[i][cPosX] = 0;
    GangAutoInfo[i][cPosY] = 0;
    GangAutoInfo[i][cPosZ] = 0;
    GangAutoInfo[i][cRot] = 0;
    GangAutoInfo[i][cColor1] = -1;
    GangAutoInfo[i][cColor2] = -1;
    GangAutoInfo[i][cStatus] = -1;
    GangAutoInfo[i][cTank] = 50;
    GangAutoInfo[i][cReSpawnTime] = 1800;
    GangAutoInfo[i][cStandTime] = 0;
    }
    mysql_free_result();
    }
    return 1;
    }


    public SaveGangAutos()
    {
    new string[128];
    for(new i = 0; i < sizeof(GangAutoInfo); i++)
    {
    format(string, sizeof(string), "SELECT * FROM `gangautos` WHERE `SlotID` = '%d'", i);
    mysql_query(string);
    mysql_store_result();
    if(mysql_num_rows() != 0)
    {
    format(string, sizeof(string), "INSERT INTO `gangautos` (`SlotID`) VALUES ('%d')", i);
    mysql_query(string);
    }
    mysql_free_result();
    new var[256];
    format(var, sizeof(var), "UPDATE `gangautos` SET `CarID`='%d', `OwnerID`='%d', `TypID`='%d', `PosX`='%.1f', `PosY`='%.1f', `PosZ`='%.1f', `Rotation`='%.1f', `Farbe1`='%d', `Farbe2`='%d', `Status`='%d', `Tank`='%d', `ReSpawnTime`='%d' WHERE `SlotID`='%d'",
    GangAutoInfo[i][cID],
    GangAutoInfo[i][cOwner],
    GangAutoInfo[i][cTyp],
    GangAutoInfo[i][cPosX],
    GangAutoInfo[i][cPosY],
    GangAutoInfo[i][cPosZ],
    GangAutoInfo[i][cRot],
    GangAutoInfo[i][cColor1],
    GangAutoInfo[i][cColor2],
    GangAutoInfo[i][cStatus],
    GangAutoInfo[i][cTank],
    GangAutoInfo[i][cReSpawnTime],
    //GangAutoInfo[i][cStandTime],
    i);
    mysql_query(var);
    }
    print("GangAutos Geladen");
    return 1;
    }


    Freue mich über jede hilfe! @Jeffry:


    Gruß
    Crowley :)

    Einmal editiert, zuletzt von varrez ()

  • Ich bin jetzt den Code nur überflogen, aber solltest du nicht beim Laden der Fahrzeuge die Fahrzeuge anschließend auch erstellen? ;) (Sehe ich nämlich nirgends)


    Weiters printest du beim Speichern der Autos "GangAutos Geladen" ist jetzt nicht weiter schlimm aber das macht man nicht wenn man im Callback Speichern ist :D

    MFG

  • Ich bin jetzt den Code nur überflogen, aber solltest du nicht beim Laden der Fahrzeuge die Fahrzeuge anschließend auch erstellen? ;) (Sehe ich nämlich nirgends)


    Weiters printest du beim Speichern der Autos "GangAutos Geladen" ist jetzt nicht weiter schlimm aber das macht man nicht wenn man im Callback Speichern ist :D

    Der Code stammt aus dem IR/RGR Script :wacko: Erstellt werden Fahrzeuge ja, nur das Speichern funktioniert nicht. Wenn ich Ingame ein Gangcar kaufe oder erstelle, werden Sie nicht gespeichert.


    Erstellt werden diese so:
    public CreateNewlyGangAutos(GCarID){if(GangAutoInfo[GCarID][cTyp] != -1){if(GangAutoInfo[GCarID][cID] == -1){if(GangAutoInfo[GCarID][cStatus] == 0){GangAutoInfo[GCarID][cID] = CreateVehicle(GangAutoInfo[GCarID][cTyp],GangAutoInfo[GCarID][cPosX],GangAutoInfo[GCarID][cPosY],GangAutoInfo[GCarID][cPosZ],GangAutoInfo[GCarID][cRot],GangAutoInfo[GCarID][cColor1],GangAutoInfo[GCarID][cColor2],GangAutoInfo[GCarID][cReSpawnTime]);Gas[GangAutoInfo[GCarID][cID]] = GangAutoInfo[GCarID][cTank];new string[50];format(string, sizeof(string), "{FFFF00}GLS-{21DD00}%d", GangAutoInfo[GCarID][cID]);SetVehicleNumberPlate(GangAutoInfo[GCarID][cID],string);SetVehicleToRespawn(GangAutoInfo[GCarID][cID]);OnVehicleDamageStatus(GCarID);}}}return 1;}


    Edit: @Jeffry: Keine Idee o.Ä.? :/


    Gruß

    Einmal editiert, zuletzt von varrez ()

  • Der Code den du zeigst ist eigentlich kompletter Scheiß.


    Wieso möchtest du die Fahrzeuge nach ihrem Index vom Array speichern?
    Das gibt früher oder später Fehler beim auslesen.


    Wie ich das sehe verwendest du den Index des Array (0, 1, 2, 3, ...) als SlotID für deine Datenbank.
    Dann verwendest du mysql_query .. du solltest dafür mysql_tquery / mysql_pquery verwenden.
    Deine Queries werden nicht Escaped, was eine Sicherheitslücke darstellt. (mysql_format mit %e regex verwenden)
    Der Code ist unübersichtlich ohne Ende..



    Hier mal ein Beispiel wie man es machen sollte:

    #define MAX_FRAKCARS 124
    enum FrakCarEnum
    {
    fCarID,
    fCarVehID,
    fCarFrakID,
    Float:fCarX,
    Float:fCarY,
    Float:fCarZ,
    Float:fCarRot,
    fCarPlate[32],
    fColorA,
    fColorB,
    fCar
    };
    new pFrakCars[MAX_FRAKCARS][FrakCarEnum];


    stock sqlLoadFrakCars()
    {
    new Cache:Result, Query[256], Count;
    mysql_format(Handle, Query, 256, "SELECT * FROM frakcars");
    Result = mysql_query(Handle, Query);


    for(new i = 0; i < cache_get_row_count(Handle); i++)
    {
    Count++;
    pFrakCars[i][fCarID] = cache_get_field_content_int(i, "id");
    pFrakCars[i][fCarFrakID] = cache_get_field_content_int(i, "frakid");
    pFrakCars[i][fCarVehID] = cache_get_field_content_int(i, "carid");
    pFrakCars[i][fCarX] = cache_get_field_content_float(i, "x");
    pFrakCars[i][fCarY] = cache_get_field_content_float(i, "y");
    pFrakCars[i][fCarZ] = cache_get_field_content_float(i, "z");
    pFrakCars[i][fCarRot] = cache_get_field_content_float(i, "rot");
    pFrakCars[i][fColorA] = cache_get_field_content_int(i, "colora");
    pFrakCars[i][fColorB] = cache_get_field_content_int(i, "colorb");
    cache_get_field_content(i, "plate", pFrakCars[i][fCarPlate], Handle, 32);


    if(pFrakCars[i][fCarFrakID] == TEAM_LSPD)
    pFrakCars[i][fCar] = AddStaticVehicleEx(pFrakCars[i][fCarVehID], pFrakCars[i][fCarX], pFrakCars[i][fCarY], pFrakCars[i][fCarZ], pFrakCars[i][fCarRot], pFrakCars[i][fColorA], pFrakCars[i][fColorB], 0, 1);
    else
    pFrakCars[i][fCar] = AddStaticVehicleEx(pFrakCars[i][fCarVehID], pFrakCars[i][fCarX], pFrakCars[i][fCarY], pFrakCars[i][fCarZ], pFrakCars[i][fCarRot], pFrakCars[i][fColorA], pFrakCars[i][fColorB], 0, 0);
    }


    printf("Es wurden %i Fraktionsautos geladen!", Count);
    cache_delete(Result, Handle);


    return 1;
    }


    Wie du siehst werden die Daten so in dein Array gespeichert wie sie ausgelesen werden.
    Du musst dir keinen Kopf machen das deine SlotID auch die ID von der Datenbank ist oder sonstiges.
    Verwende wenn möglich bei solchen Sachen wirklich nur die Datenbank als Speicher und nicht als Element des Scripts.
    Wie du siehst wird die FahrzeugID in fCar gespeichert und die DatenbankID ist nur zum löschen / überschreiben aus der Datenbank da.



    Dann kannst du einfach abfragen ob dein Spieler der Gang auch das richtige Fahrzeug fährt:



    if(IsPlayerLoggedIn(playerid) && !ispassenger)
    {
    for(new i = 0; i < MAX_FRAKCARS; i++)
    {
    if(vehicleid != pFrakCars[i][fCar])
    continue;


    if(pInfo[playerid][pTeam] != pFrakCars[i][fCarFrakID])
    {
    if(pFrakCars[i][fCarFrakID] != 7)
    {
    TogglePlayerControllable(playerid, false);
    TogglePlayerControllable(playerid, true);
    SendClientMessage(playerid, COLOR_RED, "Du darfst nur mit Fahrzeuge deiner Fraktion fahren!");
    }
    else
    {
    if(!pInfo[playerid][pSchoolAllow])
    {
    TogglePlayerControllable(playerid, false);
    TogglePlayerControllable(playerid, true);
    SendClientMessage(playerid, COLOR_RED, "Du bist in keiner Fahrprüfung!");
    }
    }
    }
    }
    }


    Einmal editiert, zuletzt von Warren ()

  • Sonst wurden die Gang Fahrzeuge per File geladen und gespeichert, jetzt wo ich MySQL verwenden möchte, werden Sie nicht gespeichert.

    Was sagt der MySQL Log, wenn du die Speicherung ausführen lässt (vorher den Log leeren).



    ____________________



    Das gibt früher oder später Fehler beim auslesen.

    Wie sollte da ein Fehler zu Stande kommen? Die ID ist eindeutig. Fehler kommen bezüglich der ID hier keine auf.


    Dann verwendest du mysql_query .. du solltest dafür mysql_tquery / mysql_pquery verwenden.

    Das gab es bei den älteren Versionen noch nicht, sofern sein Code ein altes Plugin nutzt und er es nicht umschreiben will, muss diese Methode verwendet werden. In den meisten Fällen macht das auch keinen großen Unterschied.


    Zudem, schau mal in deinen Code, du verwendest es selbst nicht, sprich du arbeitest mit deinem Code am Sinn der neuen Plugins komplett vorbei ;)

  • Setze mal einen print in dein SaveGangAutos am Anfang hin. Wird das überhaupt aufgerufen?


    geht weiter bis SlotID 599


    Geprintet werdn aus SaveGangAutos();
    format(string, sizeof(string), "SELECT * FROM `gangautos` WHERE `SlotID` = '%d'", i);
    und
    format(string, sizeof(string), "INSERT INTO `gangautos` (`SlotID`) VALUES ('%d')", i);


    Edit: Muss mich korrigieren, nicht INSERT INTO wird geprintet, sondern:
    format(var, sizeof(var), "UPDATE `gangautos` SET `CarID`='%d', `OwnerID`='%d', `TypID`='%d', `PosX`='%.1f', `PosY`='%.1f', `PosZ`='%.1f', `Rotation`='%.1f', `Farbe1`='%d', `Farbe2`='%d', `Status`='%d', `Tank`='%d', `ReSpawnTime`='%d' WHERE `SlotID`='%d'",
    GangAutoInfo[i][cID],
    GangAutoInfo[i][cOwner],
    GangAutoInfo[i][cTyp],
    GangAutoInfo[i][cPosX],
    GangAutoInfo[i][cPosY],
    GangAutoInfo[i][cPosZ],
    GangAutoInfo[i][cRot],
    GangAutoInfo[i][cColor1],
    GangAutoInfo[i][cColor2],
    GangAutoInfo[i][cStatus],
    GangAutoInfo[i][cTank],
    GangAutoInfo[i][cReSpawnTime],
    i);

    3 Mal editiert, zuletzt von varrez ()

  • Das passt.
    Da keine Daten in den Variablen stehen, können auch keine Daten in der Datenbank stehen.


    Wie erstellst du denn so ein Fahrzeug, welches dann gespeichert werden soll?

    Befehl:
    if(strcmp("/creategangcar", cmd, true) == 0)
    {
    if(PlayerInfo[playerid][pAdmin] == 2000)
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_BENUTZETEXT, "Benutze: /creategangcar [GangID] [Farbe1] [Farbe2]");
    return 1;
    }
    new GangID = strval(tmp);
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_BENUTZETEXT, "Benutze: /creategangcar [GangID] [Farbe1] [Farbe2]");
    return 1;
    }
    new FFarbe1 = strval(tmp);
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_BENUTZETEXT, "Benutze: /creategangcar [GangID] [Farbe1] [Farbe2]");
    return 1;
    }
    new FFarbe2 = strval(tmp);
    for(new h = 0; h < sizeof(GangAutoInfo); h++){
    if(GangAutoInfo[h][cOwner] == -1 && GangAutoInfo[h][cTyp] == -1 && GangAutoInfo[h][cColor1] == -1 && GangAutoInfo[h][cColor2] == -1){
    for(new i = 0; i < sizeof(AdminCar); i++){
    if(AdminCar[i][ATOCarID] == GetPlayerVehicleID(playerid)){
    AdminCar[i][ATOOwnerID] = -1;
    AdminCar[i][ATOCarID] = -1;
    }}
    GangAutoInfo[h][cID] = -1;
    GangAutoInfo[h][cOwner] = GangID;
    GangAutoInfo[h][cTyp] = GetVehicleModel(GetPlayerVehicleID(playerid));
    GetVehiclePos(GetPlayerVehicleID(playerid),GangAutoInfo[h][cPosX],GangAutoInfo[h][cPosY],GangAutoInfo[h][cPosZ]);
    GetVehicleZAngle(GetPlayerVehicleID(playerid),GangAutoInfo[h][cRot]);
    GangAutoInfo[h][cColor1] = FFarbe1;
    GangAutoInfo[h][cColor2] = FFarbe2;
    GangAutoInfo[h][cStatus] = 0;
    GangAutoInfo[h][cTank] = 100;
    GangAutoInfo[h][cMeter] = 0;
    DestroyVehicleSelfmade(GetPlayerVehicleID(playerid));
    SetTimerEx("CreateNewlyGangAutos",20000,0,"i",h);
    SendClientMessage(playerid, COLOR_YELLOW, "Du hast erfolgreich ein Auto erstellt, es spawnt in 20 Sekunden.");
    format(string,sizeof(string),"%s hat ein auto erstellt ",sendername);
    EnterToLog("creategangcar",string);
    break;
    }
    }
    return 1;
    }
    else
    {
    SendClientMessage(playerid, COLOR_ERRORTEXT, " Du bist in keinem Fahrzeug !");
    return 1;
    }
    }
    }


    Public:
    public CreateNewlyGangAutos(GCarID)
    {
    if(GangAutoInfo[GCarID][cTyp] != -1)
    {
    if(GangAutoInfo[GCarID][cID] == -1)
    {
    if(GangAutoInfo[GCarID][cStatus] == 0)
    {
    GangAutoInfo[GCarID][cID] = CreateVehicle(GangAutoInfo[GCarID][cTyp],GangAutoInfo[GCarID][cPosX],GangAutoInfo[GCarID][cPosY],GangAutoInfo[GCarID][cPosZ],GangAutoInfo[GCarID][cRot],GangAutoInfo[GCarID][cColor1],GangAutoInfo[GCarID][cColor2],GangAutoInfo[GCarID][cReSpawnTime]);
    Gas[GangAutoInfo[GCarID][cID]] = GangAutoInfo[GCarID][cTank];
    new string[50];
    format(string, sizeof(string), "{FFFF00}GLS-{21DD00}%d", GangAutoInfo[GCarID][cID]);
    SetVehicleNumberPlate(GangAutoInfo[GCarID][cID],string);
    SetVehicleToRespawn(GangAutoInfo[GCarID][cID]);
    OnVehicleDamageStatus(GCarID);
    }
    }
    }
    return 1;
    }

  • Was steht im Log in den ersten Zeilen, wenn du den Befehl ausführst?
    Das Fahrzeug wird aber erstellt, und die Nachrichten siehst du auch?

    SQL: server_log.txt
    SELECT: SELECT * FROM `gangautos` WHERE `SlotID` = '0'
    [20:07:56] UPDATE: UPDATE `gangautos` SET `CarID`='-1', `OwnerID`='25', `TypID`='522', `PosX`='-237.7', `PosY`='2600.1', `PosZ`='62.2', `Rotation`='273.5', `Farbe1`='1', `Farbe2`='1', `Status`='0', `Tank`='100', `ReSpawnTime`='1800' WHERE `SlotID`='0'

    Wird geupdatet, kann nicht gehen weil in der Tabelle ja nichts eingetragen ist.


    Gruß