【问题标题】:Can't keep values inside the field after failing to pass validation未能通过验证后无法将值保留在字段内
【发布时间】:2019-10-09 06:28:30
【问题描述】:

基本上我想保留没有错误且不是密码或重复密码的值。为此,我关注了这个问题:

PHP Keep entered values after validation error

不过,我尝试过的方式只保留了姓氏。我目前尝试对表单中的所有字段执行此操作的方式是:"<?php echo isset($_GET["email"]) ? $_GET["email"] : ''; ?>"。我也有错误消息,它使用 $_GET 从 URL 读取并相应地发送错误消息,这工作正常。这是我的实际代码。

<form method="post" action="includes/signup.inc.php" id="create_customer" accept-charset="UTF-8"><input type="hidden" name="form_type" value="create_customer" /><input type="hidden" name="utf8" value="✓" />
<div id="first_name" class="clearfix large_form"> <label for="fname" class="login">Nome</label>
<input type="text" value="<?php if(isset($_GET["fname"])){echo($_GET["fname"]);}?>" name="fname" id="fname" class="large" size="30" />
</div>
<div id="last_name" class="clearfix large_form"> <label for="lname" class="login">Sobrenome</label>
<input type="text" value="<?php if(isset($_GET["fname"])){echo($_GET["fname"]);}?>" name="lname" id="lname" class="large" size="30" /></div>
<div id="email" class="clearfix large_form"> <label for="email" class="login">E-mail</label> <input type="email" value="<?php echo isset($_POST["email"]) ? $POST["email"] : ''; ?>" name="email" id="email" class="large" size="30" /></div>
<div id="password" class="clearfix large_form"> <label for="password" class="login">Senha</label> <input type="password" value="" name="pwd" id="password" class="large password" size="30" />
<div id="password" class="clearfix large_form"> <label for="password" class="login">Repetir Senha</label> <input type="password" value="" name="pwd-repeat" id="password" class="large password" size="30" />
</div>
<div class="acceptsMarketing"> <input type="checkbox" id="customer[accepts_marketing]" name="customer[accepts_marketing]"> <label for="customer[accepts_marketing]">Assine a nossa
newsletter?</label></div>
<div class="action_bottom"> <input class="btn action_button" name="signup-submit" type="submit" value="Inscrever-se" />
<p class="right" style="padding-top: 8px;">
<input class="btn action_button" type="submit" value="Recuperar Senha" />
<p class="right" style="padding-top: 8px;">
Já é cliente? <a href="login.php" id="customer_login_link">Entrar →</a></p>
</div>
</form>
</div><!-- /#create-customer -->
</div>
</div>
</div>
</div>
</div>

我最初不知道,这里是错误显示的验证代码:

