PHP会话启动是全局的

时间:2011-09-21 02:30:53

标签: php session

我是PHP的新手,我想通过MySQL创建一个用户登录系统。现在我正在进行登录过程。我有一个接受用户名的表单,操作是这个PHP脚本:

<?php
session_start();
$_SESSION['username'] = $_POST['username'];
$_SESSION['password'] = $_POST['password'];
?>

然后,主页面有:

<?php
if(isset($_SESSION['username']))
    echo 'TESTESTEST';
else {
echo '<form action="/login.php" method = "post">';
    echo 'Username: <input type="text" name="username" method="post"/>';
    echo 'Password: <input type="password" name="password" method="post"/>';
    echo '<input type="submit" value="Submit" method="post" />';
echo '</form>';
}
?>

基本上,如果会话是从之前设置的,它将不会显示用户名/密码框,而是显示一条说明TESTESTEST的消息。但是,当我向朋友展示此页面时,他也有此消息而没有登录框。如何制作,以便为每个用户存储不同的会话?

3 个答案:

答案 0 :(得分:4)

需要在每个页面的顶部调用

session_start()。否则,使用$_SESSION变量将导致未定义的行为。正如你所注意到的那样。

答案 1 :(得分:2)

会话按用户存储,因此您可能会遇到其他问题,例如不在每个页面上调用session_start()。让我概述一个解决这个问题的更好方法。

下面介绍了许多良好的编码实践。 isset()调用可防止发出E_STRICT警告。登录页面将发布到自己,直到用户正确,然后重定向到下一页。任何其他页面都将检查经过身份验证的会话,如果找不到,请重定向回登录页面并显示错误消息。

如下所述,此代码的部分内容应放在每个页面上包含的全局包含文件中。

祝你好运。

登录页面:/Login.php

<?php
session_start();

$username = trim(isset($_POST['username']) ? $_POST['username'] : '') 
$password = trim(isset($_POST['password']) ? $_POST['password'] : '') 
$error = trim(isset($_GET['error']) ? $_GET['error'] : '');

if(! empty($username) || ! empty($password))
{
    // Authenticate if any username or password was submitted
    // Ideally via query against MySQL
    if($username == 'bob' && $password == 'bobpass')
    {
        $_SESSION['Authenticated'] = true;
        $_SESSION['Expires'] = time() + 3600; // good for one hour
        $_SESSION['username'] = $username;

        // Now, redirect to login page
        header('Location: /user/home.php');
        exit();
    }
    else
    {
        // Oops, bad username/password...
        $error = 'Invalid username and/or password';
    }
}
?>
<!DOCTYPE html>
<html>
  <head>
    <title>Login Page</title>
  </head>
  <body>
    <?php if($error) { ?>
       <div style="color: red;">
         <?php htmlspecialchars($error); ?>
       </div>
    <? } ?>
    <form name="F" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES); ?>" >
      Username: <input type="text" name="username" value="<?php echo htmlspecialchars($username, ENT_QUOTES); ?>" />
      Password: <input type="password" name="password" />
      <input type="submit" value="Login" />
    </form>
  </body>
</html>

任何其他网页,需要此代码才能保护它...例如:/user/home.php

<?php
session_start();

// Following code checks for authenticated session, and either redirects back to 
// login page, or allows user in.  This should be put in a function and placed 
// in a common include file.
if(isset($_SESSION['Authenticated']) && $_SESSION['Authenticated'])
{
    //Ok, user was authenticated... Now, check expire time
    if($_SESSION['Expires'] < time())
    {
        header('Location: /Login.php?error=Session+Expired');
        exit;
    }

    // All still OK?  Bump up the session expire time to one hour from now...
    $_SESSION['Expires'] = time() + 3600; // good for one hour
}
... rest of page here ...

答案 2 :(得分:0)

您必须在访问$ _SESSION的每个页面上调用session_start()。它将恢复访问该站点的用户的最后一个会话。在致电session_destroy()

之前,不会替换该用户的数据