可能重复:
PHP Can't read cookies?
我正在添加一个登录并记住我的功能到我的网页。我正在使用$ _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>
答案 0 :(得分:3)
我不知道是不是你的情况,但是setcookie
必须在任何输出到浏览器之前(包括echo
和&lt;?php ...?&gt;之外的HTML代码) 。确保在它们之前没有输出任何内容。这是因为HTTP标头必须位于响应主体之前。您发布的页面似乎不完整(它只是一个div)所以我看不出是否是这种情况,但可能您正在发送HTML&lt; head&gt;在PHP代码之前。
此外,正如佩特拉所说,$_COOKIE
已加载到页面请求中,因此设置了setcookie
的新Cookie尚未存储在其中,但它们仅在下一页请求时才会存在。< / p>