PHP логика - возвращение False одного или двух из трех не установлены - PullRequest
0 голосов
/ 05 августа 2009

У меня есть форма для сбора информации, одним из которых является номер телефона. Данные телефонного номера поступают из трех полей: одно для кода города, для первых трех цифр и для последних четырех, поэтому номера имеют следующий формат: xxx-xxx-xxxx (основной формат США).

Эти три поля не обязательны, но я хотел бы провести базовую проверку ошибок, если кто-то решит заполнить любую комбинацию из трех полей:

(допустим, они дают мне только код города - это означает, что они хотели дать мне свой номер, поэтому, по сути, это становится обязательным, поэтому код должен проверить, что 1) все три набора данных отправлены и 2) все три являются только числами)

Вот то, что я думал, будет работать, но это не так:

if((isset($_POST['numArea'], $_POST['numFirst'], $_POST['numSecond']) && (!ctype_digit(trim($_POST['numArea'])) || !ctype_digit(trim($_POST['numFirst'])) || !ctype_digit(trim($_POST['numSecond'])) || strlen(trim($_POST['numArea'])) !== 3 || strlen(trim($_POST['numFirst'])) !== 3 || strlen(trim($_POST['numSecond'])) !== 4))
        || (isset($_POST['numArea']) XOR isset($_POST['numFirst']) XOR isset($_POST['numArea']))){
                $errors[] = 'Please give us a valid Phone Number, or remove any numbers if you do not wish to use your phone number.';
        }else{
            $_POST['PhoneNumber'] = '+01'.$_POST['numArea'].'-'.$_POST['numFirst'].'-'.$_POST['numSecond']; }

Есть предложения?

Ответы [ 5 ]

4 голосов
/ 05 августа 2009

Причина, по которой ваш код не работает, не из-за вашей логической логики, а из-за использования isset(). В случае <input type="text">, $_POST['fieldName'] всегда будет установлен, независимо от того, является ли значение пустым или нет.

Вместо этого используйте $_POST['fieldName'] != '', чтобы определить, ввел ли пользователь значение. НЕ ИСПОЛЬЗУЙТЕ empty(), поскольку при этом любое ложное значение будет возвращено как пустое (0, 000, false и т. Д.).


Лично я предпочитаю использовать один <input type="type"> для номера телефона. Это менее раздражает, чем создание пользовательских переключателей, а также упрощает проверку.

Этот пример действительно проверяет, соответствует ли число правилам NANP . Я нахожу абсолютно смешным, что так много приложений / веб-сайтов следят за этим этапом проверки.

// Did the user post a number?
if($_POST['phone'] != '') {

  // Get only the numbers, we don't care how the user formatted their number
  $_POST['phone'] = preg_replace('/[^0-9]/', '', $_POST['phone']);

  // Is it a valid NANP phone number?
  if(preg_match('/^1?[2-9][0-8][0-9][2-9][0-9]{6}$/i', $_POST['phone']) === 1) {
    echo "Valid NANP phone number";

    // Trim the leading one
    $_POST['phone'] = ltrim($_POST['phone'], '1');

    // Format as wanted
    $_POST['PhoneNumber'] = '+01'.substr($_POST['phone'],0,3).'-'.substr($_POST['phone'],3,3).'-'.substr($_POST['phone'],6,4);
  } else {
    echo "Invalid phone number";
  }
} else {
  echo "User didn't provide phone number";
}
1 голос
/ 05 августа 2009

Прежде всего, если эти поля являются входными данными, isset() всегда будет возвращать true. Что вы, вероятно, хотите проверить, если они не пусты. Таким образом, вы должны использовать empty() функцию для этого.

Я заменю значения вашей формы на $a, $b и $c, чтобы упростить процесс

$a = $_POST['numArea'];
$b = $_POST['numFirst'];
$c = $_POST['numSecond'];

if (!empty($a) || !empty($b) || !empty($b)) {
    // we know now that at least field was filled in, lets check their values
    $regex = '/^\d+$/';
    if (!preg_match($regex, $a) || !preg_match($regex, $b) || !preg_match($regex, $c)) {
        echo "Phone number invalid";
    }
}

Это всего лишь пример. Вы можете сократить его до одного оператора if, но я этого не сделал, чтобы сделать его более читабельным.

0 голосов
/ 05 августа 2009

Ну, во-первых, если кто-нибудь когда-нибудь сможет поддерживать ваш код, вам придется разбить его на вызовы методов. Я бы, наверное, написал это примерно так:

public function phoneNumberWasProvided () {
   return !(empty($_POST['numArea']) && 
            empty($_POST['numFirst']) && 
            empty($_POST['numSecond']));

}

public function phoneNumberIsValid () {
   $this->_phoneErrors = array();
   // The following three if statements can also be
   // extracted into their own methods
   if(!preg_match("/^\d{3}/$", $_POST['numArea']) {
      $this->_phoneErrors['numArea'] = 'The area code you provided is invalid';
   }
   if(!preg_match("/^\d{3}/$", $_POST['numFirst']) {
      $this->_phoneErrors['numFirst'] = 'The first part of the provided phone 
                                         number is invalid';
   }
   if(!preg_match("/^\d{4}/$",$_POST['numSecond']) {
      $this->_phoneErrors['numArea'] = 'The first part of the provided phone 
                                        number is invalid';
   }

   return empty($this->_phoneErrors);
}

Теперь вы можете легко использовать эти методы в своей основной логике, делая ее более читабельной:

if($this->phoneNumberWasProvided()) {
    if(!$this->phoneNumberIsValid()) {
        $errors = $this->getPhoneNumberErrors();
        // Print errors / do whatever is necessary
    } else {
       $phoneNumber = 
         "{$_POST['numArea']}-{$_POST['numFirst']}-{$_POST['numSecond']}";
    }
}
0 голосов
/ 05 августа 2009

Это не решение вашей проблемы, но оно решит ее иначе, попробуйте imask

на самом деле это JS-скрипт.

0 голосов
/ 05 августа 2009

Просто проверьте, не установлено ли одно из полей;

if (!isset($_REQUEST['numFirst']) || !isset($_REQUEST['numSecond']) || !isset($_REQUEST['numArea'])) {
    if (!isset($_REQUEST['numFirst'])) {
         print 'Please fill out the FIrst area';
    }
    if (!isset($_REQUEST['numSecond'])) {
         print 'Please fill out the Second area';
    }
    if (!isset($_REQUEST['numArea'])) {
         print 'Please fill out the Area code';
    }
}

Это то, что вы хотели сделать?

...