所以我正在尝试使用php
和html
创建一个简单的登录页面。这很简单。首先,用户输入他们的用户名和密码,然后单击提交按钮。
如果用户名/密码组合无效,则“登录无效”。打印,用户被重定向回登录页面 如果用户名/密码组合有效,则会打印“登录...”,并将用户重定向到另一页。 重定向时必须保留所有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.";
}
?>
答案 0 :(得分:2)
您可以使用标题功能执行此操作,并选择重定向的位置。
根据其他人的建议,在调用标头之前不应回应任何内容。我们可以检查当前请求是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'])
}
答案 1 :(得分:1)
据我了解,您希望首先显示文本然后重定向。您的流程如下:
这样,服务器将处理3个请求(发送凭证表单屏幕,发送进程屏幕确认,发送登录/索引)。我不明白为什么你需要证明他正在登录。从用户体验的角度来看,用户会知道他正在登录(他填写表格并按下按钮)这可能会打破他的经验,因为屏幕可能闪存内容,确认登录是非标准的。此外,人们不喜欢等待。所以你可以跳过它并使用User3678068's code。
如果你真的想使用这个流程。您可以在第二页上使用Javascript重定向,具有超时功能(以便用户实际看到确认),同时使用$ _SESSION或其他cookie解决方案维护服务器端状态。
用户体验 - 由于上述原因,这不是一个理想的解决方案,因为它对关闭Javascript的访问者有害。
或者,您可以在凭证表单页面上发送Javascript通知,告诉用户他正在登录。没有Javascript的人不会看到通知但是仍然会登录。