Почему мой SQL-код не работает должным образом в наборе результатов - PullRequest
0 голосов
/ 09 мая 2019

Я пишу плагин Bukkit для моего сервера Minecraft, и мой код либо содержит ошибку в том, как я написал классы и методы, либо, как я предполагаю, в части Result set.

Он не обнаруживает, что мой проигрыватель уже находится в таблице SQL. Это в методе hasPlayer.

@EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player p = event.getPlayer();
        SQLCheckPlayer pCheck = new SQLCheckPlayer();
        pCheck.p = p;
        boolean i = pCheck.hasPlayer();
        if (i == false) {
            boolean n = pCheck.addPlayer();
            if (n == true) {
            p.sendMessage("You have been added to our database");
        } else {
            p.sendMessage("There was errors in trying to add you to our database");
        }
        } else {
            p.sendMessage("You are in our database");
        }


    }

класс SQLCheckPlayer

public class SQLCheckPlayer {

    Player p;

    public boolean hasPlayer() {
        UUID pUUID = p.getUniqueId();
        String query = "SELECT playerID FROM playerInfo;";
        try {
            if (sqlConnection.getDatabaseConnection() != null) {
            Statement st = sqlConnection.getDatabaseConnection().createStatement();
            ResultSet rs = st.executeQuery(query);
            if (rs != null) {
            do{
                if(pUUID.toString() == rs.toString()) {
                    st.close();
                    Bukkit.broadcastMessage("Player successfully added");
                    return true;
                }
            } while(rs.next());

            }
            st.close();
            } else {

                Bukkit.broadcastMessage("Database connection is null");
                return false;
            }

            return false;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Bukkit.broadcastMessage("Sql Exception");
            return false;
        }
    }

    public boolean addPlayer() {
        UUID pUUID = p.getUniqueId();

        try {
            PreparedStatement st = sqlConnection.getDatabaseConnection().prepareStatement("INSERT INTO playerInfo (playerID, playerName, playerDiamonds) VALUES (?, ?, ?)");
            st.setString(1, pUUID.toString());
            st.setString(2, p.getDisplayName());
            st.setInt(3, 0);
            st.executeUpdate();
            st.close();
            return true;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }

    }
}

После того, как я был добавлен в базу данных (что он может успешно сделать), всякий раз, когда я присоединяюсь, он должен сказать «Вы находитесь в нашей базе данных», но он всегда звучит как «При попытке добавить вас в нашу базу данных возникли ошибки» , На распечатке трассировки стека печати было сказано, что код пытается снова добавить меня в базу данных, чего не удалось, потому что я поместил уникальную вкладку в столбец playerUUID.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Проблема связана с вашим методом SQLCheckPlayer#hasPlayer(), потому что он всегда возвращает false из-за сравнения строк, которое никогда не будет истинным, поскольку вы пытаетесь преобразовать объект ResultSet в строку.Я также изменил бы строку запроса.Вы можете использовать оператор SQL EXISTS , чтобы возвращать только логическое значение, независимо от того, находится игрок в базе данных или нет.
Таким образом, новая строка запроса выглядит следующим образом:

String query = "select exists (select null from playerInfo where `playerID` = '"+p.getUniqueId().toString()+"');"

И SQLCheckPlayer#hasPlayer() будет таким:

String query = "select exists (select null from playerInfo where `playerID` = '" + p.getUniqueId().toString() + "');";
try {
    if (sqlConnection.getDatabaseConnection() != null) {
        Statement st = sqlConnection.getDatabaseConnection().createStatement();
        ResultSet rs = st.executeQuery(query);
        if (rs.next()) {
            if (rs.getBoolean(1)) {
                st.close();
                Bukkit.broadcastMessage("Player successfully added");
                return true;
            }
        }
        st.close();
    } else {
        Bukkit.broadcastMessage("Database connection is null");
        return false;
    }
    return false;
} catch (SQLException e) {
    e.printStackTrace();
    Bukkit.broadcastMessage("Sql Exception");
    return false;
}
0 голосов
/ 09 мая 2019

Вы говорите нам, что

boolean i = pCheck.hasPlayer();
if (i == false) {
    boolean n = pCheck.addPlayer();
    if (n == true) {
        p.sendMessage("You have been added to our database");
    } else {
        p.sendMessage("There was errors in trying to add you to our database");
    }
} else {
    p.sendMessage("You are in our database");
}

выходы "There was errors in trying to add you to our database".

Это потому, что pCheck.hasPlayer() будет false из-за

UUID pUUID = p.getUniqueId();
String query = "SELECT playerID FROM playerInfo;";

не считая pUUID. Вместо этого он ищет запись, имеющую "playerId" в качестве UUID. Результатом является попытка вставить этот проигрыватель снова, который не будет работать из-за некоторых ограничений базы данных (уникальный первичный ключ или что-то в этом роде).

Возможно, вы захотите переписать запрос на что-то вроде

String query = "SELECT " + pUUID + " FROM playerInfo;";

и попробуйте снова. Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...