如何验证来自MySQL数据库的用户电子邮件?

时间:2019-03-25 07:06:13

标签: java mysql forms jsp servlets

我的Web应用程序上有一张注册表。我想要的是,当用户提交表单时,应该进行验证以检查用户输入的电子邮件ID在数据库中是否已经存在。 因此,如果它存在,则应出现类似小吃店的消息,说明该电子邮件ID已经存在。如果这是一封新电子邮件,它将重定向到成功页面。

以下是我的checkData方法,我只是在检查在表单上输入电子邮件ID时是否存在,但是输出始终是“找不到值”。

public void checkData() {

      try {
            Class.forName("com.mysql.cj.jdbc.Driver");


          Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname?autoReconnect=true&useSSL=FALSE", "root", "pwd");



          st = con.createStatement();

           String query1 = "select email from users where email='" +email99+ "'";
          ResultSet rs = st.executeQuery(query1);


          if(rs.next()) {

              System.out.println("Success");

          }

          else {

              System.out.println("Value not found");
          }

          rs.close();




      } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println(e.getMessage());
        }

      }

注意:-我主要关心的是电子邮件验证。

谢谢

3 个答案:

答案 0 :(得分:0)

用于电子邮件验证

  • 您必须在表格中将电子邮件列设置为唯一。
  • 无论何时尝试插入新用户,如果电子邮件已经存在,SQL都会引发约束冲突异常。您还可以将该错误用于错误处理

与获取操作相比,通常更新将花费更多时间,因此最好的方法是..  首先,您必须检查此电子邮件ID是否存在任何行

String sql = "select email from users where email= ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "emailId");
ResultSet rs = prepStmt.executeQuery();

if (rs.next()) {
  System.out.println("Row with email found");
} else {
  // you can write update code here
}

答案 1 :(得分:0)

对于唯一电子邮件验证,有两种方法:

方法1: 第一个是执行选择查询并检查它,不建议将其作为解决方案。

PreparedStatement statement = connection.prepareStatement("select email from users where email= ?");
statement.setString(1, email99);    
ResultSet resultSet = statement.executeQuery();

if (resultSet.next()) {
  System.out.println("Row with email found");
} else {
  // you can write update code here
}

方法2: 在数据库级别上,使email列唯一。因此,无论何时插入新记录。 DB负责检查唯一的电子邮件地址并引发错误。使用该错误将其显示在前端。

欢呼!

答案 2 :(得分:0)

方法1:

最简单的方法是在列电子邮件中使用唯一索引。

您不能使用先查找电子邮件然后插入电子邮件的解决方案。假设有两个用户提交电子邮件some@email.com。而且您的数据库中没有电子邮件。

两个用户都将得到res.next()的错误,并且您将在同一行中向数据库插入两行。

如果使用唯一索引,则如果已经有电子邮件,则将获得Exception。您可以捕获异常并返回“重复电子邮件”消息。 请参阅问题catch duplicate exception

如果使用Mysql,也许可以使用ON DUPLICATE KEY

方法2: 还有一个更复杂的解决方案。

如果您不能使用唯一索引,那么可以考虑一下。

您可以使用锁。如果在分布式系统上工作,则应使用分布式锁。您应该锁定电子邮件。如果线程获得了锁定,则可以检查是否有目标电子邮件,然后将其插入数据库。

但是,如果您的系统仅在一个JVM上运行,则可以尝试:

syschronized(email.intern()) {
  // check the email whether exists
  // if not, insert it.
}

在这种情况下,您将遭受大型String池的困扰,这会影响GC暂停并浪费内存。

实际上,您可以使用双重检查来优化性能。看起来像

 emailInDB = fetchEmailFromDB(email);
 if (emailInDB == null) {
    lock(email);
    emailInDB = fetchEmailFromDB(email);
    if(emailInDB == null) {
       insertIntoDB(email)
   } else {
     return "the email already exists";
   }
 } else {
  return "the email already exists";
}