多个页面中$ _POST中的数据

时间:2018-03-15 03:28:11

标签: php

我是PHP新手,我编写了简单登录脚本。成功登录并单击“返回登录”链接后,我无法填写以前的登录用户名。我知道使用$ _COOKIE ['username']来表示username的值,但我想知道为什么$ _POST ['username']不起作用?谢谢!

的login.php

<!DOCTYPE HTML>
<html>
<head></head>
<body>

<form action="./loginProcess.php" method="post">
  Username: <input type="text" name="username" value="<?php echo isset($_POST['username']) ? htmlspecialchars($_POST['username']) : ''; ?>"><br>
  Password: <input type="password" name="password"><br>
  <input type="submit" name="send">
</form>

</body>
</html>

loginProcess.php

<?php
echo "welcome,  ".$_POST['username'].", login success!!";
echo "<br/><a href='login.php'>Back to login</a><br>";
if(!empty($_COOKIE['lastVist'])){
    echo "your last login time:".$_COOKIE['lastVist'];
    setcookie("lastVist",date("Y-m-d H:i:s"),time()+24*3600*30);
}else{
    echo "you first login time:";
}
setcookie("username", $_POST['username'], time()+24*3600*30);
?>

2 个答案:

答案 0 :(得分:0)

会话是一种存储要在多个页面中使用的信息(在变量中)的方法。

与cookie不同,该信息不会存储在用户计算机上,也不会发布,因为它具有用户发送的特定请求的信息。

当我们使用应用程序时,我们打开它并进行一些更改,然后我们关闭它。这很像一个Session,所以为了保存我们在php $_SESSION中每个会话全局数组的信息。

使用session_start()函数启动会话,并以简单的关联数组方式$_SESSION['key'] = $value;存储值。

<强>的login.php

<?php
session_start();
?>
<!DOCTYPE HTML>
<html>
<head></head>
<body>

<form action="./loginProcess.php" method="post">
  Username: <input type="text" name="username" value="<?php echo isset($_SESSION['username']) ? htmlspecialchars($_SESSION['username']) : ''; ?>"><br>
  Password: <input type="password" name="password"><br>
  <input type="submit" name="send">
</form>

</body>
</html>

<强> loginProcess.php

<?php
session_start();

echo "welcome,  ".$_POST['username'].", login success!!";
echo "<br/><a href='login.php'>Back to login</a><br>";
if(isset($_SESSION['lastVisit'])){
    echo "your last login time:".$_SESSION['lastVisit'];
}else{
    echo "you first login time:".$_SESSION['lastVisit'];
    $_SESSION['lastVisit'] = date("Y-m-d H:i:s", time());
}

$_SESSION['username'] = $_POST['username'];
?>

答案 1 :(得分:0)

原则上,在 loginProcess.php 中,如果您曾使用过包含用户名值的隐藏输入的表单,那么此值将具有可以在 login.php 中阅读 - 点击&#34;返回登录&#34; 锚点

Welcome <?php echo $_POST['username']; ?>, login success!!
<br>
<form id="backToLoginForm" action="login.php" method="post">
    <input type="hidden" name="username" value="<?php echo $_POST['username']; ?>" />
    <a href="#" onclick="javascript:document.forms['backToLoginForm'].submit();">
        Back to login
    </a>
</form>

但你真的不应该做你想做的事。例如。回到 login.php 而不先登出 - 至少。如果您要执行此操作并完成其他凭据 - 在 login.php 中 - 与第一次登录时使用的凭据一样,那么在验证新凭据之前,您仍需要注销先前的用户。这将是对活动会话,cookie等的错误管理。

更多的是,登录凭据的自动完成是密码管理器表单填充程序的作业,而不是您自己代码的作业 - 除非它&#39 ; s当前给定登录凭据的验证过程的一部分(请参阅下面的代码示例)。

因此,作为您的方法的替代方案,我的建议是以下 login.php 代码。不再需要 loginProcess.php 页面:

<?php
session_start();

// Operations upon form submission.
if (isset($_POST['submit'])) {
    // Validate the username.
    if (!isset($_POST['username']) || empty($_POST['username'])) {
        $errors[] = 'Please provide the username.';
    }/* Here other password validations using elseif statement. */

    // Validate the password.
    if (!isset($_POST['password']) || empty($_POST['password'])) {
        $errors[] = 'Please provide the password.';
    } /* Here other password validations using elseif statement. */

    // Get the posted data.
    $username = $_POST['username'];
    $password = $_POST['password'];

    if (!isset($errors)) {
        /*
         * Check the given credentials in the db. If the user doesn't exist, add an error:
         */
        // $errors[] = 'Wrong credentials. Please try again.';

        /*
         * ... else add only the user id - fetched from db - to session.
         * Don't add other user related details to session. If, in other pages, 
         * you want to use other user details, fetch them there using the user id.
         */
        if (!isset($errors)) {
            $_SESSION['userId'] = 43;

            // Redirect to the welcome page.
            header('Location: welcome.php');
            exit();
        }
    }
}
?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
        <meta charset="UTF-8" />
        <!-- The above 3 meta tags must come first in the head -->

        <title>Demo - Login</title>

        <style type="text/css">
            .form-control {
                margin-bottom: 10px;
            }

            label {
                display: inline-block;
                min-width: 80px;
            }

            .messages {
                margin-bottom: 20px;
            }

            .error {
                color: #c00;
            }

            button {
                padding: 5px 10px;
                background-color: #8daf15;
                color: #fff;
                border: none;
            }
        </style>
    </head>
    <body>

        <div class="messages">
            <?php
            if (isset($errors)) {
                foreach ($errors as $error) {
                    ?>
                    <div class="error">
                        <?php echo $error; ?>
                    </div>
                    <?php
                }
            }
            ?>
        </div>

        <form action="" method="post">
            <div class="form-control">
                <label for="username">Username:</label>
                <input type="text" id="username" name="username" value="<?php echo isset($username) ? $username : ''; ?>">
            </div>

            <div class="form-control">
                <label for="password">Password:</label>
                <input type="password" id="password" name="password" value="<?php echo isset($password) ? $password : ''; ?>">
            </div>

            <button type="submit" id="submit" name="submit">
                Login
            </button>
        </form>

    </body>
</html>