PHP会话-警告

PHP会话-警告,php,session,cookies,Php,Session,Cookies,昨天我问了一个问题“php警告-在服务器移动后已经发送了标题”,从那以后我做了一些更改,试图解决这个问题,但我仍然不明白 我正在编写另一家公司的代码!我没有把网站从他们的服务器上移开,放到我们的服务器上,但我的问题是,会话在新服务器上的页面之间无法工作 我得到警告: 警告:会话启动()[函数.会话启动]:无法发送会话 缓存限制器-标头已发送(输出开始于 /home/com10002/public_html/bank/index.php:28) /第3行的home/com10002/public_

昨天我问了一个问题“php警告-在服务器移动后已经发送了标题”,从那以后我做了一些更改,试图解决这个问题,但我仍然不明白

我正在编写另一家公司的代码!我没有把网站从他们的服务器上移开,放到我们的服务器上,但我的问题是,会话在新服务器上的页面之间无法工作

我得到警告:

警告:会话启动()[函数.会话启动]:无法发送会话 缓存限制器-标头已发送(输出开始于 /home/com10002/public_html/bank/index.php:28) /第3行的home/com10002/public_html/bank/includes/quickform.php

在my index.php中

include('includes/functions.php');

$activeTab = "navhome"; 
$sent = false;

$title = (isset($_GET['title']))? mysql_real_escape_string($_GET['title']) : 'Home';    
$title = str_replace('-',' ', $title);

if($title != '') {  

    $sql = "SELECT * 
            FROM contents 
            WHERE name LIKE '%$title%'
            LIMIT 1";

    $result = @mysql_query($sql);       
    $row = mysql_fetch_assoc($result);      
}

//Set page title
$pagetitle = (isset($row['name']) && $title != 'Home')? ucwords($row['name']) : "Bank Charges";
HTML..HEAD..META DATA和TITLE TAGS..etc

include('includes/header.php');

    <div class="textarea">
        <?php include('includes/rightcol.php'); ?>
        <div id="contentvideo" style="display:none;"></div>
        <h1><?=$row['h1'];?></h1>
        <h2><?=$row['h2'];?></h2>
        <?=$row['intro'];?> 

        <?php  include('includes/quickform.php');?>

        <?=$row['page_content'];?>          
    </div>

    <?php include('includes/subnav.php'); ?>    
这是他们的代码,目前在他们的服务器上运行良好

1) 我已尝试将
会话\u start()
移动到
index.php
2) 在两页上都放置一个会话。 3) 在index.php中删除会话之前的空白

include('includes/functions.php');

$activeTab = "navhome"; 
$sent = false;

$title = (isset($_GET['title']))? mysql_real_escape_string($_GET['title']) : 'Home';    
$title = str_replace('-',' ', $title);

if($title != '') {  

    $sql = "SELECT * 
            FROM contents 
            WHERE name LIKE '%$title%'
            LIMIT 1";

    $result = @mysql_query($sql);       
    $row = mysql_fetch_assoc($result);      
}

//Set page title
$pagetitle = (isset($row['name']) && $title != 'Home')? ucwords($row['name']) : "Bank Charges";
我的新版本是在
www.compension-claims.org/bank


因为这不是我的代码,所以我不确定他们为什么将会话放在quickform.php中。一个快速而肮脏的修复方法是,通过修改php.ini文件(并重新启动Apache)在服务器上激活,设置如下:

output_buffering=4096
您遇到的问题是,即使只发送了1个字符,也无法发送HTTP头;通过使用该指令,可以指示在缓冲4k数据之前不应发送任何内容

这通常足以缓冲
.php
文件开头/结尾出现的一些空格,并且足以导致此类问题

注意:这是一个快速而肮脏的修复程序,但它可能会帮助您使应用程序正常工作

当然,最好的解决方案是删除调用session\u start/之前发送的任何类型的输出,或者将对
session\u start
的调用移动到PHP脚本的开头。
一件经常有用的事情是删除
.php
文件末尾的结束标记
?>
,这样之后就不会有任何空白,因为它已经不存在了(是的,这是完全有效的)


再次查看给定代码后进行编辑:

header.php
中:

  • 您正在进行一些输出(HTML代码,如div“textarea”)
  • 只有这样,您才能使用
    session\u start
    • 由于某些输出已经发送到浏览器,
      会话启动
      无法创建cookie,因此失败
因此,您确实需要将会话移动到尽可能高的位置:但它正好位于
index.php
的开头;或者,也许,在
functions.php
的顶部,到处都可以找到它

。。。但是肯定不在HTML输出的中间!p> (我前面所说的关于输出缓冲的内容可能是这段(不好的)代码以前工作的原因)

我想这应该能解决问题。。。

不管怎样,祝你好运

听起来像是UNIX字符返回被发送到浏览器,因为Windows处理回车的方式不同。发送头之前发送的一个或多个字符将导致发生此错误。另一种选择可能是,另一台服务器通过php.ini指令启用了输出缓冲,该指令在将输出发送到客户端之前捕获并解析任何输出。这可能是压缩原因造成的。我建议比较php.ini配置,看看在迁移之前Apache服务器上是否启用了gzip压缩

您可以在脚本中使用ini_set()函数来设置php.ini配置值

ini_set('output_buffering', 4096);

谢谢,但是看起来我的主机不允许我编辑php.ini文件!哦,太糟糕了:-(那么可能是使用ob_start之类的工具?或者你可能需要遍历每个文件,以删除不需要的空格,以及类似的东西:-(作为旁注:index.php中第28行有什么内容?在这种特殊情况下,你可能需要查看该行,因为它是导致输出的一行;-)不过,有一件事应该不太难尝试:将会话移动到尽可能高的位置:这应该是第一件要做的事情之一(因此,将其放在调用的页面的开头),我刚刚编辑了我的答案,以提供更多信息;还有一些可能是解决您问题的方法:-)