Solved MySQL errors

Discussion in 'Plugin Development' started by kember007, Mar 26, 2015.

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

    kember007

    I've implemented MySQL into my plugin, the plugin connects and makes a database with table and such but something is wrong my SQL syntax when I try to UPDATE/INSERT into a table(Errors as bottom of thread)...
    Main class :
    Code:
    package me.kemsly.spells;
    
    import java.sql.SQLException;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.Sign;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class spells extends JavaPlugin implements Listener
    {
        public MySQLManager mysql = new MySQLManager(this);
        public void onEnable()
        {
            Bukkit.getServer().getLogger().info("Spells has been enabled!");
            Bukkit.getServer().getPluginManager().registerEvents(this, this);
            try {
                this.mysql.setupDB();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        public void onDisable()
        {
            try {
                this.mysql.closeDB();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Bukkit.getServer().getLogger().info("Spells has been disabled!");
        }
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
        {
            if(cmd.getName().equalsIgnoreCase("setclass"))
            {
                Player player = (Player) sender;
                this.mysql.pclass = "Assassin";
                try {
                    this.mysql.setClass(player);
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return false;
        }
        @EventHandler
        public void onPlayerInteract(PlayerInteractEvent event) throws ClassNotFoundException, SQLException
        {
            Player player = event.getPlayer();
            if(event.getAction() == Action.RIGHT_CLICK_BLOCK)
            {
                Block block = event.getClickedBlock();
                if(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)
                {
                    Sign sign = (Sign) block.getState();
                    String[] lines = sign.getLines();
                    if(lines[0].equalsIgnoreCase("[Class]"))
                    {
                        if(lines[1].equalsIgnoreCase("Warrior"))
                        {
                            if(this.mysql.getClass(player).equalsIgnoreCase("Warrior") || this.mysql.getClass(player).equalsIgnoreCase("Assassin") || this.mysql.getClass(player).equalsIgnoreCase("Archer"))
                            {
                                player.sendMessage(ChatColor.RED + "[" + ChatColor.GRAY + "Class" + ChatColor.RED + "]" + ChatColor.AQUA + " You have already selected a class! Use '/class reset' to reset your class for a fee.");
                            }
                            else
                            {
                                this.mysql.pclass = "Warrior";
                                this.mysql.setClass(event.getPlayer());
                                player.sendMessage(ChatColor.RED + "[" + ChatColor.GRAY + "Class" + ChatColor.RED + "]" + ChatColor.AQUA + " You have set your class as warrior!");
                            }
                        }
                        if(lines[1].equalsIgnoreCase("Assassin"))
                        {
                            if(this.mysql.getClass(player).equalsIgnoreCase("Warrior") || this.mysql.getClass(player).equalsIgnoreCase("Assassin") || this.mysql.getClass(player).equalsIgnoreCase("Archer"))
                            {
                                player.sendMessage(ChatColor.RED + "[" + ChatColor.GRAY + "Class" + ChatColor.RED + "]" + ChatColor.AQUA + " You have already selected a class! Use '/class reset' to reset your class for a fee.");
                            }
                            else
                            {
                                this.mysql.pclass = "Assassin";
                                this.mysql.setClass(event.getPlayer());
                                player.sendMessage(ChatColor.RED + "[" + ChatColor.GRAY + "Class" + ChatColor.RED + "]" + ChatColor.AQUA + " You have set your class as assassin!");
                            }
                        }
                    }
                }
            }
        }
    }
    
    Here is the MySQL stuff :
    Code:
    package me.kemsly.spells;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import org.bukkit.entity.Player;
    
    import code.husky.mysql.MySQL;
    
    
    public final class MySQLManager
    {
        private MySQL db;
        private final spells main;
        public MySQLManager(spells s)
        {
            this.main = s;
        }
        public String pclass = "";
        public void setupDB() throws SQLException, ClassNotFoundException
        {
            this.db = new MySQL(this.main, "localhost", "3306", "spellsandclasses", "root", "");
            this.db.openConnection();
            Statement statement = this.db.getConnection().createStatement();
            statement.executeUpdate("CREATE TABLE IF NOT EXISTS playerclasses(player varchar(32), class varchar(32));");
        }
        public void closeDB() throws SQLException
        {
            this.db.closeConnection();
        }
        public String getClass(Player player) throws ClassNotFoundException, SQLException
        {
            String pname = player.getDisplayName().toLowerCase();
            if(!this.db.checkConnection())
            {
                this.db.openConnection();
            }
            Statement statement = this.db.getConnection().createStatement();
            ResultSet rs = statement.executeQuery("SELECT * FROM 'playerclasses' WHERE 'player'='"+pname+"';");
            if(!rs.next())
            {
                return "None";
            }
            return rs.getString("class");
        }
        public void setClass(Player player) throws ClassNotFoundException, SQLException
        {
            String pname = player.getDisplayName().toLowerCase();
            if(!this.db.checkConnection())
            {
                this.db.openConnection();
            }
            Statement statement = this.db.getConnection().createStatement();
            String playerClass = this.getClass(player);
            if(!playerClass.equals(null))
            {
                statement.executeUpdate("INSERT INTO playerclasses (player, class) VALUES('"+pname+"','"+pclass+"');");
            }
            else
            {
                statement.executeUpdate("UPDATE playerclasses SET class='"+pclass+"' WHERE player='"+pname+"';");
            }
        }
    }
    
    Here is my error code :
    Code:
    [18:40:44 INFO]: kemsly[/127.0.0.1:60181] logged in with entity id 263 at ([worl
    d] 21.45338499386272, 63.0, 462.2740979789605)
    [18:40:47 INFO]: kemsly issued server command: /setclass
    [18:40:47 WARN]: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You
    have an error in your SQL syntax; check the manual that corresponds to your MySQ
    L server version for the right syntax to use near ''playerclasses' WHERE 'player
    '='kemsly'' at line 1
    [18:40:47 WARN]:        at sun.reflect.NativeConstructorAccessorImpl.newInstance
    0(Native Method)
    [18:40:47 WARN]:        at sun.reflect.NativeConstructorAccessorImpl.newInstance
    (Unknown Source)
    [18:40:47 WARN]:        at sun.reflect.DelegatingConstructorAccessorImpl.newInst
    ance(Unknown Source)
    [18:40:47 WARN]:        at java.lang.reflect.Constructor.newInstance(Unknown Sou
    rce)
    [18:40:47 WARN]:        at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
    [18:40:47 WARN]:        at com.mysql.jdbc.Util.getInstance(Util.java:382)
    [18:40:47 WARN]:        at com.mysql.jdbc.SQLError.createSQLException(SQLError.j
    ava:1052)
    [18:40:47 WARN]:        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:
    3593)
    [18:40:47 WARN]:        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:
    3525)
    [18:40:47 WARN]:        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
    
    [18:40:47 WARN]:        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:21
    40)
    [18:40:47 WARN]:        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.
    java:2620)
    [18:40:47 WARN]:        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.
    java:2570)
    [18:40:47 WARN]:        at com.mysql.jdbc.StatementImpl.executeQuery(StatementIm
    pl.java:1474)
    [18:40:47 WARN]:        at me.kemsly.spells.MySQLManager.getClass(MySQLManager.j
    ava:39)
    [18:40:47 WARN]:        at me.kemsly.spells.MySQLManager.setClass(MySQLManager.j
    ava:54)
    [18:40:47 WARN]:        at me.kemsly.spells.spells.onCommand(spells.java:51)
    [18:40:47 WARN]:        at org.bukkit.command.PluginCommand.execute(PluginComman
    d.java:44)
    [18:40:47 WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCo
    mmandMap.java:181)
    [18:40:47 WARN]:        at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchCo
    mmand(CraftServer.java:767)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.PlayerConnection.handleC
    ommand(PlayerConnection.java:1043)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.PlayerConnection.a(Playe
    rConnection.java:880)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.PacketPlayInChat.a(Packe
    tPlayInChat.java:28)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.PacketPlayInChat.handle(
    PacketPlayInChat.java:65)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.NetworkManager.a(Network
    Manager.java:186)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.ServerConnection.c(Serve
    rConnection.java:81)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.MinecraftServer.v(Minecr
    aftServer.java:734)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.DedicatedServer.v(Dedica
    tedServer.java:289)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.MinecraftServer.u(Minecr
    aftServer.java:584)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.MinecraftServer.run(Mine
    craftServer.java:490)
    [18:40:47 WARN]:        at net.minecraft.server.v1_7_R4.ThreadServerApplication.
    run(SourceFile:628)
    
    Thanks for any help, I'm rather new to creating bukkit plugins and I have trouble shooted (Don't think I just go straight to here, I try to solve the issue on my own first). I couldn't seem to find whats wrong.
     
  2. Offline

    nverdier

    @kember007 Seems pretty straight forwards to me...
     
  3. Offline

    kember007

    Yeah, I tried to fix that line however I'm not good at SQL syntax as I said and I can't seem to find the error, my code seems to match up with the SQL examples I found...
     
  4. Offline

    nverdier

    @kember007 Try running it through this. But you have to use double quotes instead of single ones.
     
  5. Offline

    kember007

    Ahah I found it, I accidentally made MySQL think playerclasses was a string and not a table, thanks @nverdier
     
  6. Offline

    nverdier

Thread Status:
Not open for further replies.

Share This Page