为什么我的SESSION数组在一页上可以,但在另一页上可以为空?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我的SESSION数组在一页上可以,但在另一页上可以为空?相关的知识,希望对你有一定的参考价值。

我有一个设置各种会话变量的类。设置会话变量后,我将进行SESSION的var转储并获取所有输出。到目前为止一切都很好。然后,我导航到另一个页面。

session_start(); // i call this right after opening the php tag
var_dump($_SESSION); // i call this after setting the variables

这次是空的吗?

设置我的会话

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
    
           $_SESSION['atid'] = $row['autotaskid'];
           $_SESSION['bmsid'] = $row['bmsid'];
           $_SESSION['shavlikid'] = $row['shavlikid'];
           $_SESSION['cpid'] = $row['cpid'];
    

试图在另一页上使用变量

$autotaskid = $_SESSION['atid'];
    $tsql = "SELECT COUNT(tblBackupArchive.StatusID) AS total, tblBackupArchive.StatusID ".
            "FROM tblBackupArchive INNER JOIN ".
            "tblBackup ON tblBackupArchive.BackupID = tblBackup.BackupID ".
            "GROUP BY tblBackupArchive.StatusID, tblBackup.ClientID ".
            "HAVING (tblBackup.ClientID = " . $autotaskid . ")";    

结果在

Undefined index: atid in C:\Program File...

我已经确定要发布start_session();函数在使用它们的每个页面上运行任何其他代码之前。

另一个重要点:php页面,该页面调用在iframe中设置变量的方法。当我在新标签页/窗口中打开页面时,它可以正确设置会话。几乎就像主窗口中有会话变量一样,然后每个iframe都将其单独保存。

有什么想法吗?

比利

答案

有什么想法吗?

是。您必须学习调试代码。如您所见,您的问题无法凭空猜测。因此,该进行手动操作了。

  • 首先请确保您可以看到发生的任何错误。只需添加一个故意的,看看。如果没有看到错误,则必须将其打开。
  • 然后制作一个测试脚本,以查看您的会话是否正常工作

    <? 
    session_start(); 
    if (!isset($_SESSION['counter'])) $_SESSION['counter']=0;
    echo "Refreshed ".$_SESSION['counter']++." times.<br>
    <a href=".$_SERVER['PHP_SELF'].'?'.session_name().'='.session_id().">refresh</a>"; 
    ?>
    

如果可行,请使其使用Cookie

<? 
session_start(); 
if (!isset($_SESSION['counter'])) $_SESSION['counter']=0;
echo "Refreshed ".$_SESSION['counter']++." times.<br>
<a href=".$_SERVER['PHP_SELF'].">refresh</a>"; 
?>

如果也可行,则必须检查代码。打印出变量,减少代码,等等

另一答案

尝试比较会话ID。如果您在通话中获得了不同的会话ID,则说明会话管理设置不正确。

即您的代码可能依赖于存储在cookie中的会话ID,但是该选项被禁用(请参见php.ini)。

作为调试措施,您可以使用“透明会话ID”(它们连接到任何链接),但不能用于生产代码。

另一答案

基于您的第一个代码块,听起来您可能正在调用session_start() after,而您试图设置$_SESSION变量。您必须先致电session_start()!我可能是错的,在这种情况下,我表示歉意。但是根据上面的代码片段,很可能是您的问题!

另一答案

如果您要呼叫session_close(),那么您是否不小心破坏了会话?也许有太多session_destroy()呼叫?

我说的太少了。

另一答案

请确保:

  1. 您在设置或获取会话变量之前执行session_start()。 (如果服务器配置为自动启动会话,则没有必要。)
  2. 两个脚本都位于同一(子)域上。 (页面位于同一服务器上不足以共享会话是足够的,它们还必须属于相同的(子)域。)
另一答案
I was facing the same problem. One impotent thin that session must be defined as first line of the code...even no single line space from top. Second the session variable must be defined at global level first. Normally arrays are fetched with in a loops from mysql data. And loop variables are not available at global level. So it must be defined at global level. It solved my problem.

<?PHP
    session_start();
    $items = array();
    $_SESSION['item'] = $items;
?>

现在就做你想做的事...

以上是关于为什么我的SESSION数组在一页上可以,但在另一页上可以为空?的主要内容,如果未能解决你的问题,请参考以下文章

text 在另一页上添加平滑滚动(平滑滚动)

数据方法中的数组在一种方法中得到更新,但在另一种方法中仍然为空

LaTeX为啥摘要会跑到另一页上

如何在一页上放置多个画布js动画。 (创建js)

张贴在铁轨上的红宝石的另一页上

轮播控制按钮仅在一页上有效