php"表单验证"函数返回两个值

时间:2017-09-14 21:33:28

标签: php regex forms function validation

我想用php验证这个表单。我想使用正则表达式和strlen()函数。 这是表格===>

<form class="form" action="index.php" method="post" name="form">
<p class="form_field">
    <label>Name :</label> 
    <input class="input" type="text" name="name" placeholder="Name"> 
    * <?php echo  $nameErr; ?><br>
</p>
<p class="form_field">
    <label>Email :</label> 
    <input class="input" type="text" name="email" placeholder="Email"> 
    * <?php echo  $emailErr; ?><br>
</p>
<p class="form_field">
    <label>Gender :</label> 
    <input class="radio" type="radio" name="gender"> male
    <input class="radio" type="radio" name="gender"> female 
    * <?php echo  $genderErr; ?><br>
</p>
<p class="form_field">
    <label>Website :</label>
    <input type="text" name="website" placeholder="Website"> 
    <?php echo $websiteErr; ?> <br>
</p>
<p class="form_field">
    <label>Comment :</label> 
    <textarea rows="5" cols="30" name="comment" placeholder="your comment ..."></textarea> 
    * <?php echo  $commentErr; ?> <br>
</p>
<input class="submit" type="submit" name="submit" placeholder="Submit" >

这是我的php函数验证它==&gt;

function validate_forms($user_input, string $field){
    $input_length = strlen($user_input);

    if($field = "name"){
        if($input_length > 8){
            $message = "the name should be less than 32 characters";
        } else{
            if( !preg_match("/^[A-Za-z. ]*$/", $user_input) ){
                $message = "Only letters and white space are allowed ";
            } else {
                $get_input = $user_input;
            }
        }

    } elseif ($field = "URL") {
        if(!preg_match("/(?:https?:\/\/)?(?:[a-zA-Z0-9.-]+?\.(?:[a-zA-Z])|\d+\.\d+\.\d+\.\d+)/", $_POST['website'])){
            $message = "Please enter a valid url ";
           } else {
            $get_input = $user_input;
           }

    } elseif ($field = "email") {
        if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
            $emailErr = "Invalid email format";
           } else {
            $get_input = $user_input;
           }
    }
    return $message;}

我想要完成的是让我的函数在没有条件的情况下返回$ message变量,并且如果满足所有条件则获取并返回$ user_input。

我认为有可能返回一个数组,但我不知道如何。

此外,我认为我并不尊重这里的最佳做法,因此您可以帮助了解验证表单的最佳方式(更快更安全的方式)

这是出于学习目的,所以欢迎任何更多的信息或书籍,教程和课程建议。谢谢你提前

PS:我知道在这种情况下面向对象的方法会更好,但我想首先学习程序方法。

3 个答案:

答案 0 :(得分:2)

您应该仅使用preg_match来验证名称,对于其他字段(email&amp; url),已经有办法使用php filters

来测试它们
define( 'NAME_MIN_LENGTH', 8 );
define( 'NAME_MAX_LENGTH', 32 );

function validate_form( $user_input = null, $field = null , &$error_message )
{
    $error_message = '';

    switch ( $field ) {

        case 'name':

            $name_len = strlen( $user_input );

            if( $name_len < NAME_MIN_LENGTH ){

                $error_message = 'Name too short, minimin is '. NAME_MIN_LENGTH .' caracters';
                return false;
            }

            if( $name_len > NAME_MAX_LENGTH ){

                $error_message = 'Name too long, maximum is '. NAME_MAX_LENGTH .' caracters';
                return false;
            }

            if( ! preg_match( '/^[a-zA-Z][a-zA-Z\. ]+[a-zA-Z]$/' , $user_input ) ){

                $error_message = 'Invalid name';
                return false;
            }
            break;

        case 'url':

            if( ! filter_var( $user_input, FILTER_VALIDATE_URL ) ){

                $error_message = 'Invalid URL';
                return false;
            }
            break;

        case 'email':

            if( ! filter_var( $user_input, FILTER_VALIDATE_EMAIL ) ){

                $error_message = 'Invalid Email';
                return false;
            }
            break;

        default:

            $error_message = 'Invalid field';
            return false;
            break;
    }

    return $user_input;
}

