【问题标题】:php session variable multidimensional associative array issuephp会话变量多维关联数组问题
【发布时间】:2012-05-19 10:01:53
【问题描述】:

我环顾四周,但找不到对我的 $_SESSION 变量中发生的事情的解释。

@ob_start();
$k=@ob_get_contents();
@ob_end_clean();
@session_start();
unset($s,$m);
$m1 = explode(" ", microtime());
$stime = $m1[1] + $m1[0];
echo $k;

$_SESSION['resendConfirmation']['function'] = 'resend';
$_SESSION['resendConfirmation']['id'] = '8';                

print_r($_SESSION);

输出:

Array ( [resendConfirmation] => 8esend ) 

为什么要替换字符串?我以前从来没有遇到过这个问题。

我想要的是这样的:

Array([resendConfirmation] => Array(
                             [id] =>8
                             [function} => resend
                             )
)

我从来没有遇到过这种情况,我完全糊涂了!

更新 作为对@DanRedux 的回应,我已更改为两个不存在的变量名称以将引用从等式中取出,仍然是相同的结果...

$_SESSION['resendConfirmation']['tweak'] = 'resend';
$_SESSION['resendConfirmation']['tweak2'] = '8';

同样的结果:(

resendConfirmation 进行了全站查询,但没有找到,但一旦我更改了该数组名称,一切正常,令人困惑,但已修复...

$_SESSION['reConfirm']['function'] = 'resend';
$_SESSION['reConfirm']['id'] = '8';             

print_r($_SESSION);

【问题讨论】:

  • 请修正您的代码的第一行,使其可读。
  • 实际上不需要第一行。然而,这是一个非常奇怪但很酷的问题..$_SESSION['resentConfirmation']['id'] 在某种程度上指的是第一个索引,这就是第一个字符发生变化的原因,那么为什么 ['id'] 会引用 [0].. 也许你设置了它在某些时候通过引用?
  • 不要滥用@,它会抑制您可能关心的警告,并且会对性能造成很大影响。如果您正确检查输入,则代码中的任何功能都不应出现异常。有一些例外情况,@ 很有用,但即便如此它也很可疑。
  • PHP 5.3.8 返回Array ( [resendConfirmation] => Array ( [function] => resend [id] => 8 ) )
  • 整个项目都使用了会话初始化(前 8 行)。我在其他任何地方都没有这个问题...

标签: php multidimensional-array session-variables associative-array


【解决方案1】:

因为我真的不知道代码在你给我们的这个块之外还有什么其他类型的恶作剧,所以我会说只是试试这个:

$_SESSION['resendConfirmation'] = array('id' => 8, 'function' => 'resend');

如果这也失败了,那么除了您发布的内容之外,肯定还有其他事情发生。祝你好运!

【讨论】:

  • 不确定发生了什么,但肯定在某处引用了 resendConfirmation。重命名,一切正常。
【解决方案2】:

您认为的多维数组实际上并非如此。真正发生的是:

你认为的数组实际上是一个字符串。之后,您尝试将字符串作为数组访问。您正在尝试访问不存在的元素 id。 PHP 总是试图变得比它应该的更聪明,只是说:好的,我假设你的意思是第一个索引。所以基本上发生的事情是:

<?php
$notAnArray = 'somestring';
$notAnArray['id'] = '8'; 

var_dump($notAnArray); // 8omestring

这就是你在开发机器上should always enable error_reporting 的原因:

error_reporting(E_ALL | E_STRICT);
ini_set("display_errors", 1);

并且从不使用@ 抑制错误。在某些情况下您可以使用@,但这确实不是其中之一。

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多