所以我试图创建一个简单的登录页面与php
和html
。这很简单。首先,用户输入他们的用户名和密码,然后单击提交按钮。
如果用户名/密码组合无效,则打印" invalid log in.",并将用户重定向回登录页面。
如果用户名/密码组合有效,则打印"Logging you in…",并将用户重定向到另一个页面。重定向时必须保留所有POST数据。
我想不出如何改变表单的动作。
下面的代码片段。请查看过去潜在的SQL注入。我以后再处理。
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post" id="form">
User Name:<input type="text" name="userName" id="userName">
Password:<input type="password" name="password" id="password">
<input type="submit" name="submit" id="submit" value="Submit">
<input type="reset" name="reset" id="reset" value="Reset">
<?php
$username = $_POST['userName'];
$password = $_POST['password'];
//(omitted) function that checks whether the credentials are valid or not
if (password_verify($password, $hash)) {
echo "Logging you in...";
//TODO: function that redirects user to another page
}
else {
echo "Invalid log in.";
}
?>
您可以在header函数中这样做,并选择要重定向的位置。根据其他人的建议,在调用header之前不应该回显任何内容。我们可以检查当前请求是POST还是GET。对于POST,我们可以进行身份验证,对于GET,我们输出表单。我们可以使用$_SESSION
变量来检查我们是否从成功或失败的登录尝试重定向。
<?php
session_start();
if (isset($_POST['userName'])) {
$username = $_POST['userName'];
$password = $_POST['password'];
if (password_verify($password, $hash)) {
$_SESSION['login_success'] = true;
header('Location: user.php?login_success=1');
} else {
$_SESSION['login_success'] = false;
header('Location: index.php');
}
}
if (isset($_SESSION['login_success']) && !$_SESSION['login_success']) {
echo "Invalid log in.";
unset($_SESSION['login_success']);
}
?>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post" id="form">
User Name:<input type="text" name="userName" id="userName">
Password:<input type="password" name="password" id="password">
<input type="submit" name="submit" id="submit" value="Submit">
<input type="reset" name="reset" id="reset" value="Reset">
在user.php中,我们也可以检查$_SESSION
变量。
<?php
session_start();
if (isset($_SESSION['login_success']) && $_SESSION['login_success']) {
echo "Successful login.";
unset($_SESSION['login_success'])
}
根据我的理解,您希望首先显示文本,然后重定向。您的流程如下:
- 用户输入凭证,
- 用户得到进程确认,
- 用户登录
这样,服务器将处理3个请求(发送凭据表单屏幕,发送进程确认屏幕,发送登录/索引)。我不明白你为什么要证明他正在登录。从用户体验的角度来看,用户将知道他正在登录(他填写了表单并按下按钮),这可能会破坏他的体验,因为屏幕可能会闪烁内容,确认登录是不标准的。而且,人们不喜欢等待。所以你可以跳过它,使用User3678068的代码。
如果你真的想使用这个流。您可以在第二个页面上使用Javascript重定向,并使用超时函数(以便用户实际看到确认),同时使用$_SESSION或其他cookie解决方案维护服务器端状态。
对于ux来说,由于上述原因,这不是一个理想的解决方案,因为它对关闭Javascript的访问者是有害的。
或者,您可以在凭据表单页面上发送一个Javascript通知,告诉用户他正在登录。没有Javascript的人不会看到通知,但无论如何都会登录。