我正在为仓库创建一个非常简单的基于PHP的程序,但后端流程相当复杂。
我的登录页面指向第一次设置session_name
的授权页面,session_start()
并设置会话变量。
在授权页面之后,它进入main.php页面,该页面是一个左侧的表格,用于菜单(链接),我也做了session_name()
< - 与一个名称相同的名称从(1)创建,并开始会话。
在主页面的右侧是用户点击左侧链接时显示页面的iframe。我也做了session_name()
< - 与从(1)创建的名称相同的名称,然后开始会话。
main.php没问题,它完全读取会话变量,但是iframe无法获取会话变量(我尝试print_r($_SESSION)
,并且空了)。我试过var_dump(session_name("abc"))
,其中“abc”是我在(1)中使用的会话名称,它确实显示“abc”,尝试过(isset($_SESSION)
)并返回true ...所以我不知道我知道我做错了什么......
编辑: 对不起伙计们,我想我可能已经找到了罪魁祸首...这是我身边的一个逻辑错误...我有这个条件来检查我创建的每个php页面在用户级别未被授权使用时销毁会话这个当前页面。我的坏...非常感谢你的帮助!
答案 0 :(得分:3)
确保所有网页上都有session_start()
:
session_start()根据通过GET或POST请求传递的会话标识符创建会话或恢复当前会话,或通过cookie传递。
要控制$ _SESSION的内容,请尝试将所有ifreame页面放入代码:
<?php
session_start();
echo '<pre>';
var_dump($_SESSION);
echo '</pre>';
答案 1 :(得分:0)
您是否在iframe和main.php的页面顶部都使用了session_start()? 您还需要将session_start()放在iframe的顶部。
答案 2 :(得分:0)
这可能会解决您的问题:php session & iframe
此外:如果您使用iframe来显示网站的大部分内容,那么没有什么比这更简单了。您可能想要考虑不使用它们。
答案 3 :(得分:0)
我的一个PHP网页上有多个iframe存在同样的问题。
在我的例子中,当使用http://example.com加载页面时,正在向www.example.com发出一些对PHP端点的AJAX调用。如果您与域路径不一致,则可能会遇到会话问题,因为来自www.example.com的请求在技术上来自子域,而不是直接来自http://example.com。通过在JavaScript中进行AJAX调用时始终使用基于PHP的API的相对路径,可以完全避免此问题。
我通过在Chrome中检查我的Cookie找到了这种情况。我注意到两个不同的cookie,其中包含不同的PHP会话ID。一个是为www.example.com设置的,另一个是为example.com设置的
正如其他一些答案中所述,您始终可以使用以下内容将会话Cookie域设置为与您的主站点一起在所有子域中运行:
ini_set("session.cookie_domain", ".domain.com");
默认情况下,PHP会为每个域/子域设置一个新会话。希望这有帮助!