为什么我的SESSION数组在一个页面上可以正常但在另一个页面上为空?

时间:2010-10-04 16:17:43

标签: php session-variables

我有一个设置各种会话变量的类。在设置会话变量后,我执行了一个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保持独立。

有什么想法吗?

比利

6 个答案:

答案 0 :(得分:6)

  

有什么想法吗?

是。您必须学会调试代码 正如您所看到的,您的问题无法通过猜测来回答。所以,现在是手工的时候了。

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

    <? 
    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>"; 
    ?>
    

如果有效,请使用cookies

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

如果它也有效,你必须检查你的代码 打印变量,减少代码等

答案 1 :(得分:2)

尝试比较会话ID。如果在调用中获得不同的会话ID,则会话管理未正确设置。

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

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

答案 2 :(得分:1)

根据您的第一个代码块,听起来您可能在尝试设置session_start()变量之后调用$_SESSION 。您必须先致电session_start()!我错了,在这种情况下我道歉。但基于上面的代码片段,它可能是你的问题!

答案 3 :(得分:0)

如果你打算session_close()你应该去哪里,那么你是不是意外地破坏了会话?也许有几个session_destroy()来电太多了?

有一些太多,我指的是一个。

答案 4 :(得分:0)

确保:

  1. 在设置或获取会话变量之前执行session_start()。 (如果服务器配置为自动启动会话,则不需要这样做。)
  2. 两个脚本都位于同一个(子)域中。 (页面在同一台服务器上共享会话是不够的,它们也必须属于同一个(子)域。)

答案 5 :(得分:0)

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;
?>

现在就做你想做的...