【问题标题】:How to validate user email from the MySQL database?如何验证来自 MySQL 数据库的用户电子邮件?
【发布时间】:2019-08-15 09:26:38
【问题描述】:

我的网络应用程序上有一个注册表单。我想要的是,当用户提交表单时,应该进行验证以检查用户输入的电子邮件 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());
        }

      }

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

谢谢

【问题讨论】:

  • ehm ...您声称您主要关心的是电子邮件验证,但您的问题是检查它是否已经在您的数据库中,这与电子邮件验证无关。
  • 无论哪种方式:一旦用户提供了他的输入 SELECT * FROM MY_TABLE WHERE EMAIL = [valueProvidedByUser]; if ( nrOfResults == 0 ) -> 有效输入 else -> 已有用户使用此电子邮件
  • 小心 SQL 注入。
  • @Shashankk 是 'email99' 动态值吗?试试下面的查询“从 email='email99' 的用户那里选择电子邮件”。如果您在表用户中有电子邮件列,并且如果您有电子邮件值“email99”的记录,那么您将收到“成功”消息。

标签: java mysql forms jsp servlets


【解决方案1】:

用于电子邮件验证

  • 您必须在表格中将电子邮件列设置为唯一。
  • 当您尝试插入新用户时,如果电子邮件已经存在,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
}

【讨论】:

    【解决方案2】:

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

    方法一: 第一种是执行select查询并检查,不推荐作为解决方案。

    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
    }
    

    方法二: 在数据库级别,使电子邮件列独一无二。所以每当插入新记录时。 DB 负责检查唯一的电子邮件地址并抛出错误。使用错误将其显示在前端。

    干杯!!

    【讨论】:

    • 方法一有问题。当您查找目标电子邮件时,您可能会得到 0 个结果。但与此同时,其他用户提交了目标邮件,您将在您的数据库中收到重复的邮件。
    • 这就是为什么我说它根本不是推荐的解决方案。
    • 谢谢。但是,我想把它放到一个条件中,如果(用户输入的电子邮件存在于数据库中)然后将用户重定向回 register.jsp
    • @ShashankkShekarChaturvedi 然后使用上面定义的 if 条件,如果它的 true 重定向回 register.jsp 页面,则在 else 块中执行您的业务逻辑。
    • 简单的解决方案是将您的方法返回类型更改为布尔值,如果电子邮件存在则返回 true 否则返回 false 并在调用方法时使用此布尔结果并执行您的逻辑。
    【解决方案3】:

    方法一:

    最简单的方法是对列 email 使用唯一索引。

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

    两个用户都将得到res.next() false,并且您将向数据库插入两行具有相同电子邮件的行。

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

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

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

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

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

    但如果你的系统只运行在一个 JVM 上,你可以试试:

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

    在这种情况下,您将受到较大的字符串池的影响,这将影响您的 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";
    }
    

    【讨论】:

    • 我想把它放到一个条件中,如果(用户输入的电子邮件存在于数据库中)然后将用户重定向回 register.jsp
    • 另外,我在上面的项目中有一个存储用户对象的用户模型类。因此,对于 email99,我直接获得了该值。例如:- String email99 = ud.getEmail(email);
    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 2022-11-17
    • 2014-03-04
    • 2014-11-15
    • 1970-01-01
    • 2018-06-23
    • 2017-12-02
    • 2018-02-13
    相关资源
    最近更新 更多