ServerPlugin Problem mit Entfehnen eines Spielers (MYSQL)

Dieses Thema im Forum "Programmierung" wurde erstellt von McWizzardDev, 7. Februar 2016.

  1. McWizzardDev
    Offline

    McWizzardDev

    Registriert seit:
    7. Oktober 2015
    Beiträge:
    58
    Guten Tag,

    ich schreibe gerade an einem AutoNick Plugin nun stellt sich aber folgendes Problem in den Weg.
    Ich habe gemacht, das der Nickname eingetragen wird in die MySQL Datenbank eingetragen wird und wenn man den Befehl /unnick ausführt, wird man wieder ausgetragen, doch der Spieler wird nicht ausgetragen (Auch keine Fehlermeldung)

    Dies ist meine Klasse dafür (In dieser liegt der Fehler)

    Code (Text):
    1. package de.germandev.autonick.mysql;
    2.  
    3. import java.sql.PreparedStatement;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.util.UUID;
    7.  
    8. import org.bukkit.Bukkit;
    9.  
    10. public class SQLMethoden {
    11.    
    12.     public static boolean isUserExists(UUID uuid) {
    13.         try {
    14.             PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT * FROM Nick WHERE UUID = ?");
    15.             ps.setString(1, uuid.toString());
    16.             ResultSet rs = ps.executeQuery();
    17.             rs.next();
    18.         } catch (SQLException e) {
    19.             e.printStackTrace();
    20.         }
    21.         return false;
    22.     }
    23.    
    24.     public static void update(UUID uuid, boolean remove, String playername) {
    25.        
    26.         if(isUserExists(uuid)) {
    27.             try {
    28.                 PreparedStatement ps = MySQL.getConnection().prepareStatement("UPDATE Nick SET NickName = ? WHERE UUID = ?");
    29.                 ps.setString(1, uuid.toString());
    30.                 ps.executeUpdate();
    31.             } catch (SQLException e) {
    32.                 e.printStackTrace();
    33.             }
    34.         } else {
    35.             try {
    36.                 PreparedStatement ps = MySQL.getConnection().prepareStatement("INSERT INTO Nick (UUID,NickName) VALUES (?,?,?)");
    37.                 ps.setString(1, uuid.toString());
    38.                 ps.setString(2, playername);
    39.                 ps.executeUpdate();
    40.             } catch (SQLException e) {
    41.                 e.printStackTrace();
    42.             }
    43.         }
    44.     }
    45.    
    46.     public static void delete(UUID uuid) {
    47.         if(isUserExists(uuid)) {
    48.             try {
    49.                 PreparedStatement ps = MySQL.getConnection().prepareStatement("DELETE * FROM Nick WHERE UUID = ?");
    50.                 ps.setString(1, uuid.toString());
    51.                 ps.executeUpdate();
    52.             } catch (SQLException e) {
    53.                 e.printStackTrace();
    54.             }
    55.         } else {
    56.             Bukkit.getConsoleSender().sendMessage("§cMySQL der Spieler mit der UUID " + uuid.toString() + " §cist nicht in der Datenbank");
    57.         }
    58.     }
    59.    
    60.     public static String getPoints(UUID uuid) {
    61.         try {
    62.             PreparedStatement ps =  MySQL.con.prepareStatement("DELETE * FROM Nick WHERE UUID = ?");
    63.             ps.setString(1, uuid.toString());
    64.             ResultSet rs = ps.executeQuery();
    65.             while(rs.next()) {
    66.                 return rs.getString("NickName");
    67.             }
    68.         } catch (SQLException e) {
    69.             e.printStackTrace();
    70.         }
    71.         return null;
    72.     }
    73.  
    74. }
    75.  
    Hier noch die erstellten Tabellen:

    Code (Text):
    1.         PreparedStatement ps = MySQL.getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS Nick (UUID VARCHAR(100),NickName VARCHAR(100))");


    Bitte schreibt mir keine anderen Fehler die nicht zu meiner Frage passen, da der Rest noch nicht ausgetestet ist, außerdem kommt mir nicht mit anderen Empfehlungen.
     
    #1
  2. Baba43
    Offline

    Baba43 Ehem. Teammitglied

    Registriert seit:
    5. November 2012
    Beiträge:
    590
    Bist du zu 100% sicher, dass die Methode aufgerufen wird und das Statement funktioniert?
     
    #2
    jensIO gefällt das.
  3. skcxck
    Offline

    skcxck

    Registriert seit:
    9. November 2013
    Beiträge:
    12
    Ort:
    Frankfurt am Main
    Minecraft:
    skcxck
    Wenn du allgemein mit Datenbanken arbeiten möchtest, solltest du dich immer nach geeigneten Bibliotheken umschauen.
    Ein Beispiel hierfür wäre: http://dev.bukkit.org/bukkit-plugins/sqlibrary/

    Google einwenig; Bin mir sicher das du fündig wirst.
     
    #3
  4. Microsamp
    Offline

    Microsamp

    Registriert seit:
    30. Mai 2015
    Beiträge:
    20
    "rs.next();" bringt dir momentan nicht viel, da du eigtl ein boolean returnen sollst. In diesem Fall wird immer false/0 returnt und somit wird wahrscheinlich delete() nie ausgeführt. Ps: Eine while(rs.next()){return true;} hätte es mehr getan ;) .
     
    #4
    jensIO gefällt das.
  5. McWizzardDev
    Offline

    McWizzardDev

    Registriert seit:
    7. Oktober 2015
    Beiträge:
    58
    Habs schon gelöst :D
     
    #5
  6. Lui9iGamer
    Offline

    Lui9iGamer

    Registriert seit:
    14. November 2013
    Beiträge:
    12
    Ort:
    Java-Insel
    Minecraft:
    Lui9iGamer
    Liegt es am SQL-Befehl?
    Ich bin mir nicht sicher, aber ich glaube das ist "DELETE FROM Nick WHERE UUID=?";?
     
    #6
  7. phenomax
    Offline

    phenomax Entwickler

    Registriert seit:
    12. Februar 2016
    Beiträge:
    16
    Ort:
    Deutschland
    Minecraft:
    phenomax
    Also. Erstmal wäre es gut, wenn du noch etwaige Fehlermeldungen dazuschreibst, damit wir nicht rumraten müssen :)

    Ich gehe mal davon aus, dass du dich auf die delete() Methode beziehst.
    Zuerst rufst du ja deine isUserExistsMethode auf.
    Code (Text):
    1.  public static boolean isUserExists(UUID uuid) {
    2.         try {
    3.             PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT * FROM Nick WHERE UUID = ?");
    4.             ps.setString(1, uuid.toString());
    5.             ResultSet rs = ps.executeQuery();
    6.             rs.next();
    7.         } catch (SQLException e) {
    8.             e.printStackTrace();
    9.         }
    10.         return false;
    11.     }
    Das Problem hier ist, dass du immer false returnst und das Ergebnis von rs.next(); ignoriert.
    Dementsprechend müsstest du also auch
    Code (Text):
    1. return rs.next();
    einsetzen, wolltest du den Datensatz returnen.
    Da du hier jedoch nur abfrage willst, ob ein Datenbankeintrag zur UUID existiert, würde eine einfaches return true reichen, sofern das ResultSet mindestens einen Eintrag hätte.
    Richtig wäre also
    Code (Text):
    1.  public static boolean isUserExists(UUID uuid) {
    2.         try {
    3.             PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT * FROM Nick WHERE UUID = ?");
    4.             ps.setString(1, uuid.toString());
    5.             ResultSet rs = ps.executeQuery();
    6.             if  (rs.hasNext()) {
    7.              return true;
    8.              }
    9.         } catch (SQLException e) {
    10.             e.printStackTrace();
    11.         }
    12.         return false;
    13.     }
    Performancetechnisch wäre es auch besser, wenn du nur einen Wert aus deiner DB selectest, da du hier ja nun keinen Wert weiterverarbeitest.

    An dem Rest deiner delete-Methode kann ich so keinen Fehler erkennen - aber bitte reiche noch Errormeldungen und auch sonstige Ausgaben des Plugins nach.

    Gruß und schönen Abend!
    Max
     
    #7
    skcxck, adagi und jensIO gefällt das.