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(); } } }
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
@Xp10d3 It return true if a record has been found, and false if the uuid is not in the base. You dun need your method check player. https://www.tutorialspoint.com/java-resultset-next-method-with-example
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; }
@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
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; }
@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; }
Thank you so much; I really appreciate it I'll test this when I get home EDIT: Fixed! Thanks!!! Marking thread as solved.