好像我在下面的代码中遇到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:""?>**
答案 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");