HTML表单以及它们如何保持用户输入


HTML forms and how they keep user input

我正在开发一个用于用户注册的基本HTML/PHP表单。它运行良好,但有一个问题我想解决。我注意到,在测试过程中,当我按下提交键,密码不匹配时,我会进入错误页面(按设计),然后重定向回注册,在那里我必须重新输入所有内容。有没有一种方法可以让用户的输入填充字段,这样他们就可以返回并更正需要修复的内容,而不必重新输入所有内容?

最好的方法是使用AJAX,这样他们就不必离开页面。

否则,使用history.back()将用户发送回应该将表单信息保留在那里。

否则,将其表单数据保存在$_SESSION变量中,并使用该变量重新填充表单。

您可以在会话中保存提交的数据:

-通过<?php session_start(); ?>初始化php会话,此函数必须在标签之前出现

-在会话中存储一个变量,如下所示:$_SESSION['myVar']=$myVar;

-通过:$myVarFromSession = $_SESSION['myVar']; 取回(在另一页中)

-最后,销毁会话及其内容:<?php session_destroy(); ?>

快速—脏的

  1. 在查询字符串中发回用户名/密码(?username=…&password=…)
  2. 重定向前设置SESSION变量

更好—将逻辑封装到类中

我强烈建议将各种移动部件封装在处理请求、表单、验证、错误消息和呈现/路由逻辑的类中。您会发现这比尝试在脚本之间手动来回抛出错误消息/数据要容易得多。如果你的网站/应用程序很大,或者你想遵循最佳实践,成为一名更好的开发人员,那么课程就是你的选择。

看看不同的框架是如何处理这个问题的。一些好的是Yii、Laravel和Symfony2。开箱即用,他们就能快速轻松地解决这个问题。

示例代码

class LoginForm
{
    public $password;
    public $username;
    public function validate()
    {
        // Perform validation
    }
}
class HttpRequest
{
    public function getIsPostRequest()
    {
        return 'POST' === $_SERVER['REQUEST_METHOD'];
    }
    public function getPost($name, $default=null)
    {
        return isset($_POST[$name]) ? $_POST[$name] : $default;
    }
}
// This code processes the request to your login page.
// View::renderFile() renders a "view", which is a mix
// of HTML/PHP code that gets served back to the browser.
$request = new HttpRequest();
$form = new LoginForm();
if ($request->getIsPostRequest()) {
    $form->username = $request->getPost('username');
    $form->password = $request->getPost('password');
    if ($form->validate()) {
        // Login the user...
    }
}
View::renderFile('login.php', array(
    'form' =>$form,
));

在会话中存储用户密码或将其传递到查询参数中是一个安全问题。您应该在同一个表单页面上显示错误,以避免重定向和丢失数据。这样,错误仍然显示,并且脚本仍然具有来自$_POST的用户输入数据。当然,Dan Schmidt建议使用一个框架是非常好的。该框架的目的是将您从目前正在经历的头痛中拯救出来。

如果你坚持重定向到错误页面,那么你可以将用户名存储在会话中,但我强烈建议不要像前面提到的那样存储密码。