【问题标题】:php "form validation " function returning two valuesphp“表单验证”函数返回两个值
【发布时间】:2017-09-14 21:33:28
【问题描述】:

我想用 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 函数来验证它 ==>

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:我知道在这种情况下,面向对象的方法会更好,但我想先学习过程方法。

【问题讨论】:

  • 很多人的名字都会让你的 chcek 失败
  • 长度和字符限制都是不现实的。 kalzumeus.com/2010/06/17/…
  • 比较运算符需要双等号'=='
  • @rtfm 谢谢你,这是一篇很有帮助的文章,我知道 8 个字符的名字是不现实的,但我不知道我的正则表达式也是。那么你推荐什么长度和字符限制?非常感谢。

标签: php regex forms function validation


【解决方案1】:

您应该只使用preg_match 来验证名称,对于其他字段(电子邮件和网址),已经有一种方法可以使用 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:是一个有效的名字 Foo : 不是一个有效的名称(名称太短,最少 8 个字符) Foooooooooooooooooooooooooooooooo : 不是一个有效的名称(名称太长,最多 32 个字符) john.doe@example.com :是有效的电子邮件 foo.bar@ : 不是有效的电子邮件(无效电子邮件) http://www.example.com/ :是一个有效的网址 foo-bar : 不是有效的网址(无效的网址)

【讨论】:

  • 哦,谢谢你,你的代码太棒了。一件事,如果我想获取用户输入并将其存储在一个变量中,如果所有条件都满足并且 $error_message 为空,我应该这样做吗? ==> if( !empty( $error_message ) ){ return $error_message; }else { $input = $user_input ;返回$输入;如果你能解释这个字符 (%33s : Is not a valid %s (%s)%s) 和 (PHP_EOL) 那就太好了。非常感谢
  • 不客气,我刚刚更新了代码,请参阅测试部分了解如何使用此功能。
  • PHP_EOL 用于添加新行。
  • 这是在这种情况下处理错误的唯一方法,否则您应该使用异常。
【解决方案2】:

首先,我建议你看看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 允许您检查 URL:

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

【讨论】:

  • 这不是很干,因为您正在重建每个块中的 $response 数组。
  • @Samuel 谢谢你的好评。这正是我想做的。只是一件事,我想现在我不需要把这一行“ $get_inputp['name'] = $user_input; ” 因为它什么都不做我弄错了吗?感谢您提供 url 验证建议和 js 库,我会检查一下。再次感谢你:)
  • 没问题的人,很高兴我能帮上忙!是的,我认为它不需要它。
【解决方案3】:

我建议将其转换为 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);
}

【讨论】:

  • 感谢您的回复,我确实想过这样做,但问题是:如果满足所有条件,我应该如何获得用户输入。这就是我想要的问题如果存在字符或长度错误,则返回错误消息并将其显示在表单字段的前面。但我没有错误我想获取用户输入并将其存储在一个变量中,这样我就可以将它存储在数据库中或稍后使用它。
猜你喜欢
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2014-03-17
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多