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

时间:2014-06-08 00:08:34

标签: php html

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

如果用户名/密码组合无效,则“登录无效”。打印,用户被重定向回登录页面 如果用户名/密码组合有效,则会打印“登录...”,并将用户重定向到另一页。 重定向时必须保留所有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.";
}
?>

2 个答案:

答案 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)

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

  1. 用户输入凭据,
  2. 用户获得进程确认,
  3. 用户登录
  4. 这样,服务器将处理3个请求(发送凭证表单屏幕,发送进程屏幕确认,发送登录/索引)。我不明白为什么你需要证明他正在登录。从用户体验的角度来看,用户会知道他正在登录(他填写表格并按下按钮)这可能会打破他的经验,因为屏幕可能闪存内容,确认登录是非标准的。此外,人们不喜欢等待。所以你可以跳过它并使用User3678068's code

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

    用户体验 - 由于上述原因,这不是一个理想的解决方案,因为它对关闭Javascript的访问者有害。

    或者,您可以在凭证表单页面上发送Javascript通知,告诉用户他正在登录。没有Javascript的人不会看到通知但是仍然会登录。