用于验证用户名和密码无效的功能

时间:2012-11-08 02:48:22

标签: php validation if-statement

  

可能重复:
  Regular Expression matching for entire string

在我的表单页面上,我试图让它只接受我的用户名和密码的字母数字字符,并要求它们是6到15个字符。当我输入无效数据时,它会将其插入到数据库中,而不是抛出我在CheckAlNum函数中定义的用户错误。

的functions.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语句和正则表达式的嵌套(虽然我很确定正则表达式是正确的)。也许我只是错过了一些非常愚蠢的东西?

3 个答案:

答案 0 :(得分: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}会在此处执行长度检查,因此您可以删除代码中的额外检查。

答案 1 :(得分:1)

我认为第二个if语句不正确。它应该是这样的:

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

这是由于De Morgan Rule声明

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

在任何情况下,我都不会以这种方式进行检查,结果你会得到太多嵌套的if语句,这些语句难以维护并且使代码看起来不合适。尝试避免代码中的嵌套条件。

答案 2 :(得分:1)

Barmar的答案是最好的。但是,如果要保留if语句以检查字符串长度,则需要删除count(),因为您已使用strlen()检查长度。

if ( (!(strlen($whichField) >= 6)) OR (!(strlen($whichField) <= 15 ))) {