2015-04-26 73 views
0

我想检查,如果一名球员已经与该代码的数据库:MySQL - 对象不为空?

Statement sql = mySql.getConnection().createStatement(); 
ResultSet check = sql.executeQuery("SELECT * FROM `playerinfo` WHERE Username='" + player.getName() + "';"); 
System.out.println(check.toString()); 
if(check != null) { 
    System.out.println("2"); 
    Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "Player already in database"); 
    check.close(); 
    sql.close(); 
    return; 
} 

我查过,但没有在数据库中,它说这名球员已经包含在数据库 对不起坏英文

+3

首先做的事:开始使用参数化的SQL,而不是[SQL注入攻击(HTTP:// bobby-tables.com)你现在拥有的漏洞。 –

+0

'check'不会因'null'而分配一个值。请检查结果集的内容,例如与'check.next()'。 –

+0

“check”ResultSet中有多少行?你没有检查。 –

回答

1

一些注意事项:

当检查数据库中是否包含一定的价值,这是很好的做法,以做到这一点使用返回单个值(而不是SELECT *返回匹配WHERE,所有行的所有列的查询条件)。你可以这样做,例如通过与行限制性条款(LIMIT 1)选择的单个检查标记(SELECT 1):

SELECT 1 FROM playerinfo WHERE Username = ? LIMIT 1 

此查询保证返回只有一行(与单个列,“1”),如果与所述一个玩家给定名称存在,或者如果没有给定名称的玩家则不行。

正如其他人指出的那样,当您将参数输入到查询中时,应该使用PreparedStatement而不是带有连接输入的简单语句。这样,您可以避免SQL注入,并且数据库也能够在内部重用/缓存查询(或游标)。

最后,即使在执行过程中抛出了Exception,也应关闭所使用的资源。最好在finally子句中完成,或者如果您使用的是Java 7或更高版本,则使用try-with-resources statement

由于考虑到这些事情,你的代码重新写看起来是这样的:

PreparedStatement ps = null; 
try { 
    ps = mySQL.getConnection()   
     .prepareStatement("SELECT 1 FROM playerinfo WHERE Username = ? LIMIT 1"); 
    ps.setString(1, player.getName()); 
    ResultSet rs = ps.executeQuery(); 

    // the first invocation of rs.next() returns true if 
    // there are rows in the result set, or false if no rows were found 
    if (rs.next()) { 
     System.out.println("2"); 
     Bukkit.getConsoleSender().sendMessage(ChatColor.RED 
      + "Player already in database"); 
    }   
    rs.close(); 
} finally { 
    if (ps != null) { 
     ps.close(); 
    } 
} 
0

我想不是检查ResultSet是否为null,而应该检查ResultSet是否包含任何行。

除此之外,使用PreparedStatements。