ServerPlugin MySQL Rand System.

Dieses Thema im Forum "Programmierung" wurde erstellt von Walfisch, 10. Januar 2016.

  1. Walfisch
    Offline

    Walfisch

    Registriert seit:
    23. Mai 2015
    Beiträge:
    23
    Minecraft:
    Walfisch
    Wir haben ein Rang System weclhes über MySQL läuft geschrieben. Dabei wird jedem Spieler ein Rang in einer Tabelle zugewiesen. Beim Join wir dieser Rang abgefragt. Zudem haben wir das ganze so eingestellt, dass wenn der Spieler zum ersten mal joint, er in die Datenbank eingetragen wird. Allerdings wird manchmal beim joinen der Rang des Spielers nicht richtig abgefragt und der Spieler wird ein weiteres mal eingetragen.
    Schonmal im Voraus vielen Dank für euere Hilfe! :)
     
    #1
  2. MichiPlaysYT
    Offline

    MichiPlaysYT

    Registriert seit:
    7. September 2015
    Beiträge:
    58
    Ich glaube so kann man dir nicht helfen, ein bisschen Code müsste hier noch dabei sein
     
    #2
  3. Walfisch
    Offline

    Walfisch

    Registriert seit:
    23. Mai 2015
    Beiträge:
    23
    Minecraft:
    Walfisch
    Okey, danke.
    Hier Die "HasEverJoined Methode:
    (Damit prüfen wir ob der Spieler schonmal gejoined ist.)

    Code (Text):
    1. public static boolean hasEverJoined(Player p) {
    2.         String uuid = p.getUniqueId().toString();
    3.         try {
    4.             ResultSet rs = MySQL.Query("SELECT uuid FROM allplayers WHERE uuid='" + uuid + "'");
    5.             if (rs.next()) {
    6.                 return true;
    7.             }
    8.  
    9.         } catch (Exception localException) {
    10.         }
    11.         return false;
    12.     }
    Und hier die "getRang" Methode:
    (Damit fragen wir den Rang ab. | Verwenden wir zum Beispiel im PlayerChatListener um den Rang bei einer Nachricht abzufragen.)

    Code (Text):
    1. public static String getRang(String playeruuid) {
    2.  
    3.         String s = null;
    4.  
    5.         ResultSet rs = MySQL.Query("SELECT rang FROM allplayers WHERE uuid='" + playeruuid + "'");
    6.  
    7.         try {
    8.             java.sql.ResultSetMetaData rsmd = rs.getMetaData();
    9.             int cols;
    10.  
    11.             cols = rsmd.getColumnCount();
    12.  
    13.             for (int i = 1; i <= cols; i++)
    14.                 rsmd.getColumnLabel(i);
    15.  
    16.             while (rs.next()) {
    17.                 // eine zeile ausgeben
    18.                 for (int i = 1; i <= cols; i++)
    19.                     s = rs.getString(i);
    20.  
    21.             }
    22.         } catch (SQLException e) {
    23.             System.out.println("Fehler!");
    24.         }
    25.  
    26.         return s;
    27.  
    28.     }
    Und hier ist die "setupSpieler" Methode:

    Damit tragen wir den Spieler in die Datenbank ein, wenn der Spieler zum ersten mal joned, bzw wenn die haseverjoined Methode = false ist.

    Code (Text):
    1. public static void setupSpieler(Player p) {
    2.  
    3.         String name = p.getName();
    4.         String uuid = p.getUniqueId().toString();
    5.  
    6.         String s = "spieler";
    7.  
    8.         if (hasEverJoined(p) == false) {
    9.             MySQL.Update("INSERT INTO allplayers (name,uuid,rang) VALUES ('" + name + "','" + uuid + "','" + s + "')");
    10.         } else {
    11.             MySQL.Update("UPDATE allplayers SET name = '" + name + "' WHERE uuid = '" + uuid + "'");
    12.         }
    13.  
    14.     }
     
    #3
  4. Baba43
    Offline

    Baba43 Ehem. Teammitglied

    Registriert seit:
    5. November 2012
    Beiträge:
    589
    Also der Code ist allgemein ziemlich schlecht, aber das lassen wir jetzt mal so stehen.

    Grundsätzlich solltest du, um Konsistenz zu garantieren, schon der Datenbank mitteilen, dass keine UUID mehrfach in der Tabelle stehen darf. Dann wirft dein Plugin an der Stelle eine Exception, wodurch dein Problem nicht gelöst ist, aber du zumindest keine dauerhaft fehlerhaften Datensätze in der Datenbank hast.

    Dann gibt es grundsätzlich die Möglichkeit, der Datenbank mitzuteilen, dass ein Datensatz nur angelegt werden soll, wenn er nicht bereits existiert. Jede Methode hat ihre Nachteile, die dabei berücksichtigt werden sollten.

    Um dein eigentliches Problem zu lösen, bräuchte man vermutlich den gesamten Quelltext, denn du schreibst: "Allerdings wird manchmal beim joinen der Rang des Spielers nicht richtig abgefragt und der Spieler wird ein weiteres mal eingetragen.". Wie soll ich das verstehen? Ist damit jetzt die setupSpieler()-Methode gemeint? Wie wäre es für den Anfang damit, dass du Exceptions nicht ins Leere laufen, sondern ausgeben lässt, damit du überhaupt mitbekommst, wenn es zu Fehlern gekommen ist?

    Sprechen wir außerdem von einer Serverinstanz oder von einem Netzwerk?
     
    #4
    Asgarioth und jensIO gefällt das.
  5. Asgarioth
    Offline

    Asgarioth

    Registriert seit:
    17. Juli 2014
    Beiträge:
    51
    Ort:
    Hessen
    Minecraft:
    Asgarioth
    Hi,

    Exceptions fängt man ja normalerweise nicht ab, um sie zu ignorieren sondern den Fehler zu behandeln... ;) Soweit ich das mit den Schnippseln beurteilen kann liegt die Ursache wahrscheinlich in Der hasEverJoined Methode (soweit nicht im unbekannten Code anderer Unfug passiert). Diese wird nämlich still und leise (da Exceptions zwar gefangen aber nicht behandelt werden) immer FALSE liefern, wenn bei dem DB-Query was schief geht... (Warum da was schief geht ist ein anderes Thema).

    In der Folge wird setupSpieler im Fehlerfall bei hasNeverJoined immer einen Insert absetzen. Du musst die Exceptions also entweder sauber verarbeiten, weiterreichen oder eine neue eigene Exceptions werfen. So oder so muss sie verarbeitet und nicht ignoriert werden.

    So Long,
    ~Asgarioth
     
    #5
    jensIO gefällt das.
  6. Cyrox
    Offline

    Cyrox