if (isset($_POST['signup-submit'])) {
    require 'dbh.inc.php';

    $email = $_POST['email'];
    $fname = $_POST['fname'];
    $lname = $_POST['lname'];
    $pwd = $_POST['pwd'];
    $pwdrepeat = $_POST['pwd-repeat'];

    if (empty($fname) || empty($lname) || empty($email) || empty($pwd) || empty($pwdrepeat)) {
        header("Location: ../register.php?error=emptyfields&fname=" . $fname . "&lname" . $lname . "&email" . $email);
        exit();
    } else if (!filter_var($fname, FILTER_VALIDATE_REGEXP) && !preg_match("/^[a-zA-Z -]+$/", $fname)) {
        header("Location: ../register.php?error=nomeinvalido&fname=" . $fname);
        exit();
    } else if (!filter_var($lname, FILTER_VALIDATE_REGEXP) && !preg_match("/^[a-zA-Z -]+$/", $lname)) {
        header("Location: ../register.php?error=sobrenomeinvalido&lname=" . $lname.  "&lname");
        exit();
    } else if (!filter_var($email, FILTER_VALIDATE_EMAIL) && !preg_match('/^[a-zA-Z0-9]*$/', $email)) {
        header("Location: ../register.php?error=invalidmail&email=" . $email);
        exit();
    } else if ($pwd !== $pwdrepeat) {
        header("Location: ../register.php?error=passwordcheck&fname=");
        exit();

【问题讨论】:

  • 昨天在你之前的问题中出现了同样的表单,然后我提到你的 HTML 不正确 - 它保持不变......为什么?
  • 更新代码格式
  • @RamRaider 我确实澄清了 div 是正确的。还更新了一些我尝试做的测试 "" 它保存了名字字段,但是如果我为 $_GET["lname"] 它不保存,如果我对所有字段重复 $_GET["fname",它会保存...
  • 上述表格格式不正确。存在不平衡的元素数量和重复 ID
  • 是的。尽管如此,格式化它并不能解决我的问题......

标签: php html


【解决方案1】:

要保留各种表单元素的值,您可以使用一个非常简单的小函数,只需提供表单元素名称作为参数,如下所示:

<?php
    function getvalue( $name=false ){
        echo isset( $_POST[ $name ] ) ? $_POST[ $name ] : '';
    }
?>

<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title>Form value retention</title>
    </head>
    <body>

        <!--
            for demonstration, the action has been 
             removed so it POSTs to the same page.
        -->
        <?php

            if( $_SERVER['REQUEST_METHOD']=='POST' ){
                printf('<pre>%s</pre>',print_r( $_POST, true ) );
            }

        ?>

        <form method='post' accept-charset='UTF-8'>

            <input type='hidden' name='form_type' value='create_customer' />
            <input type='hidden' name='utf8' value='✓' />

            <div id='first_name' class='clearfix large_form'> 
                <label for='fname' class='login'>Nome</label>
                <input type='text' value='<?php getvalue('fname'); ?>' name='fname' class='large' size='30' />
            </div>

            <div id='last_name' class='clearfix large_form'> 
                <label for='lname' class='login'>Sobrenome</label>
                <input type='text' value='<?php getvalue('lname'); ?>' name='lname' class='large' size='30' />
            </div>

            <div id='email' class='clearfix large_form'> 
                <label for='email' class='login'>E-mail</label>
                <input type='email' value='<?php getvalue('email'); ?>' name='email' class='large' size='30' />
            </div>

            <div class='clearfix large_form'>

                <label for='password' class='login'>Senha</label>
                <input type='password' value='<?php getvalue('pwd');?>' name='pwd' class='large password' size='30' />

                <div id='password' class='clearfix large_form'>
                    <label for='password' class='login'>Repetir Senha</label>
                    <input type='password' value='<?php getvalue('pwd-repeat');?>' name='pwd-repeat' class='large password' size='30' />
                </div>
            </div>

            <div class='acceptsMarketing'>
                <input type='checkbox' name='customer[accepts_marketing]'>
                <label for='customer[accepts_marketing]'>Assine a nossa newsletter?</label>
            </div>

            <div class='action_bottom'>

                <input class='btn action_button' name='signup-submit' type='submit' value='Inscrever-se' />

                <p class='right' style='padding-top: 8px;'>
                    <input class='btn action_button' type='submit' value='Recuperar Senha' />
                </p>

                <p class='right' style='padding-top: 8px;'>
                    Já é cliente? <a href='login.php' id='customer_login_link'>Entrar →</a>
                </p>
            </div>
        </form>
    </body>
</html>

表单中的 HTML 已被更正,我相信这是最合乎逻辑的方式,尽管我删除了 ID 属性,因为许多重复。也就是说,表单值在表单提交时得到维护——因为它是同一个页面。要在提交到其他脚本后完成此操作,您将使用会话变量来跟踪 POST 数组。

当使用另一个脚本进行表单操作(执行验证等)时,如果其他脚本发现错误,则不会保留表单值。为了解决这个问题,会话变量可以很好地工作。

所以,在上面 - 在表单操作页面的开头:

session_start();
$svar='formdata';
/* the session variable is populated when the form is submitted */
if( !isset( $_SESSION[ $svar ] ) && $_SERVER['REQUEST_METHOD']=='POST' ){
    $_SESSION[ $svar ]=$_POST;
}
/* other processing... if(error)->redirect etc */

以及上面页面中getvalue的替代功能:

session_start();
$svar='formdata';

function getsessionvalue( $name=false ){
    global $svar;
    echo isset( $_SESSION[ $svar ][ $name ] ) ? $_SESSION[ $svar ][ $name ] : '';
}

【讨论】:

  • 不错,非常简单,易于理解并且完美运行!
  • 很高兴它有帮助。发布到同一页面时这很好,但如果表单发布到另一个执行验证的脚本,然后如果出现错误则重定向它将不起作用 - 这是会话变量的来源。我将添加一个替代函数说明。
  • 是的,它工作得很好,只是花了一分钟左右的时间来看看我做错了什么,在我通过函数来​​获取它工作得非常好的值之后
【解决方案2】:

您通过 POST 方法(form method="post")发送数据,但尝试从 $_GET 数组中设置它。改用 $_POST。也不要忘记转义输入的数据以避免 XSS 漏洞

【讨论】:

  • 我最初使用的是 $_POST,根本没有保存任何字段。
  • 好的,看起来您从includes/signup.inc.php 重定向回带有错误和接收数据的表单。如果是这样 - 你能提供网址吗?
  • 你指的是哪个网址?
【解决方案3】:

尝试使用 $_REQUEST,这会从所有 $_GET 和 $_POST 数据中获取结果。 请参阅http://www.shodor.org/~kevink/phpTutorial/nileshc_getreqpost.php 了解更多信息

【讨论】:

  • 它只保留了 1 个字段
猜你喜欢
  • 2011-09-26
  • 2015-10-26
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2016-07-20
  • 2013-11-03
相关资源
最近更新 更多