Java SQL唯一用户名
空白数据库 如果我输入用户名example1,它将添加到数据库中。然后,如果我再次尝试重新添加它,它将被我的代码停止,因为它已经在数据库中。然后,如果我输入example2并添加它,它将进入数据库,然后如果我尝试重新添加它,我的代码会让它通过唯一停止它的东西是数据库主键: 我认为这条线就是问题所在:Java SQL唯一用户名,java,mysql,database,Java,Mysql,Database,空白数据库 如果我输入用户名example1,它将添加到数据库中。然后,如果我再次尝试重新添加它,它将被我的代码停止,因为它已经在数据库中。然后,如果我输入example2并添加它,它将进入数据库,然后如果我尝试重新添加它,我的代码会让它通过唯一停止它的东西是数据库主键: 我认为这条线就是问题所在: PreparedStatement st = connection.prepareStatement("select * from Members order by username
PreparedStatement st = connection.prepareStatement("select * from Members order by username asc");
以下是整个方法:
public static boolean CheckUsernameExists(String username){
boolean usernameExists = false;
try{
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(urlDB, usernameDB, passwordDB);
PreparedStatement st = connection.prepareStatement("select * from Members order by username asc");
ResultSet r1=st.executeQuery();
String usernameCounter;
if(r1.next()){
usernameCounter = r1.getString("username");
if(usernameCounter.equals(username)){
System.out.println(username);
usernameExists = true;
}
}
} catch (SQLException e) {
System.out.println("SQL Exception: "+ e.toString());
}catch (ClassNotFoundException cE){
System.out.println("Class Not Found Exception: "+ cE.toString());
}
return usernameExists;
}
将查询更改为以下内容:
"select * from Members where username=" + username
PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
st.setString(1, username);
ResultSet r1=st.executeQuery();
if(r1.next()){
System.out.println('user already exist in database!");
}
else{
//Add to database
}
它将只返回这个用户,从数据库中请求所有用户,然后在应用程序中过滤它们是没有意义的。应用程序和数据库都会过载。将查询更改为以下内容:
"select * from Members where username=" + username
PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
st.setString(1, username);
ResultSet r1=st.executeQuery();
if(r1.next()){
System.out.println('user already exist in database!");
}
else{
//Add to database
}
它将只返回这个用户,从数据库中请求所有用户,然后在应用程序中过滤它们是没有意义的。应用程序和数据库都过载。最好是这样:
"select * from Members where username=" + username
PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
st.setString(1, username);
ResultSet r1=st.executeQuery();
if(r1.next()){
System.out.println('user already exist in database!");
}
else{
//Add to database
}
或者,由于您的方法是CheckUsernameExists
:
public static boolean CheckUsernameExists(String username){
boolean usernameExists = false;
try{
PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
st.setString(1, username);
ResultSet r1=st.executeQuery();
if(r1.next()){
usernameExists = true;
}
catch (Exception e) {
System.out.println("SQL Exception: "+ e.toString());
}
return usernameExists;
}
最好是这样:
"select * from Members where username=" + username
PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
st.setString(1, username);
ResultSet r1=st.executeQuery();
if(r1.next()){
System.out.println('user already exist in database!");
}
else{
//Add to database
}
或者,由于您的方法是CheckUsernameExists
:
public static boolean CheckUsernameExists(String username){
boolean usernameExists = false;
try{
PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
st.setString(1, username);
ResultSet r1=st.executeQuery();
if(r1.next()){
usernameExists = true;
}
catch (Exception e) {
System.out.println("SQL Exception: "+ e.toString());
}
return usernameExists;
}
不要迭代所有用户。只需尝试从数据库中选择所需的用户名。此外,如果使用提供的字符串,则有SQL注入的危险。尝试使用以下方法:
PreparedStatement st = connection.prepareStatement("select * from Members where username = ?");
st.setString(1, username);
ResultSet rs = st.executeQuery();
不要迭代所有用户。只需尝试从数据库中选择所需的用户名。此外,如果使用提供的字符串,则有SQL注入的危险。尝试使用以下方法:
PreparedStatement st = connection.prepareStatement("select * from Members where username = ?");
st.setString(1, username);
ResultSet rs = st.executeQuery();
您可以通过以下方式实现您的目标:
PreparedStatement st = connection.prepareStatement("select id from Members where username = ? ");
//I assumed that their is id column in Members.
st.setString(1, username);
ResultSet resultSet=st.executeQuery();
if(resultSet.next()){
// prompt users already exists
}
else{
//add to database
}
只需抓取一个表示给定行的列,这其实并不重要,因为您只需检查是否有一行包含用户给定的用户名。(根据您当前的规格)。您可以通过以下方式实现所需:
PreparedStatement st = connection.prepareStatement("select id from Members where username = ? ");
//I assumed that their is id column in Members.
st.setString(1, username);
ResultSet resultSet=st.executeQuery();
if(resultSet.next()){
// prompt users already exists
}
else{
//add to database
}
只需抓取一个表示给定行的列,这其实并不重要,因为您只需检查是否有一行包含用户给定的用户名。(根据您当前的规格)。这太疯狂了。获取要搜索的数据库,而不是返回整个用户列表。另外,您可以执行额外的步骤,使用户名在数据库中唯一,而无需执行任何操作。用户名在数据库中唯一。代码使我可以提醒用户发生了什么。如果您能帮助了解如何让数据库搜索,请回答。尝试添加具有重复用户名的用户将引发异常。你可以抓住这一点,并提供适当的反馈。至于在数据库上搜索,请使用
WHERE
。我认为捕获异常最适合查找bug等?通常是的,但捕获数据完整性问题也是一个很好的用途(这意味着可以运行一个查询而不是两个查询)。当然,您也可以编写超级复杂的SQL来在内部处理它并生成不同的输出,但这样做几乎肯定会更慢。这太疯狂了。获取要搜索的数据库,而不是返回整个用户列表。另外,您可以执行额外的步骤,使用户名在数据库中唯一,而无需执行任何操作。用户名在数据库中唯一。代码使我可以提醒用户发生了什么。如果您能帮助了解如何让数据库搜索,请回答。尝试添加具有重复用户名的用户将引发异常。你可以抓住这一点,并提供适当的反馈。至于在数据库上搜索,请使用WHERE
。我认为捕获异常最适合查找bug等?通常是的,但捕获数据完整性问题也是一个很好的用途(这意味着可以运行一个查询而不是两个查询)。当然,您也可以编写超级复杂的SQL来在内部处理它并生成不同的输出,但这样做几乎肯定会慢一些。永远不要将用户提供的数据直接放入查询,否则小bobby表将处理您的数据。SQL注入漏洞的好例子感谢您的教训!使用准备好的语句和?
。永远不要将用户提供的数据直接放入查询,否则小bobby表将处理您的数据。SQL注入漏洞的好例子感谢您的教训!