Zweiter MySQL Befehl in while-Schleife

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,


    Lasst euch bitte nicht von diesem Text hier in die Irre führen. Der aktuelle Quell-Code findet ihr unten bei meinem Beitrag mit dem Titel "Veränderung". Danke an alle die mir helfen wollen.

    Spoiler anzeigen
    ich habe eine while-Schleife die bei OnGameModeInit immer geladen wird. In der while-Schleife werden alle eingetragenen Autos aus der Datenbank gelesen und auf dem Server hinzugefügt. Mein Problem ist jetzt, ich habe vor die ganzen ID's die die Autos In-Game haben in die Datenbank zu schreiben. Das sieht wie folgt aus:

    // Lade alle Autos von der Datenbank
    mysql_query("SELECT * FROM vehicles WHERE ownerID = 0");
    mysql_store_result();

    Spoiler anzeigen
    while (mysql_fetch_row_data())
    {
    // Speichere alle Daten ab
    mysql_fetch_field("vehicleID", carID);
    mysql_fetch_field("modelID", vehicleID);
    mysql_fetch_field("color1", color1);
    mysql_fetch_field("color2", color2);
    mysql_fetch_field("posX", positionX);
    mysql_fetch_field("posY", positionY);
    mysql_fetch_field("posZ", positionZ);
    mysql_fetch_field("posAngle", positionAngle);
    mysql_fetch_field("platetext", platetext);

    Spoiler anzeigen
    vehicleID = CreateVehicle(strval(vehicleID), strval(positionX), strval(positionY), strval(positionZ), strval(positionAngle), strval(color1), strval(color2), 0)
    format(query, sizeof(query), "UPDATE vehicles SET ingameID = %d WHERE vehicleID = %d", vehicleID, carID);
    mysql_query(query);
    }

    Spoiler anzeigen
    Jetzt habe ich das Problem das genau 1 Auto geladen wird, da dieser Code drinnen steht:

    format(query, sizeof(query), "UPDATE vehicles SET ingameID = %d WHERE vehicleID = %d", vehicleID, carID);
    mysql_query(query);

    Spoiler anzeigen
    Würde ich jetz den Code entfernen, werden alle Autos geladen. Aber ich muss ja auch an die ID der Autos kommen. Wie kann ich in eine MySQL SELECT while-Schleife ein MySQL Update noch einbauen ?

    Einmal editiert, zuletzt von Mr_Brox ()

  • nach der while schleife eine for-Schleife


    for (new i = 0; i < MAX_VEHICLES; i ++) {
    hier deine ids abfragen blah blah
    }


    oder dirn anderes Plugin zulegen. Das von Strickenkid z.B. speichert die Ausgaben des mySQL-Query in eine Variable, bzw hat die Möglichkeit dazu.
    Alternativ musst du dir diese Variable selbst erstellen.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Wenn du das Plugin von Strickenkid benutzt, dann benutz


    new sqldata[256];


    mysql_query("Dein query");
    mysql_store_result();
    while (mysql_fetch_row(sqldata)) {
    ..
    mysql_query("Dein zweiter Query");
    }


    Funktioniert bei mir astrein.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • // Lade alle Autos von der Datenbank
    mysql_query("SELECT * FROM vehicles WHERE ownerID = 0");
    mysql_store_result();


    while (mysql_fetch_row(sqldata))
    {
    // Speichere alle Daten ab
    mysql_fetch_field("vehicleID", carID);
    mysql_fetch_field("modelID", vehicleID);
    mysql_fetch_field("color1", color1);
    mysql_fetch_field("color2", color2);
    mysql_fetch_field("posX", positionX);
    mysql_fetch_field("posY", positionY);
    mysql_fetch_field("posZ", positionZ);
    mysql_fetch_field("posAngle", positionAngle);
    mysql_fetch_field("platetext", platetext);


    //SetVehicleNumberPlate(CreateVehicle(strval(vehicleID), strval(positionX), strval(positionY), strval(positionZ), strval(positionAngle), strval(color1), strval(color2), 0), platetext);
    ingameID = CreateVehicle(strval(vehicleID), strval(positionX), strval(positionY), strval(positionZ), strval(positionAngle), strval(color1), strval(color2), 0);


    format(query2, sizeof(query2), "UPDATE vehicles SET ingameID = %d WHERE vehicleID = %d", ingameID, carID);
    mysql_query(query2);
    }


    mysql_free_result();


    Ebenfalls das Problem das nur 1 Auto geladen wird. Und die IngameID wird ebenfalls nicht eingetragen.


    Auszug aus dem Log:

  • Dann wirst du wohl nicht drumrum kommen die IDs zwischenzuspeichern und nach der while schleife mit ner for-schleife alles abzuarbeiten. Wobei ich keine Ahnung hab, warum es bei dir nicht klappt, ich hab mehrere Schleifen mit weiteren Querys drin und nicht einer davon macht Probleme :x


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Nach einem Monat melde ich mich hier wieder. Ich habe jetzt herausgefunden das ich nicht nur ein Problem mit einem zweiten Query habe, ich habe auch ein Problem wenn ich nur die while- Schleife ohne Quelltext zwischen der while- Schleife habe.


    Ich bekomme immer folgende Meldung in der Konsole:

    Code
    [MySQL] Error (0): Function: mysql_fetch_row_data failed, no field data.


    Hier ist mal ein Code aus einer public- Function die jede Sekunde ausgeführt wird:

    public HouseInfosUpdate()
    {
    new houseID[20], owner[MAX_PLAYER_NAME+1], houseLevel[20], housePrice[30], description[256], pickupPosX[20], pickupPosY[20], pickupPosZ[20], rentable[2], rentprice[20], string[256];


    mysql_query("SELECT * FROM houses");
    mysql_store_result();


    while (mysql_fetch_row_data())
    {
    }


    mysql_free_result();
    }


    Wenn ich das nur so ausführe, kommt genau die selbe Meldung als würde ich das ausführen:

    public HouseInfosUpdate()
    {
    new houseID[20], owner[MAX_PLAYER_NAME+1], houseLevel[20], housePrice[30], description[256], pickupPosX[20], pickupPosY[20], pickupPosZ[20], rentable[2], rentprice[20], string[256];


    mysql_query("SELECT * FROM houses");
    mysql_store_result();


    while (mysql_fetch_row_data())
    {
    mysql_fetch_field("houseID", houseID);
    mysql_fetch_field("owner", owner);
    mysql_fetch_field("level", houseLevel);
    mysql_fetch_field("price", housePrice);
    mysql_fetch_field("description", description);
    mysql_fetch_field("pickupPosX", pickupPosX);
    mysql_fetch_field("pickupPosY", pickupPosY);
    mysql_fetch_field("pickupPosZ", pickupPosZ);
    mysql_fetch_field("rentable", rentable);
    mysql_fetch_field("rentprice", rentprice);


    Delete3DTextLabel(HouseInfosText[strval(houseID)]);


    if (!strcmp("Niemand", owner, true))
    {
    format(string, sizeof(string), "[Haus: %d]\n%s\nBesitzer: Niemand\nLevel: %d\nPreis: $%d Dollar\nHaus mit /buyhouse kaufen", strval(houseID), description, strval(houseLevel), strval(housePrice));
    HouseInfosText[strval(houseID)] = Create3DTextLabel(string, grey, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), 15.0, 0, 0);


    DestroyPickup(HouseInfosPickup[strval(houseID)]);
    HouseInfosPickup[strval(houseID)] = CreatePickup(1273, 1, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), -1);
    }
    else
    {
    if (strval(rentable) == 1)
    {
    format(string, sizeof(string), "[Haus: %d]\n%s\nBesitzer: %s\nLevel: %d\nMiet-Preis: $%d Dollar\nMit /renthouse einmieten", strval(houseID), description, owner, strval(houseLevel), strval(rentprice));
    HouseInfosText[strval(houseID)] = Create3DTextLabel(string, grey, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), 15.0, 0, 0);


    DestroyPickup(HouseInfosPickup[strval(houseID)]);
    HouseInfosPickup[strval(houseID)] = CreatePickup(1239, 1, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), -1);
    }
    else
    {
    format(string, sizeof(string), "[Haus: %d]\n%s\nBesitzer: %s", strval(houseID), description, owner);
    HouseInfosText[strval(houseID)] = Create3DTextLabel(string, grey, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), 15.0, 0, 0);


    DestroyPickup(HouseInfosPickup[strval(houseID)]);
    HouseInfosPickup[strval(houseID)] = CreatePickup(1239, 1, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), -1);
    }
    }
    }


    mysql_free_result();
    }


    Ich frage mich derzeit echt, warum ich der einzigste Mensch hier bin der genau DIESES Problem hat. Könnte mal bitte einer so freundlich sein und mir einfach (Voraussetzung: Er hat das Stickenkid-MySQL Plugin) eine stink normale while- Schleife senden die einen MySQL SELECT Befehl ausführt. Lasst euch nicht von meinem Beispiel in die Irre führen. Ihr habt denke ich schon einmal so etwas in euren Scripts gebraucht und könnt mir ja ggf. ein Beispiel senden.


    Danke schonmal im Voraus.

  • Dankeschön :) Die Meldung verschwindet nun endlich, jedoch bekomme ich wenn ich einen mysql_query(); Befehl noch in die while- Schleife reinpacke folgende Meldung:

    Code
    [MySQL] Error (0): Function: mysql_store_result called when no result stored.


    Derzeitiger Code:

    public HouseInfosUpdate()
    {
    new houseID[20], owner[MAX_PLAYER_NAME+1], houseLevel[20], housePrice[30], description[256], pickupPosX[20], pickupPosY[20], pickupPosZ[20], rentable[2], rentprice[20], data[256], field[17][2], string[256];


    mysql_query("SELECT * FROM houses");
    mysql_store_result();


    while (mysql_fetch_row(data))
    {
    mysql_fetch_field("houseID", houseID);
    mysql_fetch_field("owner", owner);
    mysql_fetch_field("level", houseLevel);
    mysql_fetch_field("price", housePrice);
    mysql_fetch_field("description", description);
    mysql_fetch_field("pickupPosX", pickupPosX);
    mysql_fetch_field("pickupPosY", pickupPosY);
    mysql_fetch_field("pickupPosZ", pickupPosZ);
    mysql_fetch_field("rentable", rentable);
    mysql_fetch_field("rentprice", rentprice);


    Delete3DTextLabel(HouseInfosText[strval(houseID)]);


    if (!strcmp("Niemand", owner, true))
    {
    format(string, sizeof(string), "[Haus: %d]\n%s\nBesitzer: Niemand\nLevel: %d\nPreis: $%d Dollar\nHaus mit /buyhouse kaufen", strval(houseID), description, strval(houseLevel), strval(housePrice));
    HouseInfosText[strval(houseID)] = Create3DTextLabel(string, grey, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), 15.0, 0, 0);


    DestroyPickup(HouseInfosPickup[strval(houseID)]);
    HouseInfosPickup[strval(houseID)] = CreatePickup(1273, 1, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), -1);
    }
    else
    {
    if (strval(rentable) == 1)
    {
    format(string, sizeof(string), "[Haus: %d]\n%s\nBesitzer: %s\nLevel: %d\nMiet-Preis: $%d Dollar\nMit /renthouse einmieten", strval(houseID), description, owner, strval(houseLevel), strval(rentprice));
    HouseInfosText[strval(houseID)] = Create3DTextLabel(string, grey, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), 15.0, 0, 0);


    DestroyPickup(HouseInfosPickup[strval(houseID)]);
    HouseInfosPickup[strval(houseID)] = CreatePickup(1239, 1, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), -1);
    }
    else
    {
    format(string, sizeof(string), "[Haus: %d]\n%s\nBesitzer: %s", strval(houseID), description, owner);
    HouseInfosText[strval(houseID)] = Create3DTextLabel(string, grey, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), 15.0, 0, 0);


    DestroyPickup(HouseInfosPickup[strval(houseID)]);
    HouseInfosPickup[strval(houseID)] = CreatePickup(1239, 1, floatstr(pickupPosX), floatstr(pickupPosY), floatstr(pickupPosZ), -1);
    }
    }


    mysql_query("UPDATE houses SET price = price + 1 WHERE houseID = 2");
    }


    mysql_free_result();
    }

  • Dann ist die Tabelle vllt leer.

    Zitat

    wenn ich einen mysql_query(); Befehl noch in die while- Schleife reinpacke folgende Meldung:


    Warum solltest du das überhaupt machen ? Würde sowieso nicht funktionieren und spiegelt aber auch nicht den von dir geposteten Code wieder.



    Zitat

    while (mysql_fetch_row(data))
    {
    mysql_fetch_field("houseID", houseID); // <-- macht keinen sinn
    mysql_fetch_field("owner", owner); // <-- macht keinen sinn
    mysql_fetch_field("level", houseLevel); // <-- macht keinen sinn ... usw usf


    Wie Mellnik bereits geschrieben hat,könntest du mit sscanf data aufteilen. Alle Informationen stehen im String data.
    sscanf(data,"p<|>sdsdsdsdsdsdsdsd", .... )


    //Edit:
    Okay,sehe jetzt erst du hast tatsächlich in der while-Schleife ein mysql_query.
    Das kannst du dort nicht machen.

    Zitat

    mysql_query("UPDATE houses SET price = price + 1 WHERE houseID = 2");


    Ich hatte irgendwo mal ausführlich beschrieben wieso,finde den Post aber gerade nicht.
    Kurz gesagt, führst du dort einen SQL Befehl aus ( mysql_query ) ,wird dein altes Ergebnis überschrieben.Du speicherst zwar das Ergebnis nicht ( store_result ) , anscheinend geht aber das alte Ergebnis verloren.
    Ganz sicher bin ich mir aber dabei auch nicht.


    Da dein Query sowieso mehr oder weniger statisch ist, mach es doch einfach nach der while-Schleife.

    Einmal editiert, zuletzt von Goldkiller ()