[Haus System] Haus ID wird falsch wiedergegeben aber richtig ausgelesen

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
  • Nabend Gemeinde von Breadfish,
    ich habe das Problem, dass ich soeben meinen /hedit Befehl fertiggestellt habe und nun herausfinde dass er bei dem Befehl die richtige ID des Hauses herausbekommt aber eine falsche bei dem stock SaveHouses() wiedergibt.






    Ich danke im Voraus. :)

  • Ok, ändere beim Laden:
    HouseInfo[i][h_ID] = cache_get_field_content_int(i, "id");
    zu:
    HouseInfo[i][h_ID] = i;


    Sonst könnte es vorkommen, dass es mal nicht passt.


    Zwecks dem Problem:



    herausfinde dass er bei dem Befehl die richtige ID des Hauses herausbekommt aber eine falsche bei dem stock SaveHouses() wiedergibt.

    Wie genau findest du das heraus, kannst du das erklären, bzw. zeigen, welche Werte ausgegeben werden, und welche ausgegeben werden sollten (vor allem die ID)?

  • Beitrag von CaZe ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Ignorieren Fehler in der Syntax ().
  • Habe gerade herausgefunden dass ich mir einen fehlerhaften Print habe ausgeben lassen und deswegen weiter verzweifle :/ :D
    Es geht darum, wenn ich das Haus 1 bearbeite und den [h_bought] von 0 auf 1 ändere, er diesen für die Serverlaufzeit speichert, nach dem Restart aber wieder auf 0 setzt, da etwas an der Speicherfunktion nicht zu klappen scheint.



  • Die Haus-ID mit dem Index gleich zu setzen ist keine gute Idee. Das wird zwar gerne als Lösung angeboten und von vielen Usern hier im Forum so gemacht, deswegen ist es aber noch lange nicht gut.
    Ich würde die o.g. Änderung Jeffry wieder rückgängig machen und beim Speichern für die Spalte ID nicht h nehmen sondern die ID im h index.
    format(query,sizeof(query),"%s WHERE id='%i'",query,HouseInfo[i][h_ID]);


    Wahrscheinlich passt es mit Index bzw Haus-ID an anderen Stellen in deinem Skript ebenfalls nicht. Du solltest aber lieber das korrigieren anstatt den Fehler weiter zu schleppen.

  • Ich würde die o.g. Änderung Jeffry wieder rückgängig machen und beim Speichern für die Spalte ID nicht h nehmen sondern die ID im h index.

    Das kann er machen, in seinem Fall spielt es aber keine Rolle, zumindest noch nicht, da er alle Zeilen lückenlos gefüllt hat. Bleibt das so, ist es egal (je nach dem wie es geplant ist).


    Falls nicht, dann muss er einiges ändern:
    format(query,sizeof(query),"%s WHERE id='%i'",query,h);
    zu:
    format(query,sizeof(query),"%s WHERE id='%i'",query,HouseInfo[h][h_ID]);



    Beim Laden natürlich die Änderung wieder zurück zu:
    HouseInfo[i][h_ID] = cache_get_field_content_int(i, "id");



    Bei der Erstellung:
    HouseInfo[i][h_ID] = i;
    entfernen, und bei mysql_pquery ein Callback aufrufen lassen, mit "i" als Parameter.
    In dem Callback muss dann cache_insert_id() der h_ID zugewiesen werden.


    http://wiki.sa-mp.com/wiki/MySQL/R33#cache_insert_id




    Zwecks dem Problem:
    Lasse dir das Query der Speicherung mal mit einem Print ausgeben, und poste dann die Ausgabe, sowie den MySQL Log dazu.

  • Keine gute Praxis nur weil es noch nicht so ist.

    Eine Vorsorge macht nur dann Sinn, wenn man sie auch verwenden wird, was man hier nicht sagen kann, das wäre reine Spekulation, und daher lasse ich die Systeme der Leute so, wie sie sie selbst aufgebaut haben. Ich miete mir auch keine 10TB an Webspace, nur weil ich sie vielleicht mal brauchen könnte. Man kann die Dinge immernoch ändern, wenn es benötigt wird.
    Der Code, so wie er ist, funktioniert mit beiden Varianten, daher tut eine Diskussion dafüber für mich nichts zur Sache und hilft auch nicht zur Problemlösung, im Gegenteil.




    Zum Problem:
    Lass dir das Query mal printen und poste dann was geprintet wird, wenn die Speicherung aufgerufen wird.

  • Habe jetzt die Speicherfunktion sowie die Ladefunktion in dieses umgeändert:
    Jetzt liegt aber das Problem vor, dass bei dem Haus mit der ID 0 alles gelöscht wird außer die Float:Positionen, BuyPrice und RentPrice. O.o


  • Kannst du von der Speicherfunktion das Query mal printen lassen, und posten, was da geprintet wird, wenn diese ausgeführt wird, und direkt nach deren Ausführung die Daten falsch in der Datenbank sind?
    Wenn dort die Werte nämlich schon 0 sind, dann liegt der Fehler woanders.

  • Scheint kritisch zu sein.
    [16:27:44] UPDATE houses SET RentPrice='0', IsLocked='1', Money='0', RentAble='0', Renter='0', Interior='7', Bought='0', Type='3', Owner='-' WHERE id='0'[16:27:44] UPDATE houses SET RentPrice='85', IsLocked='1', Money='0', RentAble='0', Renter='0', Interior='1', Bought='0', Type='1', Owner='-' WHERE id='1'[16:27:44] UPDATE houses SET RentPrice='85', IsLocked='0', Money='0', RentAble='0', Renter='0', Interior='0', Bought='0', Type='0', Owner='' WHERE id='0'[16:27:44] UPDATE houses SET RentPrice='85', IsLocked='0', Money='0', RentAble='0', Renter='0', Interior='0', Bought='0', Type='0', Owner='' WHERE id='0'[16:27:44] UPDATE houses SET RentPrice='85', IsLocked='0', Money='0', RentAble='0', Renter='0', Interior='0', Bought='0', Type='0', Owner='' WHERE id='0'[16:27:44] UPDATE houses SET RentPrice='85', IsLocked='0', Money='0', RentAble='0', Renter='0', Interior='0', Bought='0', Type='0', Owner='' WHERE id='0'[16:27:44] UPDATE houses SET RentPrice='85', IsLocked='0', Money='0', RentAble='0', Renter='0', Interior='0', Bought='0', Type='0', Owner='' WHERE id='0'[16:27:44] UPDATE houses SET RentPrice='85', IsLocked='0', Money='0', RentAble='0', Renter='0', Interior='0', Bought='0', Type='0', Owner='' WHERE id='0'[16:27:44] UPDATE houses SET RentPrice='85', IsLocked='0', Money='0', RentAble='0', Renter='0', Interior='0', Bought='0', Type='0', Owner='' WHERE id='0'[16:27:44] UPDATE houses SET RentPrice='85', IsLocked='0', Money='0', RentAble='0', Renter='0', Interior='0', Bought='0', Type='0', Owner='' WHERE id='0'



    //EDIT:
    Habe auch bemerkt dass wenn ich ein Haus erstelle dies nicht kaufen kann:


    ist alles korrekt lag daran dass in der SpielerInfo [pOwnHouse] 1 war.

  • Ok, es liegt daran, dass du nicht abfragst, ob ein Haus existiert, aber in deinem Array Items hast, die eben nicht existieren (0-Zeilen).
    Mache es so:
    stock SaveHouses()
    {
    new query[256];
    for(new h=0;h<MAX_HOUSES;h++)
    {
    if(HouseInfo[h][h_int] == 0) continue;
    format(query,sizeof(query),"UPDATE houses SET RentPrice='%i',",query,HouseInfo[h][h_rentprice]);
    format(query,sizeof(query),"%s IsLocked='%i',",query,HouseInfo[h][h_locked]);
    format(query,sizeof(query),"%s Money='%i',",query,HouseInfo[h][h_money]);
    format(query,sizeof(query),"%s RentAble='%i',",query,HouseInfo[h][h_rentable]);
    format(query,sizeof(query),"%s Renter='%i',",query,HouseInfo[h][h_renter]);
    format(query,sizeof(query),"%s Interior='%i',",query,HouseInfo[h][h_int]);
    format(query,sizeof(query),"%s Bought='%i',",query,HouseInfo[h][h_bought]);
    format(query,sizeof(query),"%s Type='%i',",query,HouseInfo[h][h_type]);
    format(query,sizeof(query),"%s Owner='%s'",query,HouseInfo[h][h_owner]);
    format(query,sizeof(query),"%s WHERE id='%i'",query,HouseInfo[h][h_ID]);
    mysql_pquery(Handle,query);
    }
    return 1;
    }