警告:session_start()无法正常工作

时间:2014-04-23 08:59:36

标签: php session

好像我在下面的代码中遇到session_start问题:

错误: 警告:session_start()[function.session-start]:无法发送会话缓存限制器 - 已在/ usr /中发送的报头(在/usr/home/web.com/web/index.php:1处开始输出)第10行的home / web.com / web / index.php

代码:

<?php
if ( preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT']) )
{
header( 'Location: http://www.web.com/ie/index.php' ) ;
} 
?>
<?php
session_name("fancyform");
session_start();
$_SESSION['n1'] = rand(1,20);
$_SESSION['n2'] = rand(1,20);
$_SESSION['expect'] = $_SESSION['n1']+$_SESSION['n2'];
if(isset($_SESSION['sent']))
{
$success="<p>Gracias ".htmlspecialchars($_SESSION['name'])."! Estaremos en contacto en menos de 24h!</p>";
$css='<style type="text/css">.demo-form{display:none;}.thanks{display:block;}</style>';
unset($_SESSION['sent']);
}
?>
<?=isset($css)?$css:""?>

在另一个内部页面上工作,使用&#34;相同的&#34;代码,似乎错误没有显示(代码如下):

<?php
session_name("fancyform");
session_start();
$_SESSION['n1'] = rand(1,20);
$_SESSION['n2'] = rand(1,20);
$_SESSION['expect'] = $_SESSION['n1']+$_SESSION['n2'];
if(isset($_SESSION['sent']))
{
$success="<p>Gracias ".htmlspecialchars($_SESSION['name'])."! We'll be in touch asap!</p>";
$css='<style type="text/css">.demo-form{display:none;}.thanks{display:block;}</style>';

unset($_SESSION['sent']);
}
?>
<?=isset($css)?$css:""?>

因此,您可以在第二个示例中看到没有此部分的相同代码,但在第一个示例中删除它并不能解决问题:

   <?php
    if ( preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT']) )
    {
    header( 'Location: http://www.web.com/ie/index.php' ) ;
    } 
    ?>

提交表单时,会使用header('Location: index.php#5');重定向,但我必须保留此部分。

哪里可能是问题?也许我错过了什么?

更新后的代码和答案(仍未正常工作)

CODE:

<?php session_start(); if ( preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT']) ) { header( 'Location: http://www.web.com/ie/index.php' ) ; } session_name("fancyform"); ?>
<?php
$_SESSION['n1'] = rand(1,20);
$_SESSION['n2'] = rand(1,20);
$_SESSION['expect'] = $_SESSION['n1']+$_SESSION['n2'];
if(isset($_SESSION['sent']))
{
$success="<p>Gracias ".htmlspecialchars($_SESSION['name'])."! Estaremos en contacto en menos de 24h!</p>";
$css='<style type="text/css">.demo-form{display:none;}.thanks{display:block;}</style>';
unset($_SESSION['sent']);
}
?>
<?=isset($css)?$css:""?>

错误:

**<b>Warning</b>:  session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cookie - headers already sent by (output started at /usr/home/web.com/web/index.php:1) in <b>/usr/home/web.com/web/index.php</b> on line <b>1</b><br />
<br />
<b>Warning</b>:  session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cache limiter - headers already sent (output started at /usr/home/web.com/web/index.php:1) in <b>/usr/home/web.com/web/index.php</b> on line <b>1</b><br />**

最后编辑(已解决)

我刚拿了一个旧备份,好像现在正在运行。我不知道现在是什么让它成功,但无论如何它可以帮助某人:

代码:

**<?php

if ( preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT']) )
{
header( 'Location: http://www.web.com/ie/index.php' ) ;
} 
?>
<?php
session_name("fancyform");
session_start();


$_SESSION['n1'] = rand(1,20);
$_SESSION['n2'] = rand(1,20);
$_SESSION['expect'] = $_SESSION['n1']+$_SESSION['n2'];


if(isset($_SESSION['sent']))
{
$success="<p>Gracias ".htmlspecialchars($_SESSION['name'])."! We'll be in touch asap!</p>";
$css='<style type="text/css">.demo-form{display:none;}.thanks{display:block;}</style>';
unset($_SESSION['sent']);
}
?>
<?=isset($css)?$css:""?>**

3 个答案:

答案 0 :(得分:1)

执行session_start()后,它会发送几个标题,如文档所述 - http://de3.php.net/function.session-start

因此必须在PHP脚本生成任何输出之前执行,当然它不能与header('Location: index.php#5');一起使用,因为重定向禁止任何其他标头(包括与会话相关的标头,如Cookie)。我不同意其他答案,说它必须是脚本的第一行 - 这里是文档的一个例子,它否定了这些陈述http://de3.php.net/manual/en/function.session-cache-limiter.php

请注意,space之前的linefeed<?php会产生输出禁止标题,因此我认为问题出在:

?>
<?php

这些标签之间的换行产生输出。 关闭php代码只是为了在下一行重新打开它无论如何都没有意义。 在任何条件下执行<?php之前,请确保?>之前没有任何内容,并且不要使用start_session()将其关闭。

您应该有条件地执行session_start()header('Location: index.php#5');,而不是同时执行这两项。

如果您仍然遇到问题,可以打开php.ini中的所有警告,您应该会看到有关问题真正原因的一些有用信息。 http://de3.php.net/manual/en/configuration.file.php 请记住,脚本的任何输出都禁止在之后发送任何标题。

如果没有显示任何有趣的内容,您应该使用telnet手动向您的网站发送请求,然后您会看到包括违规标题在内的所有内容。还有一些扩展用于Firefox检查标头和服务器响应详细信息,但我更喜欢telnet

在@Phil Perry的评论之后,我必须在此处添加此信息。 即使您没有在编辑器中看到主要字符,以UTF-8格式保存文件也可能会产生BOM。请检查编辑器的配置。

答案 1 :(得分:0)

把它放在开头

<?php
   ob_start();
   session_start();


这应该是它的样子 -

<?php
ob_start();
session_start();

if ( preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT']) )
{
   header( 'Location: http://www.web.com/ie/index.php' ) ;
} 

$_SESSION['n1'] = rand(1,20);
$_SESSION['n2'] = rand(1,20);
$_SESSION['expect'] = $_SESSION['n1']+$_SESSION['n2'];
if(isset($_SESSION['sent']))
{
   ...

<强>解释

要在任何页面上访问脚本中的session variables,您必须在session_start()上方开始会话。

在最近的PHP版本中,不推荐使用session_name()。使用$_SESSION来获取或设置会话变量。

&#34;已发送标题&#34;意味着您的PHP脚本已经发送了HTTP标头,因此它现在无法对它们进行修改。

在调用session_start之前,请检查您是否发送了任何内容。更好的是,只需将session_start作为你在PHP文件中做的第一件事(所以把它放在绝对的开头,在所有HTML等之前)。

答案 2 :(得分:0)

您必须在开始时使用session_start。

session_name("fancyform");
session_start();

替换这两行。

session_start();

//然后写下开始评论

if ( preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT']) )
{
   header( 'Location: http://www.web.com/ie/index.php' ) ;
} 

    session_name("fancyform");