如何设置表单是否重定向到新页面


How do I set whether a form redirects to a new page or not?

所以我试图创建一个简单的登录页面与phphtml。这很简单。首先,用户输入他们的用户名和密码,然后单击提交按钮。

如果用户名/密码组合无效,则打印" 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'])
}

根据我的理解,您希望首先显示文本,然后重定向。您的流程如下:

  1. 用户输入凭证,
  2. 用户得到进程确认,
  3. 用户登录

这样,服务器将处理3个请求(发送凭据表单屏幕,发送进程确认屏幕,发送登录/索引)。我不明白你为什么要证明他正在登录。从用户体验的角度来看,用户将知道他正在登录(他填写了表单并按下按钮),这可能会破坏他的体验,因为屏幕可能会闪烁内容,确认登录是不标准的。而且,人们不喜欢等待。所以你可以跳过它,使用User3678068的代码。

如果你真的想使用这个流。您可以在第二个页面上使用Javascript重定向,并使用超时函数(以便用户实际看到确认),同时使用$_SESSION或其他cookie解决方案维护服务器端状态。

对于ux来说,由于上述原因,这不是一个理想的解决方案,因为它对关闭Javascript的访问者是有害的。

或者,您可以在凭据表单页面上发送一个Javascript通知,告诉用户他正在登录。没有Javascript的人不会看到通知,但无论如何都会登录。