PHP Lógica - return false de um ou dois em cada três não estão definidas

StackOverflow https://stackoverflow.com/questions/1231485

  •  22-07-2019
  •  | 
  •  

Pergunta

Eu tenho um formulário que coleta informações, um pedaço de que é um número de telefone. Os dados número de telefone vem de três campos, um para um código de área, para os 3 primeiros dígitos, e durante os últimos quatro anos, de modo que os números são neste formato:. Xxx-xxx-xxxx (formato básico EUA)

Esses três campos não são necessários, mas eu gostaria de fazer alguma verificação de erros básicos, se alguém decide preencher qualquer combinação dos três campos:

(digamos que eles só me dar o código de área - o que significa que eles queriam me dar seu número, portanto, em essência, torna-se necessário, portanto, o código deve verificar para ver que: 1) conjuntos de todos os três dados foram enviados, e 2) todos os três são apenas números)

Aqui está o que eu pensei que iria funcionar, mas não:

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']; }

Todas as sugestões?

Foi útil?

Solução

A razão pela qual o seu código não está funcionando não é por causa de sua lógica booleana, mas por causa de seu uso de isset(). No caso de um <input type="text">, o $_POST['fieldName'] será sempre definida, independentemente de se o valor está vazio ou não.

Use $_POST['fieldName'] != '' vez para determinar se o usuário inseriu um valor. Não use empty() , pois isso irá devolver qualquer valor Falsas como vazio (0, 000, false, etc ...).


Pessoalmente, eu prefiro usar um <input type="type"> para o número de telefone. Isso é menos irritante do que fazer as caixas de comutação de usuários, e também faz validação mais simples.

Este exemplo realmente valida se o número segue NANP regras. Acho que é absolutamente ridículo que tantas aplicações / sites supervisiona esta etapa de validação.

// 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";
}

Outras dicas

Em primeiro lugar, se esses campos são entradas em seguida, isset() sempre retornará verdadeiro. O que você provavelmente vai querer fazer é verificar se eles não estão vazios. Portanto, você deve usar a função empty() para isso.

Vou substituir seus valores de formulário com $a, $b e $c para torná-lo simples.

$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";
    }
}

Este é apenas um exemplo. Você poderia reduzi-lo a apenas uma declaração if mas eu não tê-lo feito para torná-lo mais legível.

verificação apenas se um dos campos não está definido;

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';
    }
}

É esse o tipo de coisa que você queria fazer?

Este não é solução para o seu problema, mas ele vai resolvê-lo outro caminho, tente imask

é realmente um script JS.

Bem, primeiro fora, se alguém é nunca vai ser capaz de manter seu código, você vai ter que quebrar que até em chamadas de método. Eu provavelmente iria escrever algo como isto:

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);
}

Agora você pode facilmente usar esses métodos dentro de sua lógica principal, tornando-o mais legível:

if($this->phoneNumberWasProvided()) {
    if(!$this->phoneNumberIsValid()) {
        $errors = $this->getPhoneNumberErrors();
        // Print errors / do whatever is necessary
    } else {
       $phoneNumber = 
         "{$_POST['numArea']}-{$_POST['numFirst']}-{$_POST['numSecond']}";
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top