javamysql查询

javamysql查询,java,mysql,bukkit,Java,Mysql,Bukkit,基本上,我只是检查mySQL数据库中是否存在播放器,但它不断抛出错误等。我不知道该怎么做。 (这些都是在BukkitAPI中完成的,但问题只是SQL) 当播放器登录时,它将调用databaseFindPlayer方法来查看它们是否存在于数据库中 我只需要看看这个播放器是否存在于数据库中 @EventHandler public void onPlayerLogin(PlayerJoinEvent e) throws SQLException { getLogger().

基本上,我只是检查mySQL数据库中是否存在播放器,但它不断抛出错误等。我不知道该怎么做。 (这些都是在BukkitAPI中完成的,但问题只是SQL)

当播放器登录时,它将调用databaseFindPlayer方法来查看它们是否存在于数据库中

我只需要看看这个播放器是否存在于数据库中

 @EventHandler
    public void onPlayerLogin(PlayerJoinEvent e) throws SQLException {
        getLogger().info("Player joining.... + TEST");
        if (databaseFindPlayer(e.getPlayer().getName()) == false) {
            getLogger().info("Player does not have data file.. Generating one now");
            databaseCreatePlayer(e.getPlayer().getName());
            databaseFindPlayer(e.getPlayer().getName()); //For debugging
        }
    }





  public boolean databaseFindPlayer(String name) throws SQLException {
            getLogger().info("finding players");
            PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = '" + name + "';");
            preparedStatement.setString(1, name);

            ResultSet resultSet = preparedStatement.executeQuery();

            if (resultSet.next()) {
                System.out.println("Player exists!");
                return true;
            } else {
                System.out.println("Player doesn't exist!");
                return false;
            }


    }
(所有getLogger()调用where进行调试)

编辑:


例外情况是准确地说出了问题所在

原因:java.sql.SQLException:参数索引超出范围(1>参数数,为0)

回顾一下您正在使用的声明语句的代码

PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = '" + name + "';");
preparedStatement.setString(1, name);
但是您没有提供可以绑定值的参数

相反,它应该是

PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = ?");
preparedStatement.setString(1, name);

有关更多详细信息,请参见这里的
PreparedStatement
类的意图混淆

PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = '" + name + "';");
preparedStatement.setString(1, name);
setString(1,name)
,就是说“将查询中的第一个替换项设置为名为
name
的字段中的任何内容”。因为您的查询没有任何重播,所以它对此表示不满。(参数索引超出范围)。它知道你有零个参数,你告诉它你有一个

请尝试以下操作(注意,我还删除了查询末尾的分号):


解决此问题的另一种方法是根本不设置name参数,而是手动插入一个可能受污染的值,这将使自己面临SQL注入攻击。请坚持使用上面列出的
更换。

因此,为了清楚起见?表示SQL中传递给name的变量?是的,但更像是一个参数,就像一个方法一样,
为您使用
设置
方法提供的参数定义了一个异常,因此它们需要按正确的顺序设置;)一个新问题,当玩家登录到服务器但在数据库中已经有位置时,它仍然返回false并生成另一个。假设列名正确,您的查询可能应该是
select count(*)from players where field=?
。然后,您可能需要从
ResultSet
中提取结果,并检查返回值(count)。我如何检查count并使用它,以便查看播放器是否已输入数据库?
PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = '" + name + "';");
preparedStatement.setString(1, name);
PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = ?");
preparedStatement.setString(1, name);