让我们说我有一个表(登录),其中包含用户名(唯一密钥)和密码,用于登录。
现在,在注册模块中(通过在登录表中添加新行来创建新帐户),如果我只执行插入并检查SQLException()引发时用户名是否已经在表中,是否可以???。这是一个很好的做法吗?
以下是注册模块的示例:
enter code here
String uname = request.getParameter("username");
String passwd = request.getParameter("password");
try
{
statement.executeUpdate("insert into login(username,password) values (" + uname + "," + passwd + ")");
}
catch(SQLException e)
{
if((e.getErrorCode())==1) //error code when primary key violated
{
// username already exists....
}
//some other code
}
//username is available....rest of the code goes here
在第一个地方,我想到了一个选择查询来检查用户名(用户是否在注册时输入)已经在表格中....但对我来说似乎是多余的
因为我认为,即使这样做也不会阻止DBMS检查唯一性违规,对吧?
提前致谢。
答案 0 :(得分:1)
我建议在插入之前进行验证,以防您更改基础数据库,以更改SQLException.getErrorCode()中的错误代码。这也使您能够在用户提交表单之前进行验证。您可以创建自定义例外,通知您的服务调用者该用户名已在使用中。
检索此SQLException的特定于供应商的异常代码 对象
SELECT COUNT(*) FROM LOGIN WHERE USERNAME = :username
通过服务方法,例如:
public class UserService {
public boolean isValidUsername(String username) {
//validate
}
public void registerUser(User user) throws UsernameInUseException {
if(!isValidUsername(user.getUsername()) {
throw new UsernameInUseException("Usernaame " + user.getUsername() + " is already in use.");
}
// continue
}
}
答案 1 :(得分:0)
如果您可以在表单提交之前告诉用户使用AJAX调用已经存在用户名,那将会很酷。