【问题标题】:Find stripped e-mail in SQL在 SQL 中查找剥离的电子邮件
【发布时间】:2020-04-13 19:54:23
【问题描述】:

我想阻止用户多次使用相同的电子邮件。然而,许多服务器的配置方式是,发送至john.doe@example.com 的电子邮件将与j.oh.ndoe..@exmaple.comjohndoe+abc123@example.com 进入同一个收件箱。因此,我应用了一个简单的 PHP 函数来剥离一封电子邮件,忽略+ 符号之后的任何内容。 这是我正在使用的 PHP 函数:

function strip_email ($email) {
    $id = explode("@", $email)[0]; //what is before the '@'
    $noplus = explode("+", $id)[0]; //what is before the '+'
    $nodots = str_replace(".", "", $noplus); //and with dots removed
    return $nodots. "@" .$provider;
}

但是,我想使用他们提供的确切电子邮件(未删除)注册用户。例如,如果用户输入了john.doe+demo@example.com,我会将此电子邮件用于 MySQL 记录,因为这是用户想要到达的位置(例如,某些服务器使用+ 之后的字符串来标记电子邮件或放置它们在不同的文件夹中)。

新注册时,我正在通过以下方式检查电子邮件是否存在:

$email = $_POST['email'];
$query = "SELECT e-mail FROM users WHERE email='$email' LIMIT 1";
$result = mysqli_query($db, $user_check_query);
$row = mysqli_fetch_assoc($result);
if ($row) ... #email already in use

问题是如果用户输入的 john..doe+mylabel@example.com 与数据库中的任何条目都不匹配,如果搜索值被删除 (johndoe@example.com) 也不会匹配。

我应该在我的表中创建第二行并存储剥离的电子邮件吗?

【问题讨论】:

  • 为了安全性和稳定性,您需要使用占位符实现准备好的语句。
  • 您如何知道此消毒过程不会产生负面影响?如果新的合法用户的电子邮件与您系统中现有的电子邮件“相似”怎么办。这感觉像是一条不明智的下坡路。我预见这对您的访问者来说是一种刺激,对您来说是一种不可靠的技术。
  • 您应该只分解电子邮件字符串一次并访问它的两个部分,而不是$provider = explode("@", $email)[1]; 然后$id = explode("@", $email)[0];
  • @mickmackusa john.d@gmail.comjohnd@gmail.com 是同一个人的可能性非常高。特别是对于 Gmail,它是 100%,因为 Gmail 在注册时会认为两者相同。我想向那些使用别名电子邮件注册以获得免费试用的人提出一个额外的挑战。
  • 不要和这个争吵。人们总能找到方法。我在 Outlook 上的一个邮箱有 5 个别名,它们看起来都不像另一个。

标签: php mysql sql email


【解决方案1】:

您应该将原始电子邮件和“剥离”的电子邮件存储在表中的一行中。

然后在剥离的版本上声明一个唯一约束,这样你就不会在该列中得到重复项。

因为您是在 PHP 中进行清理,所以您可以在插入(或更新)新记录时传入这两个版本的电子邮件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多