// TESTS


$valid_name = 'John Doe';
$invalid_name_1 = 'Foo';
$invalid_name_2 = 'Foooooooooooooooooooooooooooooooo';
$invalid_name_3 = 'Foo#$*=+-!:;,,';

$valid_email = 'john.doe@example.com';
$invalid_email = 'foo.bar@';

$valid_url = 'http://www.example.com/';
$invlide_url = 'foo-bar';

$test_values = [ 
                    $valid_name=>'name',
                    $invalid_name_1=>'name',
                    $invalid_name_2=>'name',
                    $invalid_name_2=>'name',

                    $valid_email=>'email',
                    $invalid_email=>'email',

                    $valid_url=>'url',
                    $invlide_url=>'url'
                ];

$error_message = '';
echo '<pre>';
foreach( $test_values as $value => $field  ){

    if( ($valide_value = validate_form( $value, $field, $error_message )) === false ){

        printf( "%33s :   Is not a valid %s (%s)%s", $value, $field, $error_message, PHP_EOL );
    }else{

        printf( "%33s :   Is a valid %s%s", $valide_value, $field, PHP_EOL  );
    }
}
echo '</pre>';

以上示例给出了以下输出

                             John Doe :   Is a valid name
                                  Foo :   Is not a valid name (Name too short, minimin is 8 caracters)
    Foooooooooooooooooooooooooooooooo :   Is not a valid name (Name too long, maximum is 32 caracters)
                 john.doe@example.com :   Is a valid email
                             foo.bar@ :   Is not a valid email (Invalid Email)
              http://www.example.com/ :   Is a valid url
                              foo-bar :   Is not a valid url (Invalid URL)

答案 1 :(得分:1)

首先,我建议您查看parsleyjs,这是一个很棒的图书馆,可以在前端进行表格检查;这允许您在将数据发送到服务器以进行检查之前创建条件。它更实用,更易于使用。如果您有兴趣,请链接http://parsleyjs.org

您应该创建一个数组,然后以这种方式传回给用户。它将允许您检查错误或成功。

例如:

// note the "==" to check value
// single equal sign assigns value
if($field == "name"){
    if($input_length > 8){
        $response = array(
            'is_error' => true,
            'message' => "the name should be less than 32 characters"
        );
    } else{
        if( !preg_match("/^[A-Za-z. ]*$/", $user_input) ){
            $response = array(
                'is_error' => true,
                'message' => "Only letters and white space are allowed "
            );
        } else {
            $get_inputp['name'] = $user_input;
            $response = array(
                'is_error' => false,
                'message' => $user_input
            );
        }
    }
}

//... more code here ...//

// now return the response
return $response;

然后您可以在用户端检查消息,如下所示:

$submit = validate_form('', '');

if ($submit['is_error'] === true)
{
    echo $submit['message']; // and do whatever you need to in error case
}

这简化了必须尝试返回两个值,只返回包含布尔错误的数组以进行错误检查,然后是消息,您还可以在该数组中添加更多信息。

对于您的值检查,特别是对于URL,请使用与电子邮件相同的方法。 filter_var允许您检查网址:

$valid_url = filter_var($_POST['website'], FILTER_VALIDATE_URL);

答案 2 :(得分:0)

我建议将其转换为case语句,并按字段名称将错误存储在关联数组中,如下所示:

$errors = [];

switch($field){
    case 'name':
        if($input_length > 32){
            $errors[$field] = "the name should be less than 32 characters";
        } 
        break;
    case 'url':
        ...
        break;
    case 'email':
        ...
        break;
}    

然后测试错误数组

if(!empty($errors)){
    print_r($errors);
}