【问题标题】:checking whether domain of the email compatible with the company name检查电子邮件的域是否与公司名称兼容
【发布时间】:2017-08-29 03:30:50
【问题描述】:

我正在尝试实施代码来验证公司电子邮件。当用户输入公司和工作电子邮件时,它们应该相互兼容。例如,如果在 QUT 工作的用户在以 QUT 身份进入公司时注册了系统,则电子邮件域必须是 @qut.edu.au。下面的代码显示了我实现的方法。但是由于某种原因,代码中有一个逻辑错误,给出“您必须输入有效的电子邮件”。(应该在域中不包含公司名称时触发)。但每次运行时都会弹出。任何帮助将不胜感激。谢谢!

    <?php
require_once $_SERVER['DOCUMENT_ROOT'].'/abp/core/init.php';
include 'includes/head.php';
include 'includes/navigation.php';
$email = ((isset($_POST['email']))?sanitize($_POST['email']):'');
$email = trim($email);
$password = ((isset($_POST['password']))?sanitize($_POST['password']):'');
$password = trim($password);
$company_name = ((isset($_POST['company_name']))?sanitize($_POST['company_name']):'');
$company_name = trim($company_name);
$errors = array();
**$domain = array_pop(explode('@', $email));**


if($_POST){
        // form validation
        if(empty($_POST['email']) || empty($_POST['password'])){
          $errors[] = 'You must provide email and password.';
        }else {
          //validlate email

          **if (strpos( $domain, $company_name) !== true) {**
            $errors[] = 'You must enter a valid email.';


          }else{
            // check if email exist in the databse
            $query = "SELECT * FROM users WHERE email=?";
            $stmt = $db->prepare($query);
            $stmt->bind_param("s", $email);
            $stmt->execute();
            $stmt->store_result();

【问题讨论】:

  • 也许您需要striposphp.net/manual/en/function.stripos.php Javascript 和正则表达式标签在这里似乎无关紧要,除非您正在寻找其他方法?但是如果公司域名与名称不匹配怎么办?
  • 当您使用 strpos 时,您不应该使用!== false 吗? true 在这里是否按预期工作?
  • 我也很好奇你为什么要强制这个电子邮件和公司的事情。我在一家名为 X 的公司工作,但由于公司历史原因,我的电子邮件使用更常见的名称 Y。实际上,我认为没有人在我的工作或公司的任何地方(这是一家非常大的公司)收到与 X 的电子邮件
  • 还值得考虑:空格和缩写。例如,fms-corp.com 中没有出现“Frobozz Magic Sofas Corporation”……
  • @chris85 好点。我已将其更改为stripos。尽管如此,它仍然是一种较弱的验证方法。最好使用电子邮件验证,或比较域名。

标签: php regex validation explode strpos


【解决方案1】:

您的代码读取

if(strpos(something, something) !== true) {
    error message
}

strpos 永远不能只返回一个 int 或 FALSEtrue,因此您总是会收到一条错误消息。它也在docs 中。

正确的版本是:

if(strpos($haystack, $needle) === false) {
     //errormessage
}

(此外,将电子邮件地址与公司名称匹配的概念并不是一个好主意,正如 cmets 中大量提到的那样)

【讨论】:

  • 您可以使用 true 但正如您所说 strpos 返回一个位置,因此在这件事上有一个内置错误。 3v4l.org/h6IY9 在这里它返回“是”,如真。但是,如果您搜索“hello”,则位置将为 0,即使条件为真, if() 中的 0 也会为假。解决此问题的方法是在字符串strpos(" " . $str, ....); 中添加一个空格作为第一个字符,这样可以确保即使为真也不会返回 0
  • 但是你是对的,即使考虑这种代码也是一个坏主意。它只会制造问题。如果我作为客户因为我的电子邮件与我的公司不匹配而无法创建帐户,我会单击“返回”按钮并返回到我的 Google 搜索。
  • @Andreas 我没有提供解决方案,我只是说 strpos 永远无法返回 true,并且由于 ===(或 !==)确实包含类型比较,因此错误消息是总是输出。实际答案是“=== false”,因为它完全符合这里的要求,因为0 !== false
  • Andreas Dunnno 为什么你对这个想法如此着迷。克服它。一切都是关于如何实现它。不是关于它有多方便。感谢您的回答@Jakumi。谢谢大家!
猜你喜欢
  • 2022-06-16
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多