我正在创建一个非常简单的基于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";,tryd(isset($_SESSION)
)并返回true。。。所以我不知道我做错了什么。。。
编辑:对不起,伙计们,我想我可能找到了罪魁祸首。。。对我来说,这是一个逻辑错误。。。当用户级别未被授权使用当前页面时,我有这个条件来检查我创建的每个php页面以销毁会话。我的坏。。非常感谢你们的帮助!!
确保session_start()
在所有页面上:
session_start()基于通过GET或POST请求传递的会话标识符或通过cookie传递的会话标识创建会话或恢复当前会话。
参见PHP手册参考
要控制$_SESSION的内容,请尝试在所有iframe页面中放入以下代码:
<?php
session_start();
echo '<pre>';
var_dump($_SESSION);
echo '</pre>';
您在iframe和main.php的页面顶部都使用了session_start()吗?您还需要将session_start()放在iframe的顶部。
这可能会解决您的问题:php会话&iframe
此外:如果你使用iframe来显示你的webiste的大部分内容,那么没有什么是简单的。您可能需要考虑不使用它们。
我在一个PHP网页上使用多个iframe时遇到了同样的问题。
在我的例子中,当使用http://example.com.如果您与域路径不一致,您可能会遇到会话问题,因为从技术上讲,来自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默认情况下会为每个域/子域设置一个新会话。希望这能有所帮助!