PHP - 重新显示表单中的有效值,以及验证失败的错误消息

时间:2014-01-11 00:08:29

标签: php forms validation

我创建了一个PHP表单,用于获取4个文本字段的名称,电子邮件,用户名和密码,并为这些设置验证。我的代码当前正确验证并在代码验证时显示消息。 但是,我希望它能够在提交时保持正确验证的字段,并且验证失败的字段为空,并显示错误消息,详细说明原因。

到目前为止,我有以下代码,主要是form.php:

    <?php
    $self = htmlentities($_SERVER['PHP_SELF']);
    ?>
    <form action="<?php echo $self; ?>" method="post">
        <fieldset>
        <p>You must fill in every field</p>
        <legend>Personal details</legend>
            <?php
            include 'personaldetails.php';
            include 'logindetails.php';
            ?>
            <div>            
                <input type="submit" name="" value="Register" />
            </div>
        </fieldset>
    </form>
    <?php
    $firstname = validate_fname();
    $emailad = validate_email();
    $username = validate_username();
    $pword = validate_pw();
    ?>

我的functions.php代码如下:

<?php
function validate_fname() {
    if (!empty($_POST['fname']))    {
        $form_is_submitted = true;
        $trimmed = trim($_POST['fname']);
        if  (strlen($trimmed)<=150  && preg_match('/\\s/', $trimmed))   {
            $fname = htmlentities($_POST['fname']);
            echo "<p>You entered full name: $fname</p>";
        }   else    {
                echo "<p>Full name must be no more than 150 characters and must contain one space.</p>";
        }   }
        }

function validate_email() {        
    if (!empty($_POST['email']))    {
        $form_is_submitted = true;
        $trimmed = trim($_POST['email']);
        if  (filter_var($trimmed, FILTER_VALIDATE_EMAIL))   {
            $clean['email'] = $_POST['email'];              
            $email = htmlentities($_POST['email']);

            echo "<p>You entered email: $email</p>";
        }   else    {
                echo "<p>Incorrect email entered!</p>";
        }   }   
        }

function validate_username() {
    if (!empty($_POST['uname']))        {
        $form_is_submitted = true;
        $trimmed = trim($_POST['uname']);
        if  (strlen($trimmed)>=5 && strlen($trimmed) <=10)  {
            $uname = htmlentities($_POST['uname']);
            echo "<p>You entered username: $uname</p>";
        }   else    {
                echo "<p>Username must be of length 5-10 characters!</p>";
        }   }   
    }

function validate_pw()  {
    if (!empty($_POST['pw']))   {
        $form_is_submitted = true;
        $trimmed = trim($_POST['pw']);
        if  (strlen($trimmed)>=8 && strlen($trimmed) <=10)  {           
            $pword = htmlentities($_POST['pw']);
            echo "<p>You entered password: $pword</p>";
        }   else    {
                echo "<p>Password must be of length 8-10 characters!</p>";      
        }   }
    }
?>

如何确保在按下提交时它将保留有效输入并清空无效输入错误消息。

最好我还希望初始if(!empty)有另一个其他条件。我最初有这个,但发现它会以错误信息启动表单。

最后,如何在通过此表单注册后将有效信息记录到外部文件中以用于检查登录详细信息?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

只需在输入框中创建一个包含所需内容的变量即可。例如,您可以使用变量$show_message_email并将要显示的内容放在变量值的输入中,然后只需将输入值设置为该值,包括是否要显示错误消息:

<?php
$show_message_email = $_POST['email'];
?>
<input type="text" value="<?php echo $show_message_email; ?>">

或者只是直接设置它,如果你只想要他们原来的输入:

<input type="text" value="<?php echo $_POST['email']; ?>">

答案 1 :(得分:0)

尝试使用单独的变量进行错误,而不是向input字段输出错误消息。

你可以使用global变量,但我不喜欢它们。

的login.php

<?php 
$firstname = '';
$password  = '';
$username  = '';
$emailadd  = '';
$response  = '';
include_once('loginprocess.php');
include_once('includes/header.php);
//Header stuff
?>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES, "utf-8");?>" method="post">
    <fieldset>
        <p>Please enter your username and password</p>
    <legend>Login</legend>
        <div>
        <label for="fullname">Full Name</label>
            <input type="text" name="fname" id="fullname" value="<?php echo $firstname ?>" />
        </div>
        <div>
         <label for="emailad">Email address</label>
         <input type="text" name="email" id="emailad" value="<?php echo $emailadd; ?>"/>
        </div>
        <div>
        <label for="username">Username (between 5-10 characters)</label>
        <input type="text" name="uname" id="username" value='<?php echo $username; ?>' />
        </div>
        <div>            
        <label for="password">Password (between 8-10 characters)</label>
        <input type="text" name="pw" id="password" value="<?php echo $password; ?>" />
        </div>
        <div>            
            <input type="submit" name="" value="Submit" />
        </div>
    </fieldset>
</form>
<?php
//Output the $reponse variable, if your validation functions run, then it
// will contain a string, if not, then it will be empty.
if($response != ''){
    print $response;         
}     
?>
//Footer stuff

loginprocess.php

//No need for header stuff, because it's loaded with login.php
if($_SERVER['REQUEST_METHOD'] == 'POST'){//Will only run if a post request was made.
    //Here we concatenate the return values of your validation functions.
    $response .= validate_fname();
    $response .= validate_email();
    $response .= validate_username();
    $response .= validate_pw();
}    
//...or footer stuff.

的functions.php

function validate_fname() {
    //Note the use of global...
    global $firstname;
    if (!empty($_POST['fname']))    {
        $form_is_submitted = true;
        $trimmed = trim($_POST['fname']);
        if(strlen($trimmed)<=150  && preg_match('/\\s/', $trimmed)){
            $fname = htmlentities($_POST['fname']);
            //..and the setting of the global.
            $firstname = $fname;
            //Change all your 'echo' to 'return' in other functions.
            return"<p>You entered full name: $fname</p>";
        } else {
            return "<p>Full name must be no more than 150 characters and must contain one space.</p>";
        }
    }
}

我不会建议使用包含表格之类的小东西,我发现它很快会弄得很乱。将所有“显示”代码保存在一个文件中,并使用包含功能(如您所有)并仅在范围发生更改时拆分文件。即您的functions.php文件目前处理验证,但您可能希望稍后制作一个新的包含来处理实际的登录或注册过程。

查看http://www.php.net/manual/en/language.operators.string.php以了解有关连接的信息。