• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Problem mit Entfehnen eines Spielers (MYSQL)

McWizzardDev

Kuhfänger
Registriert
7 Oktober 2015
Beiträge
56
Alter
30
Diamanten
300
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:
package de.germandev.autonick.mysql;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;

import org.bukkit.Bukkit;

public class SQLMethoden {
   
    public static boolean isUserExists(UUID uuid) {
        try {
            PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT * FROM Nick WHERE UUID = ?");
            ps.setString(1, uuid.toString());
            ResultSet rs = ps.executeQuery();
            rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
   
    public static void update(UUID uuid, boolean remove, String playername) {
       
        if(isUserExists(uuid)) {
            try {
                PreparedStatement ps = MySQL.getConnection().prepareStatement("UPDATE Nick SET NickName = ? WHERE UUID = ?");
                ps.setString(1, uuid.toString());
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } else {
            try {
                PreparedStatement ps = MySQL.getConnection().prepareStatement("INSERT INTO Nick (UUID,NickName) VALUES (?,?,?)");
                ps.setString(1, uuid.toString());
                ps.setString(2, playername);
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
   
    public static void delete(UUID uuid) {
        if(isUserExists(uuid)) {
            try {
                PreparedStatement ps = MySQL.getConnection().prepareStatement("DELETE * FROM Nick WHERE UUID = ?");
                ps.setString(1, uuid.toString());
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } else {
            Bukkit.getConsoleSender().sendMessage("§cMySQL der Spieler mit der UUID " + uuid.toString() + " §cist nicht in der Datenbank");
        }
    }
   
    public static String getPoints(UUID uuid) {
        try {
            PreparedStatement ps =  MySQL.con.prepareStatement("DELETE * FROM Nick WHERE UUID = ?");
            ps.setString(1, uuid.toString());
            ResultSet rs = ps.executeQuery();
            while(rs.next()) {
                return rs.getString("NickName");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

}

Hier noch die erstellten Tabellen:

Code:
        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.
 

Microsamp

Minecrafter
Registriert
30 Mai 2015
Beiträge
19
Diamanten
300
  • public static boolean isUserExists(UUID uuid) {
  • try {
  • PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT * FROM Nick WHERE UUID = ?");
  • ps.setString(1, uuid.toString());
  • ResultSet rs = ps.executeQuery();
  • rs.next();
  • } catch (SQLException e) {
  • e.printStackTrace();
  • }
  • return false;
  • }
"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 ;) .
 

phenomax

Ehemaliges Teammitglied
Ehem. Teammitglied
Registriert
12 Februar 2016
Beiträge
17
Diamanten
0
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:
 public static boolean isUserExists(UUID uuid) {
        try {
            PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT * FROM Nick WHERE UUID = ?");
            ps.setString(1, uuid.toString());
            ResultSet rs = ps.executeQuery();
            rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
Das Problem hier ist, dass du immer false returnst und das Ergebnis von rs.next(); ignoriert.
Dementsprechend müsstest du also auch
Code:
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:
 public static boolean isUserExists(UUID uuid) {
        try {
            PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT * FROM Nick WHERE UUID = ?");
            ps.setString(1, uuid.toString());
            ResultSet rs = ps.executeQuery();
            if  (rs.hasNext()) {
             return true;
             }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
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
 
Oben