1

重複の可能性:
文字列全体の正規表現一致

フォーム ページで、ユーザー名とパスワードに英数字のみを受け入れ、6 ~ 15 文字にする必要があるようにしようとしています。無効なデータを入力すると、CheckAlNum 関数で定義したユーザー エラーがスローされるのではなく、データベースに挿入されます。

関数.php

function checkAlNum($whichField) 
{
    if (preg_match('/[A-Za-z0-9]+/', $_POST[$whichField])){
        if ( (!count(strlen($whichField) >= 6)) OR (!count(strlen($whichField) <= 15 ))) {
            $message1 = '<p> Username and password must be between 6 and 15 characters </p>';
                return user_error($message1);
        }
        else{       
            return true;
        }           
    }

    else {
        $message = '<p>Username and password can only be numbers or letters</p>';
            return user_error($message);
     }


 } 

Form.php

        if (count($_POST) > 0) {

           //Validate the inputs
            $errorMessages = array();

            //Validate the username   
            $item5 = checkAlNum('username');
            if($item5 !== true) {
                $errorMessages[] = $item5;
            }

            //Validate the password
            $item6 = checkAlNum('password');
            if($item6 !== true) {
                $errorMessages[] = $item6;
            }

            //Validate the firstName and lastName
            $item1 = checkNameChars('firstName');
            if ($item1 !== true) {
                $errorMessages[] = $item1;

            }

            $item2 = checkNameChars('lastName');
            if ($item2 !== true) {
                $errorMessages[] = $item2;

            }   

            //Validate the office name
            $item3 = checkOfficeChars('office');
            if ($item3 !== true) {
                $errorMessages[] = $item3;

            }

            //Validate the phone number 
            $item4 = validate_phone_number('phoneNumber');
            if($item4 !== true) {
                $errorMessages[] = $item4;
            }  


            //Check to see if anything failed
            if (count($errorMessages) == 0) {

                $newEmployee = new Person;
                    $newEmployee -> insert();

            }

            else { //Else, reprint the form along with some error messages
                echo "<h2><span>Error</span>: </h2>";

                foreach($errorMessages as $msg) {
                    echo "<p>" . $msg . "</p>";
              }
            }
        }  

        ?>

checkAlNum 関数の if-else ステートメントと正規表現のネストをいじってみました (ただし、正規表現が正しいと確信しています)。たぶん、私は本当にばかげた何かを見逃していますか?

4

3 に答える 3

1

2番目のifステートメントは間違っていると思います。次のようになります。

if ( !( (!count(strlen($whichField) >= 6)) OR (!count(strlen($whichField) <= 15 )) ) ) {
// ... do something
}

これはド・モルガンの法則によるものです。

A AND B = !( !A OR !B )

いずれにせよ、私はこの方法でチェックを行いません。構造的に、ネストされた if ステートメントが多すぎて保守が難しくなり、コードが見栄えが悪くなります。コード内でネストされた条件を避けるようにしてください。

于 2012-11-08T02:57:23.343 に答える
1

バーマーの答えが最高です。ただし、if ステートメントを保持して文字列の長さを確認したいcount()場合は、既に を使用して長さを確認しているため、 を削除する必要がありますstrlen()

if ( (!(strlen($whichField) >= 6)) OR (!(strlen($whichField) <= 15 ))) {
于 2012-11-08T02:59:00.187 に答える
1
function checkAlNum($whichField) 
{
    if (preg_match('/^[a-z0-9]{6,15}$/i', $_POST[$whichField])) {
        return true;          
    }
    else {
        $message = '<p>Username and password can only be numbers or letters, 6-15 characters long</p>';
            return user_error($message);
     }
}

^およびアンカーがない$場合、正規表現はフィールドのどこかに英数字があるかどうかのみをチェックし、すべてが英数字であることをチェックしません。ここで長さチェック+を実装するように変更すると、コードでその余分なチェックを削除できます。{6,15}

于 2012-11-08T02:52:08.787 に答える