0

情報を収集するフォームがありますが、その1つが電話番号です。電話番号データは、市外局番、最初の3桁、および最後の4つの3つのフィールドから取得されるため、番号はxxx-xxx-xxxx(基本的な米国の形式)の形式になります。

これらの3つのフィールドは必須ではありませんが、誰かが3つのフィールドの任意の組み合わせに入力することを決定した場合は、基本的なエラーチェックを行います。

(彼らが私に市外局番だけを与えたとしましょう-つまり、彼らは私に彼らの番号を与えたかったので、本質的にそれが必要になるので、コードは1)3つのデータセットすべてが送信されたこと、および2)を確認する必要があります3つすべては数字だけです)

これが私がうまくいくと思ったものですが、そうではありません:

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

助言がありますか?

4

5 に答える 5

4

コードが機能しない理由は、ブール論理ではなく、の使用によるものisset()です。の場合、値が空であるかどうかに関係なく、は常に設定されます<input type="text">$_POST['fieldName']

$_POST['fieldName'] != ''代わりに、ユーザーが値を入力したかどうかを判別するために使用します。を使用しないempty()0でください。これにより000、偽の値が空(、、、falseなど)として返されます。


個人的に<input type="type">は電話番号に使っています。これは、ユーザーのスイッチボックスを作成するよりも煩わしくなく、検証も簡単になります。

この例では、番号がNANPルールに従っているかどうかを実際に検証します。非常に多くのアプリケーション/Webサイトがこの検証ステップを監視していることは絶対にばかげていると思います。

// 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";
}
于 2009-08-05T06:29:42.063 に答える
1

まず第一に、それらのフィールドが入力である場合、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";
    }
}

これは単なる例です。1つのステートメントに短縮することもできますがif、読みやすくするためにそうしていません。

于 2009-08-05T06:29:23.267 に答える
0

フィールドの1つが設定されていないかどうかを確認してください。

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

そういうことをやりたかったのですか?

于 2009-08-05T06:27:16.733 に答える
0

これはあなたの問題の解決策ではありませんが、それは別の方法で解決します、imaskを試してください

実際にはJSスクリプトです。

于 2009-08-05T06:39:38.563 に答える
0

まず最初に、誰かがコードを保守できるようになる場合は、それをメソッド呼び出しに分割する必要があります。私はおそらくそれを次のように書くでしょう:

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']}";
    }
}
于 2009-08-05T06:48:12.213 に答える