PHP Mantık - üç dışında bir ya da iki set değil Yanlış Dönüş

5 Cevap php

Ben bir telefon numarası tek parça olan bilgi toplayan bir form var. Numaraları bu biçimde böylece telefon numarası veriler, ilk 3 basamak için, ve son dört üç alan, bir alan kodu için biri geliyor: xxx-xxx-xxxx (temel ABD biçimi).

Bu üç alan gerekli değildir, ama birisi üç alanın herhangi bir kombinasyonu doldurmak için karar verirse kontrol bazı temel hata yapmak istiyorum:

(Hadi onlar bana sadece alan kodunu vermek diyelim - onlar özünde, gerekli olur yani, bana kendi numarasını vermek istedi demektir, böylece kod 1 olduğunu görmek için kontrol etmelisiniz) her üç veri setleri gönderildi, ve 2) Üç) Sadece sayılardır

İşte işe yarayacağını düşündüm, ama öyle değil:

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

Herhangi bir öneriniz?

5 Cevap

Kod çalışmıyor neden nedeni sizin Boole mantık değil, çünkü isset() sizin kullanım. A <input type="text"> durumunda, $_POST['fieldName'], her zaman bağımsız olarak değer boş olup olmadığını arasında ayarlanacaktır.

Kullanıcı bir değer girdi olmadığını belirlemek için yerine $_POST['fieldName'] != '' kullanın. DO NOT USE empty() , as this will return any falsy value as empty (0, 000, false, vs ..).


Şahsen ben çok telefon numarası için tek bir <input type="type"> kullanın. Bu kullanıcının anahtar kutularını yapmak daha az rahatsız edici olduğunu ve aynı zamanda doğrulama basit hale getirir.

Numarası NANP kuralları takip varsa bu örnek aslında doğrular. Ben kesinlikle saçma pek çok uygulama / web sitesi bu doğrulama adımı yönetmektedir bulabilirsiniz.

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

Bu alanlar girişi ise şeyden sonra isset() her zaman doğru dönecektir. Onlar boş değilse Ne muhtemelen kontrol etmek istiyorum. Yani bunun için empty() işlevini kullanmanız gerekir.

I $a, $b ile form değerleri yerini alacak ve $c basit yapmak.

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

Bu sadece bir örnektir. Sen sadece bir if deyimi kısaltmak olabilir ama ben daha okunabilir hale getirmek için yapmadıysanız.

Alanlarından biri ayarlı değilse sadece kontrol;

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

İstediğin şey bir tür yapmak için mi?

Bu sorun için çözüm değil, ama denemek imask, diğer-yol çözecek

aslında bir JS komut dosyası bulunuyor.

Hiç kimse olacak kodunuzu korumak mümkün ise Eh ilk kapalı, sen yöntem çağrıları içine kırmak gerekir. Muhtemelen o böyle bir şey yazmak istiyorum:

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

Şimdi kolaylıkla daha okunabilir yapma, ana mantığı içinde bu yöntemleri kullanabilirsiniz:

if($this->phoneNumberWasProvided()) {
    if(!$this->phoneNumberIsValid()) {
        $errors = $this->getPhoneNumberErrors();
        // Print errors / do whatever is necessary
    } else {
       $phoneNumber = 
         "{$_POST['numArea']}-{$_POST['numFirst']}-{$_POST['numSecond']}";
    }
}