0

可能重复:
PHP 无法读取 cookie?

我正在向我的网页添加登录并记住我功能。我正在使用 $_SESSION 变量和 $_COOKIE 变量,但我无法使用 setcookie() 设置 cookie。我通过 www.phpcodechecker.com 运行了代码,没有发现任何错误。我的浏览器(Chrome 和 IE)设置为接受 cookie。无论我做什么,这些 cookie 都不会设置。有人可以帮我吗?

<?php

$page_title = 'Log In';
$css_link = 'login.css';
require_once('includes/db_connection.php');
require_once('includes/header.php');
require_once('includes/navlinks.php');



// Start the session
  require_once('includes/startsession.php');

  // Clear the error message
  $error = '';

  // If the user isn't logged in, try to log them in
  if (!isset($_SESSION['beecharmer_user_id'])) {
    if (isset($_POST['submit'])) {
      // Connect to the database
      $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
  // Grab the user-entered log-in data
  $username = mysqli_real_escape_string($dbc, trim($_POST['username']));
  $password = mysqli_real_escape_string($dbc, trim($_POST['password']));

  if (!empty($username) && !empty($password)) {
    // Look up the username and password in the database
    $query = "SELECT salt FROM beecharmer_user WHERE username = '$username'";
    $data = mysqli_query($dbc, $query);
    $row = mysqli_fetch_array($data);
    $password_salt = hash("sha512", $password.$row['salt']);
    $query = "SELECT user_id, username, access_level FROM beecharmer_user WHERE username = '$username' AND password = '$password_salt'";
    $data = mysqli_query($dbc, $query);

    if (mysqli_num_rows($data) == 1) {
      // The log-in is OK so set the user ID and username session vars (and cookies), and redirect to the home page
      $row = mysqli_fetch_array($data);
      $_SESSION['beecharmer_user_id'] = $row['user_id'];
      $_SESSION['beecharmer_username'] = $row['username'];
      $_SESSION['beecharmer_access_level'] = $row['access_level'];
      setcookie('beecharmer_user_id', $row['user_id'], time() + 525960);    // expires in 365.25 days
      setcookie('beecharmer_username', $row['username'], time() + 525960);  // expires in 365.25 days
      setcookie('beecharmer_access_level', $row['access_level'], time() + 525960);  // expires in 365.25 days

      // The next 4 lins just show what vars are set and what vars are not set.
      // They serve no other purpose.
      echo ('These are cookies '.$_COOKIE['beecharmer_user_id'].' '.$_COOKIE['beecharmer_username'].' '.$_COOKIE['beecharmer_access_level'].'<br/>');
      echo ('these are session vars '.$_SESSION['beecharmer_user_id'].' '.$_SESSION['beecharmer_username'].' '.$_SESSION['beecharmer_access_level'].'<br/>');
      echo ('These are query vars '.$row['user_id'].' '.$row['username'].' '.$row['access_level']);
      echo ($row['user_id'].' '.$row['username'].' '.$row['access_level']);

      $home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/index.php';
      //header('Location: ' . $home_url);
    }
    else {
      // The username/password are incorrect so set an error message
      $error = 'Sorry, you must enter a valid username and password to log in.';
    }
  }
  else {
    // The username/password weren't entered so set an error message
    $error_msg = 'Sorry, you must enter your username and password to log in.';
  }
}


 }  
?>

<div class= "info">
<?php
    // If the session var is empty, show any error message and the log-in form; otherwise confirm the log-in
    if (empty($_SESSION['beecharmer_user_id'])) {
        echo '<p class="error">' . $error . '</p>';
    }else {
        // Confirm the successful log-in
        echo('<p class="login">You are logged in as ' . $_SESSION['beecharmer_username'] . '.</p>');
    }
?>
  <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <fieldset>
      <legend>Log In</legend>
      <label for="username">Username:</label>
      <input type="text" name="username" value="<?php if (!empty($username)) echo $username; ?>" /><br />
      <label for="password">Password:</label>
      <input type="password" name="password" />
    </fieldset>
    <input type="submit" value="Log In" name="submit" />
  </form>
  <?php //if (isset($_SESSION['beecharmer_user_id'])) echo $_COOKIE['beecharmer_username'].' '.$_COOKIE['beecharmer_access_level']; ?>
</div>  
4

1 回答 1

3

我不知道是不是你的情况,但setcookie必须在任何输出到浏览器之前出现(包括echo<?php ... ?> 之外的 HTML 代码)。确保你没有在他们之前输出任何东西。这是因为 HTTP 标头必须位于响应正文之前。您发布的页面似乎并不完整(它只是一个 div),所以我看不出是不是这种情况,但您可能在 PHP 代码之前发送了 HTML <head>。

此外,正如 Petra 所说,$_COOKIE在页面请求时加载,因此设置的新 cookiesetcookie尚未存储在其中,但它们仅在下一页请求时到达那里。

于 2012-08-12T22:33:11.887 回答