一些注意事项:
当检查数据库中是否包含一定的价值,这是很好的做法,以做到这一点使用返回单个值(而不是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();
}
}
首先做的事:开始使用参数化的SQL,而不是[SQL注入攻击(HTTP:// bobby-tables.com)你现在拥有的漏洞。 –
'check'不会因'null'而分配一个值。请检查结果集的内容,例如与'check.next()'。 –
“check”ResultSet中有多少行?你没有检查。 –