[jTuT] MySQL R41-4 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System)

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
  • cache_get_value_name_string ?

    Nur:
    cache_get_value_name
    http://wiki.sa-mp.com/wiki/MySQL/R40#cache_get_value_name



    Und kann mir noch jemand sagen wie man die Auto inkrementierung bei 0 beginnen lassen kann?

    https://stackoverflow.com/ques…-from-0-but-starts-from-1


    Allerdings solltest du eher darauf verzichten, die Zeilen mit 0 zu beginnen.
    Besser wäre es, den AUTO_INCREMENT Wert trotzdem auf 1+ zu lassen, und parallel dazu eine zweite Spalte zu erstellen, die dann den AUTO_INCREMENT Wert -1 bekommt.
    Somit wäre dann 1 -> 0, 2 -> 1, 3 -> 2, etc...
    Oder eben von 1 beginnen zu zählen, das wäre die beste Möglichkeit.

  • @Jeffry Weißt du warum er nichts zurück gibt? Steht unter OnGameModeInit. Das print gibt weder die [hID] , noch [hEnterx] aus.

  • Habs jetzt so gelöst, kann nur schlecht einschätzen wie groß die query sein muss... schlimm wenn die bisschen überdimensional groß is?^^

    Code
    for(new i = 1; i < sizeof(HouseInfo); i++)
    	{
    		new query[2000];
    		mysql_format(handle, query, sizeof(query), "SELECT * FROM property WHERE id = '%d'", i);
    		mysql_pquery(handle, query, "LoadPropertys", "d", i);
    	}


  • Du solltest aus Performance Gründen nur ein Query absenden, ohne die WHERE Bedingung. Das Ergebnis kannst du dann im Callback mit einem Loop durchgehen. Dann wird die Datenbank nur einmal anstatt x mal angesprochen.

    kann nur schlecht einschätzen wie groß die query sein muss... schlimm wenn die bisschen überdimensional groß is?^^

    Das Query (SELECT...) sind bei dir keine 100 Zeichen. 2000 ist da etwas überdimensioniert.

  • Wie regel ich das dann im Callback? Weil im Moment krieg ich für jeden Schleifendurchgang nur die Werte der ersten Zeile.


    Code
    new query[200];
    	mysql_format(handle, query, sizeof(query), "SELECT * FROM property");
    	mysql_pquery(handle, query, "LoadPropertys");


  • Und das speichern? Ist wahrscheinlich auch nicht so effizient oder? Wüsste aber nicht wie ich´s nur 1x abschicken könnte.
    Das hab ich unter OnGameModeExit:

  • Und das speichern? Ist wahrscheinlich auch nicht so effizient oder? Wüsste aber nicht wie ich´s nur 1x abschicken könnte.

    Grundsätzlich passt das.
    Man könnte es zwar alles (für alle Häuser) in ein großes Query packen und mit INSERT INTO ... ON DUPLICATE KEY UPDATE ... absenden, das macht aber relativ wenig Sinn.


    Wobei es die bessere Variante wäre, ein Haus immer dann direkt zu speichern, wenn eine Änderung passiert, so oft ändert sich an den Häusern ja nichts.
    Dann hättest du auch kein Problem, wenn der Server mittendrin abstürzt, ohne OnGameModeExit aufzurufen.


    Sprich, nicht einmal "SaveAllHouses", sondern z.B. dort wo sich der Besitzer des Hauses ändert (Kauf, Verkauf, etc...) eine Funktion "SaveHouse(id)" aufrufen.
    Sowas sollte aber natürlich nicht in einem Timer stehen, der jede Sekunde aufgerufen wird, im ungünstigsten Fall noch für alle Häuser.

  • Hmm wüsste nicht woran, müsste eigentlich daran liegen


    Mit dem Laden der Daten hats ja nichts zu tun oder? Unter OnGameModeInit hab ich:


    Code
    new query[200];
    	mysql_format(handle, query, sizeof(query), "SELECT * FROM property");
    	mysql_pquery(handle, query, "LoadPropertys");


    Einmal editiert, zuletzt von Jadeclon ()

  • Ich hab da stattdessen ein break; hin gemacht: https://pastebin.com/KEZtSLnp
    Du meintest ja:

    Wobei es die bessere Variante wäre, ein Haus immer dann direkt zu speichern, wenn eine Änderung passiert, so oft ändert sich an den Häusern ja nichts.
    Dann hättest du auch kein Problem, wenn der Server mittendrin abstürzt, ohne OnGameModeExit aufzurufen.

    Deswegen soll er bei /addhouse nur das Haus speichern das erstellt wurde, er speichert aber alle Häuser mit den Werten des neu erstellten Hauses.

  • Du meintest ja:

    Achso, jetzt verstehe ich was du meinst. Ich dachte du wolltest alle Häuser ohnehin speichern.


    Beim Anlegen des Hauses darfst du aber kein "UPDATE" Query nehmen, sondern musst ein INSERT nehmen (wie beim Registrieren hier im Tutorial).
    Das INSERT Query gibt dir dann über das aufgerufene Callback die ID des Hauses zurück, für HouseInfo[i][hID].

  • Hab aber eigentlich die Datenbank schon mit sizeof(HouseInfo) gefüllt & die IDs haben sich ja sowieso automatisch inkrementiert.
    Deswegen auch bei /addhouse die abfrage:

    Code
    if(HouseInfo[i][hEnterx] == 0.000000)
    Code
    /*for(new i = 0; i < sizeof(HouseInfo); i++)
    	{
    		new query[256];
    		mysql_format(handle, query, sizeof(query), "INSERT INTO property (hLevel) VALUES ('3')");
    		mysql_pquery(handle, query);
    	}*/
  • @Jeffry Du sagtest wenn ich ne Dumme fragen stelle möchte, kann ich das hier gern tun hihi.
    Du sagtest mir via PN, das man deine Tutorials, leicht erweitern und bearbeiten kann.
    Grade stoße ich an ein Verstänissproblem.



    Du verwendest in deinem Tutorial ja die Funktion: ShowPlayerDialog

    • #define DIALOG_REGISTER 1403
    • #define DIALOG_LOGIN 2401



    Ich möchte aber gerne mit Textdraw´s arbeiten, welche die Dialog Fenster ersetzen.
    Nur weiß ich nicht welche Publics und was ich abändern sollte, damit der gleiche Code so weiter funktioniert.


    Möchte keinen fertig geschrieben Code von dir, oder sonst wem, sondern nur ein paar Hinweise, wie ich am besten Vorgehen sollte.
    Natürlich bin ich nicht abgeneigt davon, dass auch andere helfen.




    " Wie ich ein Textdraw erstelle weiß ich." ;)




    //Edit Beweis für die Dumme Frage:
    Einfach mit PlayerTextDrawShow ?
    Erst Wiki richtig lesen, dann fragen xD ;) Denke hat sich erledigt.