为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪9158850 2022-09-01 19:33:14
我的网络应用程序上有一个注册表。我想要的是,当用户提交表单时,应该进行验证以检查用户输入的电子邮件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 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

方法1:


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


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


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


如果使用唯一索引,则如果已有电子邮件,则会收到异常。您可以捕获异常并返回“重复电子邮件”消息。请参阅问题捕获重复异常


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


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


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


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


但是,如果您的系统只在一个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";

}


查看完整回答
反对 回复 2022-09-01
?
繁花如伊

TA贡献2012条经验 获得超12个赞

对于电子邮件验证

  • 您必须将电子邮件列设置为表中的唯一列。

  • 当您尝试插入新用户时,如果电子邮件已存在,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

}


查看完整回答
反对 回复 2022-09-01
?
皈依舞

TA贡献1851条经验 获得超3个赞

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


方法 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:在数据库级别,使电子邮件列唯一。因此,每当插入新记录时。DB 负责检查唯一的电子邮件地址并引发错误。使用错误将其显示在前端。


查看完整回答
反对 回复 2022-09-01
  • 3 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信