2017-08-29 13 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タグとregexタグは、他のアプローチを探していない限りここでは無関係ですね。しかし、もし会社のドメインが名前に合っていないとすれば? – chris85

+0

あなたはstrposを使用していないときはそれを使用するべきですか?== false? 「真」はここで期待どおりに機能しますか? – Andreas

+3

なぜこのメールと会社のことを強制したいのか不思議です。私はXという名前の会社で働いていますが、私のメールは会社の歴史のためにもっと一般的な名前Yです。私は実際に誰かが自分の仕事や会社内のどこにいてもX社の電子メールを持っているとは思わない(それは非常に大きな会社だ) – Andreas

答えて

1

あなたのコード

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

strposが今までので、あなたは常にエラーメッセージを取得し、trueだけintまたはFALSEを返すことはできません読み込みます。それはdocsにもあります。

正しいバージョンは次のようになります。

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

(コメントに豊富に述べたように加えて、会社名に電子メールアドレスと一致するという概念は良いアイデアではありません)

+0

あなたは真実を使うことができますが、strposがこのため、この問題には組み込みエラーがあります。 https://3v4l.org/h6IY9ここではtrueのように "yes"を返します。しかし、 "hello"を検索すると、位置は0になり、if()の0は条件が真であってもfalseになります。これを修正するには、文字列 'strpos("。$ str、....);の最初の文字として空白を追加することです。これにより、trueであっても0は返されません。 – Andreas

+0

しかし、あなたはこの種のコードについて考えることも悪い考えであるという点で正しいです。それは問題を引き起こすだけです。電子メールが私の会社と一致しないために顧客としてアカウントを作成できなかった場合は、「戻る」ボタンをクリックしてGoogle検索に戻ります。 – Andreas

+1

@Andreas私は解決策を提供していませんでしたが、strposは真実を返すことはできませんし、 '==='(または '!==')に型比較を含めるので、エラーメッセージは常に出力されます。実際の答えは、 '' === false' "です。なぜなら、' 0!== false'のために、ここで必要なことが正確に行われるからです。 – Jakumi

関連する問題