我正在开发一个用于用户注册的基本HTML/PHP表单。它运行良好,但有一个问题我想解决。我注意到,在测试过程中,当我按下提交键,密码不匹配时,我会进入错误页面(按设计),然后重定向回注册,在那里我必须重新输入所有内容。有没有一种方法可以让用户的输入填充字段,这样他们就可以返回并更正需要修复的内容,而不必重新输入所有内容?
最好的方法是使用AJAX,这样他们就不必离开页面。
否则,使用history.back()
将用户发送回应该将表单信息保留在那里。
否则,将其表单数据保存在$_SESSION
变量中,并使用该变量重新填充表单。
您可以在会话中保存提交的数据:
-通过<?php session_start(); ?>
初始化php会话,此函数必须在标签之前出现
-在会话中存储一个变量,如下所示:$_SESSION['myVar']=$myVar;
-通过:$myVarFromSession = $_SESSION['myVar'];
取回(在另一页中)
-最后,销毁会话及其内容:<?php session_destroy(); ?>
快速—脏的
- 在查询字符串中发回用户名/密码(?username=…&password=…)
- 重定向前设置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建议使用一个框架是非常好的。该框架的目的是将您从目前正在经历的头痛中拯救出来。
如果你坚持重定向到错误页面,那么你可以将用户名存储在会话中,但我强烈建议不要像前面提到的那样存储密码。