我正在为用户注册制作一个基本的 HTML/PHP 表单。它工作正常,但有一个我想解决的问题。我注意到在测试过程中,当我按下提交并且密码不匹配时,我会进入错误页面(按设计),然后重定向回注册,我必须重新输入所有内容。有没有办法让用户输入的字段保持填充,以便他们可以返回并更正需要修复的内容,而不必重新输入所有内容?
4 回答
最好的方法是使用 AJAX,这样他们就不必首先离开页面。
如果做不到这一点,history.back()
用于将用户送回应将表单信息保留在那里。
如果做不到这一点,请将他们的表单数据保存在一个$_SESSION
变量中并使用它来重新填充表单。
您可以在会话中保存提交的数据:
-Init a php session by <?php session_start(); ?>
,这个函数必须出现在标签之前
-在会话中存储一个变量,如下所示:$_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 使用框架的建议非常好。该框架的目的是让您摆脱现在遇到的头痛。
如果您坚持重定向到错误页面,那么您可以将用户名存储在会话中,但我强烈建议您不要像之前提到的那样存储密码。