【问题标题】:Retain form field details保留表单字段详细信息
【发布时间】:2013-08-31 09:58:54
【问题描述】:

我有收集所有必要信息的用户注册表。当用户选中“我同意所有条款和条件”框时,提交按钮被启用,因此用户可以提交表单。我将此数据发布到另一个进行验证的 php 页面,如果发现任何错误,注册表会再次出现,显示某些错误,缺少一些必要的信息。

问题: 尽管我输入了以下代码,但当用户被重定向回注册表单时,我无法保留表单的值:

<input type="text" size="40" name="email" value="<?php echo isset($_POST['email']) ? $_POST['email'] : NULL; ?>" />

我正在使用

header("location: form.php");

当在我的进行验证的 php 页面中发现错误时。这条线是给我造成问题还是有其他问题?我无法找出问题所在。

编辑: 此外,如果有人可以指导我如何保留通过单选按钮和组合框选择的值,我将不胜感激。

【问题讨论】:

  • 重定向后将删除帖子值。
  • 如果发现任何错误,将其重定向到具有已发布值的任何数组的表单页面并填写表单值
  • php.net/manual/en/function.header.php,你做错了。您需要调用
    .php 文件。发布更多您的示例,它会更容易帮助您。

标签: php forms retain


【解决方案1】:

正如许多其他人在 cmets 中指出的那样,你做错了。

但是,不要害怕,有一个简单的方法可以实现你想要的。

首先,了解重定向后您无法访问 $_POST 值。如果你想知道为什么?

因为:HTTP is a stateless protocol.(在继续之前阅读此答案)。

现在我明白 HTTP 是无状态的。那么,如何维护表单状态?

嗯,通常人们将验证逻辑保持在同一页面上。 因此,考虑到您的注册表单位于 form.php ,表单操作将指向 form.php 本身,而不是任何成功页面。

每当 form.php 收到请求时,它都会检查请求是来自表单提交还是新调用。如果是表单提交,则执行验证逻辑。如果发现任何错误,页面将重新发出,并以与您现在尝试相同的方式填充值。 (但是,这次 post 变量可用,因为没有重定向。)

如果没有错误,则将访问者重定向到确认页面等。

如果请求是第一个请求(即不是来自表单提交)。您可以跳过验证部分,直接发出带有默认值的表单 html。

如果您仍然想知道如何检测请求是否来自表单提交,有一个简单的方法可以做到这一点。在您的表单中,添加一个名为 hdnVar 的隐藏字段,其值设置为 yes 或您喜欢的任何内容。然后在对 form.php 的每个请求中,只需检查 $_POST['hdnvar'] 是否存在,如果它存在并且值与您设置的一样,则请求来自表单提交。

希望我能说清楚。如有任何疑问,请询问:)

干杯!

【讨论】:

  • 所以在成功验证后我应该重定向到哪个链接以及如何重定向?
  • 我只是推荐了一种验证方式,接下来你对数据的处理完全取决于你。您是否尝试将经过验证的数据添加到 SQL?然后在同一页面上执行此操作,然后将用户重定向到登录页面。
  • 是的,经过验证的数据将通过 SQL 存储到数据库中,我保存信息没有问题。成功验证并将数据保存到数据库后,我想在表单所在的同一页面上显示 您的信息已成功添加的消息,并且此信息将显示在仅可见的 div 中成功验证。
  • 那么根本不需要重定向用户。 (甚至更好)。当您验证了用户信息并将他/她添加到数据库时,只需在 HTML 中的 echo 一个 div 与您要显示的内容一起在表单上方。一种简单的方法是创建一个变量$isAdded 并将其赋值为1。打印 HTML 时,如果 $isAdded 为 1,那么您也可以 echo div。
  • 我已经将我的验证代码放在 form.php 上,并检查是否按下了提交按钮,如果是,则验证完成并页面 form.php 显示,如果不按原样显示页面,但我仍然无法保留表单字段的值... :(
【解决方案2】:

如果我使用任何类型的验证,根据经验,我会使用action="&lt;?php $_SERVER['REQUEST_URI']" 并在与表单 IE 相同的页面上处理任何必要的操作

if(isset($_POST['an_expected_input']) {
    // First validate
    if($is_valid) {
        // Do action with the post data
        // Posibly redirect to a confirmation page
    } else {
        // Do whatever needed for feedback to the visitor
        // Add posted values back to the form
    }
}

这是我在 99% 的案例中发现的一种方法。也许它对你不起作用,但至少你现在还有另一种方法要考虑:)

【讨论】:

  • 嗨,你的代码永远不会抛出错误,但是,它永远不会实现 OP 想要做的事情。由于 OP 正在使用重定向到另一个 URL,由于 HTTP 的无状态特性,所有数据都将丢失,除非他停止重定向回表单页面。
  • 是的,这是真的。我想我给出的解决方案更像是一种新方法,而不是真正解释为什么这会奏效以及为什么他不会。桑尼解释得更好。
  • 你的方法对我来说很好,没有解释。基本上我们已经习惯了做这些事情,以至于我们从来没有意识到人们使用各种技术来做简单的事情,比如验证。
【解决方案3】:

试试这个。

<input type="text" size="40" name="email" value="<?php echo (isset($_POST['email']) && !empty($_POST['email'])) ? $_POST['email'] : "" ?>" />

【讨论】:

    猜你喜欢
    • 2020-12-06
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多