2017-08-29 92 views
0

我试图执行验证公司电子邮件的代码。当用户进入公司工作时,他们都应该彼此兼容。例如,如果在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(); 
+0

也许你需要'stripos函数',http://php.net/manual/en/function.stripos.php除非你正在寻找其他方法,否则JavaScript和正则表达式标签在这里似乎毫不相关?但是,如果公司域名不符合该名称呢? – chris85

+0

当你使用strpos不是它!==你应该使用false吗? “真”在这里按预期工作吗? – Andreas

+3

我也很好奇你为什么要强制这封电子邮件和公司的事情。我在一家名为X的公司工作,但由于公司历史,我的电子邮件名称更常见。我实际上并不认为任何人在我的工作或公司内部的任何地方(包括非常大的公司)都有X的电子邮件 – Andreas

回答

1

你的代码读取

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

strpos可以永远返回true只是一个int或FALSE,因此你总是得到一个错误消息。它也在docs

正确的版本是:

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

(另外一个电子邮件地址匹配到一个公司名称的概念并不像在评论中大量提到一个好主意)

+0

你可以使用true,但正如你所说的strpos返回一个位置并且因此对于这个问题有一个内置的错误。 https://3v4l.org/h6IY9在这里它返回“是”,如同真的。但是,如果搜索“hello”,那么位置将为0,即使条件为真,if()中的0也将为false。你可以做些什么来解决这个问题,就是在字符串strpos(“”。$ str,....)中添加一个空格作为第一个字符;'这确保0不能被返回,即使它是真的 – Andreas

+0

但是你是正确的,因为即使考虑这种代码也是一个坏主意。这只会造成问题。如果我作为客户无法创建帐户,因为我的电子邮件与我的公司不匹配,我会点击“返回”按钮并返回到我的Google搜索。 – Andreas

+1

@Andreas我没有提供解决方案,我只是说,strpos永远不会返回true,并且由于'==='(或'!==')包含类型比较,所以始终输出错误消息。实际的答案是“'=== false”“,因为它确实在这里有必要,因为'0!== false'。 – Jakumi