PHP会话开始是全局的


PHP session start is global

我对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。然而,当我把这个页面显示给我的朋友时,他也有这个消息,没有登录框。如何为每个用户存储不同的会话?

session_start()需要在每个页面的顶部调用。否则使用using $_SESSION变量将导致未定义的行为。

会话是每个用户存储的,所以您可能会遇到另一个问题,例如没有在每个页面上调用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 ...

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

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