проверка совместимости домена электронной почты с названием компании

Я пытаюсь реализовать код для проверки электронной почты компании. Когда пользователь вводит корпоративную и рабочую электронную почту, они должны быть совместимы друг с другом. Например, если пользователь, работающий в 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();

person Ryan Oscar    schedule 29.08.2017    source источник
comment
Возможно, вам нужно stripos, php.net/manual/en/function.stripos.php Теги Javascript и regex кажутся здесь неуместными, если только вы не ищете другие подходы? Но что, если домен компании не совпадает с названием?   -  person chris85    schedule 29.08.2017
comment
Когда вы используете strpos, разве не следует использовать !== false? Работает ли true здесь так, как ожидалось?   -  person Andreas    schedule 29.08.2017
comment
Мне также любопытно, почему вы хотите форсировать это письмо и компанию. Я работаю в компании под названием X, но моя электронная почта имеет более распространенное имя Y из-за истории компании. На самом деле я не думаю, что у кого-то есть электронная почта с X на моей работе или где-либо еще в компании (это очень крупная компания).   -  person Andreas    schedule 29.08.2017
comment
Основываясь на том, что у вас есть сейчас, вы хотите изменить свой код на if (stripos($domain, $company_name) === false). Затем это покажет ошибку, если название компании не находится в домене. Но, как говорит @Andreas, не каждое название компании частично или полностью появляется в домене электронной почты.   -  person fubar    schedule 29.08.2017
comment
Привет @Andreas Спасибо за ваш комментарий. Это хороший вопрос. Это одно из требований моего клиента. Ему нужно подтвердить пользователя по электронной почте, потому что это более точно. Мне интересно, почему у вас нет электронной почты с доменом компании, если это очень крупная компания. :) Понятия не имею, откуда ты. Но в Австралии, даже если это небольшая компания, у них есть рабочая электронная почта с корпоративным доменом.   -  person Ryan Oscar    schedule 29.08.2017
comment
Также стоит учитывать: пробелы и аббревиатуры. Например, корпорация Frobozz Magic Sofas не фигурирует в fms-corp.com  -  person    schedule 29.08.2017
comment
@ chris85 хорошее замечание. Я изменил его на stripos. Тем не менее, это слабый метод проверки. Лучше использовать подтверждение по электронной почте или сравнить доменные имена.   -  person fubar    schedule 29.08.2017
comment
@fubar Да, с этим много недостатков   -  person chris85    schedule 29.08.2017
comment
@fubar Ты легенда. Большое спасибо m8. Хорошо тебе!   -  person Ryan Oscar    schedule 29.08.2017
comment
@fubar chris85 Мне просто нужно подтвердить адрес электронной почты пользователя, как при проверке совместимости электронной почты с компанией. Поэтому я изменил кодировку. Она по-прежнему принимает электронные письма с неправильным синтаксисом. Помогите мне фам. :) if (stripos($domain, $companyname) === false && (filter_var($email, FILTER_VALIDATE_EMAIL))===false){ $errors[] = 'Вы должны ввести действительный адрес электронной почты.';   -  person Ryan Oscar    schedule 29.08.2017
comment
Извините за долгую задержку с ответом, утром спешил на работу. Ну, я работаю во втором по величине продовольственном и розничном магазине в стране. У нас есть несколько площадок по всей стране и тысячи сотрудников. Из-за перехватов и покупок компании имена и адреса не совпадают (и руководство компании хочет использовать одно имя для одного и другого). Мы все наняты X, наш домен электронной почты — Y, наш нижний колонтитул в электронных письмах — компания X Швеция. И ни одно из них не сокращено. Все они слова. Все, что я хочу сказать, вероятно, не сработает так хорошо, как думает ваш клиент.   -  person Andreas    schedule 29.08.2017
comment
Я знаю, что у голландской компании, с которой у нас был бизнес в прошлом году, было то же самое.   -  person Andreas    schedule 29.08.2017
comment
@RyanOscar, ты бы использовал || вместо &&   -  person fubar    schedule 29.08.2017


Ответы (1)


ваш код читает

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

strpos никогда не может вернуть true только int или FALSE, поэтому вы всегда получаете сообщение об ошибке. это также находится в документах.

правильная версия будет:

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

(Кроме того, концепция сопоставления адреса электронной почты с названием компании не является хорошей идеей, о чем много упоминалось в комментариях)

person Jakumi    schedule 29.08.2017
comment
Вы можете использовать true, но, как вы говорите, strpos возвращает позицию и, таким образом, имеет встроенную ошибку в этом отношении. 3v4l.org/h6IY9 Здесь возвращается yes, как и в true. Но если вы ищете привет, тогда позиция будет 0, а 0 в if() будет ложным, даже если условие истинно. Что вы можете сделать, чтобы исправить это, так это добавить пробел в качестве первого символа в строке strpos(" " . $str, ....);, это гарантирует, что 0 не может быть возвращен, даже если это правда - person Andreas; 29.08.2017
comment
Но вы правы в том, что даже думать о таком коде — плохая идея. Это только создаст проблемы. Если бы я как клиент не мог создать учетную запись, потому что мой адрес электронной почты не совпадает с адресом моей компании, я бы нажал кнопку «Назад» и вернулся к поиску в Google. - person Andreas; 29.08.2017
comment
@Andreas Андреас Я не предоставил решение, я просто говорю, что strpos никогда не может возвращать true, и, поскольку === (или !==) включает сравнение типов, всегда выводится сообщение об ошибке. Фактический ответ — === false, так как он делает именно то, что здесь необходимо, потому что 0 !== false. - person Jakumi; 29.08.2017
comment
Андреас Не знаю, почему ты так одержим этой идеей. Преодолейте это. Все дело в том, как это реализовать. не о том, насколько это удобно. Спасибо за ваш ответ @Jakumi. Всем спасибо! - person Ryan Oscar; 29.08.2017