PHP会话问题

时间:2010-08-31 15:10:19

标签: php

如果我的标题页顶部有session_start();,是否可以在标题页前添加$page_title

$page_title = 'Some Title';
include ('../includes/header.php');

3 个答案:

答案 0 :(得分:4)

是。只要你没有在它之前输出任何东西,你应该没事......

原因是session_start发送了一些HTTP标头。因此,如果您已经输出任何内容(包括错误),它将会失败,因此无法启动。

解决这个问题的方法是在文件顶部设置输出缓冲。只需在页面顶部显示ob_start();即可。这样,无论发生什么(在合理范围内),你应该没问题(因为在任何输出中都会被缓冲区“捕获”,因此不会干扰会话comamnd)......

编辑:根据要求,举例:

<?php
echo 'foo';
include '../includes/header.php';

因为你输出了一些内容所以不会有效......

<?php
include 'non/existant/file.php';
include '../includes/header.php';

不会有效,因为第一个include语句会发出警告,因为它无法找到该文件...

FooBar<?php
include '../includes/header.php';

由于您手头输出了某些内容(<?php行之前的文字),因此无效...

<?php
ob_start();
echo 'foo';
include '../includes/header.php';

将起作用,因为输出被缓冲区捕获......

FooBar<?php
ob_start();
include '../includes/header.php';

会工作,因为输出启动后启动输出缓冲区...

<?php
include 'some/valid/file.php';
include '../includes/header.php';

可能或可能不起作用。这取决于第一个包含的文件输出任何内容。如果确实如此,那么它将不起作用(所以事先投入ob_start()以确保其有效)...

哦,您可能希望将include更改为require,因为如果找不到该文件您不想继续...

答案 1 :(得分:1)

session_start();需要在浏览器有任何实际输出之前出现。通常人们只是为了避免混淆等而将其置于其他任何地方之上,但在这种特殊情况下,由于不输出变量赋值,你会没事的。

答案 2 :(得分:0)

在开始会话之前,您无法向浏览器输出任何内容。

E.g。你不能这样做

echo "This will break";
session_start();

这是因为会话是在页眉中设置的,并且通过使用echo / print或类似方法,您在发送页眉之前强制输出,从而破坏了正确启动会话的能力。