PHP Lógica - return false de um ou dois em cada três não estão definidas
-
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?
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']}";
}
}