Solved MySQL Issue

Discussion in 'Plugin Development' started by Xp10d3, Feb 20, 2020.

Thread Status:
Not open for further replies.
  1. Offline

    Xp10d3

    Hello. I am encountering some MySQL issues that I have never had before. I recently reset my computer so the database I used for testing got deleted. I set it up again, but I am not sure whether I did something wrong because I get an error and nothing happens when I run my commands.

    Error:
    Code:
    [19:50:34] [Server thread/WARN]: java.sql.SQLException: Illegal operation on empty result set.
    [19:50:34] [Server thread/WARN]:        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
    [19:50:34] [Server thread/WARN]:        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
    [19:50:34] [Server thread/WARN]:        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
    [19:50:34] [Server thread/WARN]:        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861)
    [19:50:34] [Server thread/WARN]:        at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:780)
    [19:50:34] [Server thread/WARN]:        at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2464)
    [19:50:34] [Server thread/WARN]:        at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2559)
    [19:50:34] [Server thread/WARN]:        at xp10d3.corelia.main.Commands.onCommand(Commands.java:109)
    [19:50:34] [Server thread/WARN]:        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45)
    [19:50:34] [Server thread/WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:148)
    [19:50:34] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchCommand(CraftServer.java:690)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.PlayerConnection.handleCommand(PlayerConnection.java:1606)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.PlayerConnection.a(PlayerConnection.java:1460)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(SourceFile:36)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(SourceFile:9)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:19)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.TickTask.run(SourceFile:18)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeTask(SourceFile:144)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeNext(SourceFile:118)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.MinecraftServer.ba(MinecraftServer.java:876)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.MinecraftServer.executeNext(MinecraftServer.java:869)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeAll(SourceFile:103)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.MinecraftServer.sleepForTick(MinecraftServer.java:852)
    [19:50:34] [Server thread/WARN]:        at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:793)
    [19:50:34] [Server thread/WARN]:        at java.lang.Thread.run(Unknown Source)
    
    MySQL Class:
    Code:
    package xp10d3.corelia.main;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.UUID;
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;
    import net.md_5.bungee.api.ChatColor;
    public class MysqlSetterGetter implements Listener {
        Core plugin = Core.getPlugin(Core.class);
        // On the player join, run the "createPlayer" method.
        @EventHandler
        public void onJoin(PlayerJoinEvent event) {
            Player player = event.getPlayer();
            createPlayer(player.getUniqueId(), player);
        }
        // How the player gets gold
        /*
        * @EventHandler public void onPlayerDeath(PlayerDeathEvent event) { Player
        * player = event.getEntity(); Player get = player.getPlayer();
        * updateCoins(get.getPlayer().getUniqueId());
        * getCoins(get.getPlayer().getUniqueId()); }
        */
        // If player exists then send console message saying it was found.
        // If not found, send a console message saying it's not found.
        public boolean playerExists(UUID uuid) {
            try {
                PreparedStatement statement = plugin.getConnection()
                        .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
                ResultSet results = statement.executeQuery();
                if (results.next()) {
                    Bukkit.getConsoleSender().sendMessage(ChatColor.YELLOW + "Player Found");
                    return true;
                }
                Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "Player NOT Found");
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return false;
        }
        // If player is not found, add it to the database with the UUID, name, and gold
        // amount.
        public void createPlayer(final UUID uuid, Player player) {
            try {
                PreparedStatement statement = plugin.getConnection()
                        .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
                ResultSet results = statement.executeQuery();
                results.next();
                if (playerExists(uuid) != true) {
                    PreparedStatement insert = plugin.getConnection()
                            .prepareStatement("INSERT INTO " + plugin.table + " (UUID,NAME,GOLD) VALUES (?,?,?)");
                    insert.setString(1, uuid.toString());
                    insert.setString(2, player.getName());
                    insert.setInt(3, 0);
                    insert.executeUpdate();
                    Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "Player Inserted");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        public boolean isInt(String s) {
            try {
                Integer.parseInt(s);
                return true;
            } catch (NumberFormatException e) {
                return false;
            }
        }
        // Update coin value (add 1).
        public void updateCoins(UUID uuid) {
            try {
                PreparedStatement statement1 = plugin.getConnection()
                        .prepareStatement("UPDATE " + plugin.table + " SET GOLD=? WHERE UUID=?");
                ResultSet results = statement1.executeQuery();
                results.next();
                statement1.setInt(1, results.getInt("GOLD") + 1);
                statement1.setString(2, uuid.toString());
                statement1.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        public void getCoins(UUID uuid) {
            try {
                PreparedStatement statement = plugin.getConnection()
                        .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
                ResultSet results = statement.executeQuery();
                results.next();
                //System.out.print("Player has " + results.getInt("GOLD") + " gold.");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    Commands Class:
    Code:
    package xp10d3.corelia.main;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.UUID;
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;
    import net.md_5.bungee.api.ChatColor;
    public class MysqlSetterGetter implements Listener {
        Core plugin = Core.getPlugin(Core.class);
        // On the player join, run the "createPlayer" method.
        @EventHandler
        public void onJoin(PlayerJoinEvent event) {
            Player player = event.getPlayer();
            createPlayer(player.getUniqueId(), player);
        }
        // How the player gets gold
        /*
        * @EventHandler public void onPlayerDeath(PlayerDeathEvent event) { Player
        * player = event.getEntity(); Player get = player.getPlayer();
        * updateCoins(get.getPlayer().getUniqueId());
        * getCoins(get.getPlayer().getUniqueId()); }
        */
        // If player exists then send console message saying it was found.
        // If not found, send a console message saying it's not found.
        public boolean playerExists(UUID uuid) {
            try {
                PreparedStatement statement = plugin.getConnection()
                        .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
                ResultSet results = statement.executeQuery();
                if (results.next()) {
                    Bukkit.getConsoleSender().sendMessage(ChatColor.YELLOW + "Player Found");
                    return true;
                }
                Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "Player NOT Found");
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return false;
        }
        // If player is not found, add it to the database with the UUID, name, and gold
        // amount.
        public void createPlayer(final UUID uuid, Player player) {
            try {
                PreparedStatement statement = plugin.getConnection()
                        .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
                ResultSet results = statement.executeQuery();
                results.next();
                if (playerExists(uuid) != true) {
                    PreparedStatement insert = plugin.getConnection()
                            .prepareStatement("INSERT INTO " + plugin.table + " (UUID,NAME,GOLD) VALUES (?,?,?)");
                    insert.setString(1, uuid.toString());
                    insert.setString(2, player.getName());
                    insert.setInt(3, 0);
                    insert.executeUpdate();
                    Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "Player Inserted");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        public boolean isInt(String s) {
            try {
                Integer.parseInt(s);
                return true;
            } catch (NumberFormatException e) {
                return false;
            }
        }
        // Update coin value (add 1).
        public void updateCoins(UUID uuid) {
            try {
                PreparedStatement statement1 = plugin.getConnection()
                        .prepareStatement("UPDATE " + plugin.table + " SET GOLD=? WHERE UUID=?");
                ResultSet results = statement1.executeQuery();
                results.next();
                statement1.setInt(1, results.getInt("GOLD") + 1);
                statement1.setString(2, uuid.toString());
                statement1.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        public void getCoins(UUID uuid) {
            try {
                PreparedStatement statement = plugin.getConnection()
                        .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
                ResultSet results = statement.executeQuery();
                results.next();
                //System.out.print("Player has " + results.getInt("GOLD") + " gold.");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
     
  2. Offline

    timtower Administrator Administrator Moderator

    @Xp10d3
    results.next();
    You are not checking that in createPlayer
     
  3. Offline

    Xp10d3

    How would I check that then? Sorry, I don't really understand. :(
     
  4. Offline

    timtower Administrator Administrator Moderator

    You put an if statement around it like you are doing in other places.
     
  5. Offline

    Xp10d3

    The following error occurred:
    Error 503 Backend fetch failed
    Backend fetch failed

    Guru Meditation:
    XID: 98889

    Varnish cache server
    Hmmm I get this issue when posting...

    Anyway something like this?
    Code:
        public void createPlayer(final UUID uuid, Player player) {
            try {
                PreparedStatement statement = plugin.getConnection()
                        .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
                ResultSet results = statement.executeQuery();
                if (results.next()) {
                    if (playerExists(uuid) != true) {
                        PreparedStatement insert = plugin.getConnection()
                                .prepareStatement("INSERT INTO " + plugin.table + " (UUID,NAME,GOLD) VALUES (?,?,?)");
                        insert.setString(1, uuid.toString());
                        insert.setString(2, player.getName());
                        insert.setInt(3, 0);
                        insert.executeUpdate();
    
                        Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "Player Inserted");
                    }
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
    @timtower
     
  6. Offline

    caderapee

  7. Offline

    Xp10d3

    Okay; thanks for the tip. But won't it return true if the UUID is not in the database? Cause I'm checking if the player exists. If it ISN'T true, the add the player. Else, it's in the base. But even if that's so I don't need to change anything else? And where is the method checkPlayer? Are you talking about:
    Code:
        public boolean playerExists(UUID uuid) {
            try {
                PreparedStatement statement = plugin.getConnection()
                        .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
    
                ResultSet results = statement.executeQuery();
                if (results.next()) {
                    Bukkit.getConsoleSender().sendMessage(ChatColor.YELLOW + "Player Found");
                    return true;
                }
                Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "Player NOT Found");
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return false;
        }
    
     
  8. Offline

    caderapee

    @Xp10d3
    Code:
    public boolean playerExists(UUID uuid) {
            try {
                PreparedStatement statement = plugin.getConnection()
                        .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
    
                ResultSet results = statement.executeQuery();
                if (results.next()) {
                   //Record(s) found(s). player already in the table
                }
               else {
                  //No record found. Player not in the table. We can add it here
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return false;
        }
    When you do that, you're doing 2 query, but the first one already give u the response. 'results.next();' is the response
     
  9. Offline

    Xp10d3

    Thanks :) How would I get the player though? Would it be the UUID? Because for creating the player I'm just calling the createPlayer() method instead.
    Code:
        public boolean playerExists(UUID uuid) {
            Player player = Bukkit.getPlayer(uuid);
            try {
                PreparedStatement statement = plugin.getConnection()
                        .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
    
                ResultSet results = statement.executeQuery();
                if (results.next()) {
                   //Record(s) found(s). player already in the table
                }
               else {
                  //No record found. Player not in the table. We can add it here
                   createPlayer(player.getUniqueId(), player);
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return false;
        }
    
     
  10. Offline

    caderapee

    @Xp10d3
    Nothing difficult. Get a close look in how SQL works with java.

    Code:
    public int getCoinOrCreatePlayer(final UUID uuid, Player player) {
            int playerCoin = 0;
    
            try {
                PreparedStatement statement = plugin.getConnection()
                    .prepareStatement("SELECT * FROM " + plugin.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
                ResultSet results = statement.executeQuery();
                if (!results.next()) {
                        PreparedStatement insert = plugin.getConnection()
                                .prepareStatement("INSERT INTO " + plugin.table + " (UUID,NAME,GOLD) VALUES (?,?,?)");
                        insert.setString(1, uuid.toString());
                        insert.setString(2, player.getName());
                        insert.setInt(3, 0);
                        insert.executeUpdate();
    
                        Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "Player Inserted");
                 
                } else {
                    playerCoin = results.getInt("GOLD")
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            return playerCoin;
        }
     
    Xp10d3 likes this.
  11. Offline

    Xp10d3

    Thank you so much; I really appreciate it :) I'll test this when I get home :D
    EDIT: Fixed! Thanks!!! Marking thread as solved.
     
    Last edited: Feb 22, 2020
Thread Status:
Not open for further replies.

Share This Page