会话已设置,但在第一次转到另一个页面后无法正常工作
Session is set, but not working after going to another page just at first time
我有一个 login.php 和一些用户区页面。登录后,它可以运行并转到 user.php,我使用一些 $_SESSION
变量来显示名称和用户名。它有效,我的 $_SESSION
变量也是第一次设置,它将保留在 user.php.
但是当我转到用户区的另一个页面时,它返回到 login.php,但是如果我再次登录,那么就没问题了,我可以毫无问题地转到不同的页面。为什么?
我试过这些东西:
我将 $_SESSION['log_in']
从布尔值更改为字符串,或者使用另一个会话,如 $_SESSION['username']
用于 !isset($_SESSION['username'])
(每页顶部)。此用户名会话将显示在 user.php 但之后我转到另一个页面不起作用。
我在每个页面的顶部都有 session_start()
。
<?php
session_start();
if(!isset($_SESSION['log_in'])){
header("Location: login.php");
}
// I have this code top of every page.
?>
这是login.php:
<?php
session_start();
if(isset($_SESSION['log_in'])){
header("Location:user.php");
}
if( password_verify($_POST['password'],$user['password'])) {
$_SESSION['name'] = $user['name'];
$_SESSION['email'] = $user['email'];
$_SESSION['username'] = $user['username'];
//to know is user login or not
$_SESSION['log_in'] = TRUE;
echo "<meta http-equiv=Refresh content=2;url=user.php>";
//if I user header("Location: user.php") it doesn't go to user, but with meta it goes to user.php
?>
这是user.php:
<?php
session_start();
if(!isset($_SESSION['log_in'])){
header("Location: login.php");
}
// this is top of my user.php and top of another pages too.
?>
这是注销:
<?php
session_start();
if(isset($_SESSION['log_in'])) {
session_unset();
session_destroy();
header('location: login.php');
} else {
session_unset();
session_destroy();
header('location: http://www.mywebsite.com');
}
// this is my logout.php
?>
我没有收到任何错误,我也有另一个会话部分供管理员使用,但我写了完全不同的会话,例如 $_SESSION['admin_log_in']
它只有一页而且效果很好。
我刚发现问题 - 这是一个非常棘手的调试问题。
这是您的代码片段之一,多了一行代码 - exit
:
<?php
session_start();
if(!isset($_SESSION['log_in'])){
header("Location: login.php");
exit();
}
// this is top of my user.php and top of another pages too.
?>
那么,这里发生了什么?
header()
调用 queues 一个 HTTP header 发送到浏览器 - 它可以立即发送,也可以发送一次 HTML 输入由您的程序发出(因为您没有明确刷新此信息,我们不知道它何时发送)。
需要注意的重要一点是,当您调用 header()
时,您的 PHP 脚本 会继续执行 。你没有告诉它停止。所以,它会做一堆你没想到的事情。
在某些时候,浏览器将收到 Location
header,并终止连接,在大多数网络服务器配置中,PHP 将停止执行,因为您的网络服务器控制着 PHP 解释器。因此,在浏览器终止连接和脚本结束之间存在竞争条件;脚本中执行的内容可能会因一个 运行 而异。这将部分取决于网络延迟 - 较慢的网络连接将允许脚本在终止之前走得更远。
确保在 header 调用后立即停止脚本,或者至少有意且优雅地退出,将解决此问题。
(代题作者发表).
我应该打开我的网站 "www."。
我有一个 login.php 和一些用户区页面。登录后,它可以运行并转到 user.php,我使用一些 $_SESSION
变量来显示名称和用户名。它有效,我的 $_SESSION
变量也是第一次设置,它将保留在 user.php.
但是当我转到用户区的另一个页面时,它返回到 login.php,但是如果我再次登录,那么就没问题了,我可以毫无问题地转到不同的页面。为什么?
我试过这些东西:
我将 $_SESSION['log_in']
从布尔值更改为字符串,或者使用另一个会话,如 $_SESSION['username']
用于 !isset($_SESSION['username'])
(每页顶部)。此用户名会话将显示在 user.php 但之后我转到另一个页面不起作用。
我在每个页面的顶部都有 session_start()
。
<?php
session_start();
if(!isset($_SESSION['log_in'])){
header("Location: login.php");
}
// I have this code top of every page.
?>
这是login.php:
<?php
session_start();
if(isset($_SESSION['log_in'])){
header("Location:user.php");
}
if( password_verify($_POST['password'],$user['password'])) {
$_SESSION['name'] = $user['name'];
$_SESSION['email'] = $user['email'];
$_SESSION['username'] = $user['username'];
//to know is user login or not
$_SESSION['log_in'] = TRUE;
echo "<meta http-equiv=Refresh content=2;url=user.php>";
//if I user header("Location: user.php") it doesn't go to user, but with meta it goes to user.php
?>
这是user.php:
<?php
session_start();
if(!isset($_SESSION['log_in'])){
header("Location: login.php");
}
// this is top of my user.php and top of another pages too.
?>
这是注销:
<?php
session_start();
if(isset($_SESSION['log_in'])) {
session_unset();
session_destroy();
header('location: login.php');
} else {
session_unset();
session_destroy();
header('location: http://www.mywebsite.com');
}
// this is my logout.php
?>
我没有收到任何错误,我也有另一个会话部分供管理员使用,但我写了完全不同的会话,例如 $_SESSION['admin_log_in']
它只有一页而且效果很好。
我刚发现问题 - 这是一个非常棘手的调试问题。
这是您的代码片段之一,多了一行代码 - exit
:
<?php
session_start();
if(!isset($_SESSION['log_in'])){
header("Location: login.php");
exit();
}
// this is top of my user.php and top of another pages too.
?>
那么,这里发生了什么?
header()
调用 queues 一个 HTTP header 发送到浏览器 - 它可以立即发送,也可以发送一次 HTML 输入由您的程序发出(因为您没有明确刷新此信息,我们不知道它何时发送)。
需要注意的重要一点是,当您调用 header()
时,您的 PHP 脚本 会继续执行 。你没有告诉它停止。所以,它会做一堆你没想到的事情。
在某些时候,浏览器将收到 Location
header,并终止连接,在大多数网络服务器配置中,PHP 将停止执行,因为您的网络服务器控制着 PHP 解释器。因此,在浏览器终止连接和脚本结束之间存在竞争条件;脚本中执行的内容可能会因一个 运行 而异。这将部分取决于网络延迟 - 较慢的网络连接将允许脚本在终止之前走得更远。
确保在 header 调用后立即停止脚本,或者至少有意且优雅地退出,将解决此问题。
(代题作者发表).
我应该打开我的网站 "www."。