【问题标题】:a stupid 'important' question about php $_SESSION array关于 php $_SESSION 数组的一个愚蠢的“重要”问题
【发布时间】:2011-06-16 19:07:18
【问题描述】:

我有 2 个文件在 $_SESSION 数组中放置了一些东西。 文件1.php

<?php
session_start();

$_SESSION[] = 'Hi';

echo '<pre>';
print_r($_SESSION);
echo '</pre>';

打印出来的

Array
(
    [0] => Hi
)

还有和file1类似的file2.php

<?php
session_start();

$_SESSION[] = 'There!';

echo '<pre>';
print_r($_SESSION);
echo '</pre>';

我想先转到file1,然后再转到file2。 在 file2 中打印 $_SESSION 应该会输出

Array
(
    [0] => Hi
    [1] => There!
)

我错了吗?

我不得不提到我收到通知:Unknown 在第 0 行的 Unknown 中跳过数字键 0。 并且我的 php.ini 中的 register_globals 设置为 Off。

正如我在 cmets 中看到的,对于你们中的某个人,file2 打印了一个包含 2 个项目的数组,而对于其他人(比如我)来说,“hi”项目会丢失。这似乎会发生,但对于 Marc B 而言,只有当我们使用数字作为会话数组的索引而不是字符串时才会发生这种情况。

对于 Marc B,会话的行为符合我的预期。你可以在这里发布你的 php.ini 吗?所以我可以把你的和我的比较一下吗?

【问题讨论】:

  • 最好的老师是经验。这是一个简单的问题,您可以尝试一下...
  • 好吧,我当然测试过了 :) 但是,当我进入 file2 时,只有 Array([0]=>There!)。我开始怀疑我使用这个数组的方式。通常,如果我定义一个数组 $a=array() 那么我可以通过执行 a[]=0;a[]='Hello'... 来添加项目,但它似乎与 $_SESSION 数组不一样。

标签: php arrays session


【解决方案1】:

您没有给$_SESSION 提供适当的密钥。

【讨论】:

    【解决方案2】:

    不,应该可以。事实上,如果你只是不断地重新加载 file1,你只会得到一系列的“Hi”、“Hi”、“Hi”等。数组条目。

    【讨论】:

    • 如果我重新加载 file1.php,我每次都会得到 Array([0] => Hi)。我想知道为什么
    • 0 将保持 Hi 直到会话丢失,查看 1,2,3 print_r($_SESSION)
    • 如果您得到的只是一个条目,那么您的会话不会跨请求保留。检查会话 cookie 是否在每个页面请求之间正常运行 server->you->server。如果您每次获得不同的会话 ID,那么它就是一个新的空白会话,这就解释了为什么只有一个“Hi”
    • 这正是我所经历的。系统上的会话文件是空白的。但我认为这不是它应该的方式。也许 php.ini 有问题?我用谷歌搜索了类似的东西,我发现了一些关于 register_globals 在我的环境中设置为 Off
    • register_globals 应始终关闭。这是一个可怕的想法,主要的安全漏洞,将在未来的 php 版本中删除。如果您的会话文件是空白的,那么您的 cookie 设置有问题,并且您每次都在创建一个新会话。
    【解决方案3】:

    你这样做有什么特别的原因吗

    $_SESSION[]='Hi' instead of $_SESSION["Greet"]='Hi'?
    

    我已经测试了您的代码。当我开始 file1.php 我有以下内容:

    Array
    (
        [0] => hi
    )
    

    带有以下通知:在第 0 行的 Unknown 中,未知跳过数字键 0 之后我继续 file2.php 我有以下内容:

    Array
    (
        [0] => there!
    )
    

    同样的通知。简单地回答你的问题你错了:)。 如果您将索引(分别为“greet”和“meet”)添加到会话变量,这将是第 1 页的输出:

    Array
    (
       [greet]=> hi      
    )
    

    当您继续使用 file2.php 时,您将拥有:

    Array
    (
      [greet] => hi
      [meet] => there!
    )
    

    【讨论】:

    • 这只是我做的一个例子,因为我得到了一个奇怪的会话行为
    【解决方案4】:

    文件1:

    <?php
    session_start();
    
    $_SESSION['0'] = 'Hi';
    
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';
    
    That prints 
    Array
    (
        [0] => Hi
    )
    

    file2.php 和 file1 类似,但会话索引不同

    <?php
    session_start();
    
    $_SESSION['1'] = 'There!';
    
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';
    
    Now this prints 
    Array
    (
        [0] => Hi
        [1] => There!
    )
    

    【讨论】:

    • 它不起作用 :( 似乎如果我使用诸如 0,1 甚至 '0'、'1' 之类的数字索引,则不会保留会话。而如果我使用像 ' 这样的索引zero','one' 事情似乎有效。有什么想法吗?
    【解决方案5】:

    $_SESSION 这样的超全局变量不是普通数组。您应该在$_SESSION 中存储一个数组,如下所示:

    文件 1:$_SESSION['foo'][] = 'Hi!';

    文件 2:$_SESSION['foo'][] = 'there';

    【讨论】:

    • 是的,它们与普通数组不同。我不知道...也许是因为我以更复杂的方式使用它(数组数组...)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2020-08-27
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多