Php 变量仅在echo之后可用

Php 变量仅在echo之后可用,php,Php,我对今晚的经历完全感到困惑。我花了一个小时试着调试这个,但什么也没去。我希望我只是忽略了一些简单的事情 问题是,我们获取一个id并将其存储到变量($event),然后启动会话并将$event加载到会话数组中。所发生的情况是,如果我们不向浏览器窗口回显任何文本,则不会在会话中设置变量。如果我们将任何内容回显到浏览器,则该变量被正确引用。我已经对$event进行了var_转储,它正确地存储为长度为X的字符串,其中X是ID的长度 以下是相关代码: $event = $this->Event_mo

我对今晚的经历完全感到困惑。我花了一个小时试着调试这个,但什么也没去。我希望我只是忽略了一些简单的事情

问题是,我们获取一个id并将其存储到变量($event),然后启动会话并将$event加载到会话数组中。所发生的情况是,如果我们不向浏览器窗口回显任何文本,则不会在会话中设置变量。如果我们将任何内容回显到浏览器,则该变量被正确引用。我已经对$event进行了var_转储,它正确地存储为长度为X的字符串,其中X是ID的长度

以下是相关代码:

$event = $this->Event_model->get_event_id_with_form_id($batch->event_id); // This call successfully returns "100"
session_start();
$_SESSION['ckfinder'] = array ();
$_SESSION['ckfinder']['enabled'] = true;
$_SESSION['ckfinder']['uploadURL'] = '/assets/event_uploads/' . $event . '/';

echo $_SESSION['ckfinder']['uploadURL']; // Returns "/assets/event_uploads//"
然而,var_dump($event)返回字符串(3)“100”,所以我们知道$event存在

更奇怪的是,如果我们显式地将$event设置为“100”,那么echo调用将返回“/assets/event_uploads/100/”

更奇怪的是,如果我保持上面的代码不变(调用$this->Event_model),但在会话开始后添加一个echo(即echo'a'),那么echo调用将再次返回正确的路径

我不清楚为什么会发生这种情况。我从未在PHP中遇到过这样的问题,不过这可能是由于我睡眠不足造成的。

尝试调用

session_write_close()

设置所有变量后。

如果将
session_start()放入在页面顶部?仍然不好(尽管我还没有尝试过)。除了加载视图之外,我发布的代码块是该页面的全部代码。但不幸的是,正在移动会话_start();要高于$event=。。。。线路没有解决问题。嗯,这个呢<代码>$\u会话['ckfinder']['uploadURL']='/assets/event\u uploads/'$这个->事件模型->获取带有表单id的事件id($batch->事件id)。“/”这肯定不是一个解决方案,但我现在很好奇……我不知道异步PHP是如何工作的。但是类Event_模型是否可能以异步方式获取数据呢?我刚刚意识到这可能是ckfinder本身的问题。当我打印r($会话)时,我看到uploadURL键已正确设置,然后,神奇的是,ckfinder开始工作。但是如果我没有打印或以其他方式向屏幕输出任何内容,ckfinder将无法工作(或者说,没有正确设置路径)。我可能需要修改我关于ckfinder的问题,因为这毕竟可能不是一个PHP问题。所以如果你的脚本向你的浏览器发送一个标题,它似乎就可以工作了。(如果您回显某个发送的http头)这可能是因为您的会话数据将保存在cookie中,并且浏览器仅通过从服务器发送的http头接收cookie数据。这只是个想法,不知道是不是真的;)但是,在设置会话变量后,我们确实会将信息发送到浏览器。我们在框架中加载一个视图,该视图将页面输出发送到浏览器。这就是为什么这是如此令人困惑。如果我们在控制器中输出一些东西,一切都会正常工作。但是,如果我们只从视图(而不是控制器)输出某个变量,那么该变量永远不会传递给会话……好吧,这很奇怪,所以会话似乎设置正确。也许$event有一个奇怪的对象引用?您是否尝试过:
$\u会话['ckfinder']['uploadURL']='/assets/event\u uploads/'。(字符串)$event.'/'var_dump($event)显示它已经是一个普通字符串了,但我继续尝试将它键入(string)。还是不走运。这很奇怪,因为每次会话都设置正确。只是$event只有在我们将输出发送到屏幕时才会被存储。真正奇怪的是,如果我手动将$event设置为“100”,它在会话中的设置是正确的。。。也许可以尝试这样的方法,
$event=$this->event\u model->get\u event\u id\u with\u form\u id($batch->event\u id)$event=sprintf($event)
但这只是想法,不是确定的解决方案:D