疑难解答“警告:session_start():无法发送会话缓存限制器 - 标头已发送”


Troubleshooting "Warning: session_start(): Cannot send session cache limiter - headers already sent"

我收到警告:session_start(( [function.session-start]:无法发送会话缓存限制器 - 标头已发送(输出在错误时启动

如果我将表单数据提交到其他文件进行处理,它可以工作。但是,如果我将表单数据提交到同一页面,则会出现此错误。

请苏格斯特

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
<title>Welcome</title>

<script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
$(document).ready(function () { 
    $('#nav li').hover(
        function () {
            //show its submenu
            $('ul', this).slideDown(100);
        }, 
        function () {
            //hide its submenu
            $('ul', this).slideUp(100);         
        }
    );
});
    </script>
</head>
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td class="header">&nbsp;</td>
  </tr>
  <tr>
    <td class="menu"><table align="center" cellpadding="0" cellspacing="0" width="80%">
    <tr>
    <td>
    <ul id="nav">
    <li><a href="#">Catalog</a>
    <ul><li><a href="#">Products</a></li>
        <li><a href="#">Bulk Upload</a></li>
        </ul>
        <div class="clear"></div>
        </li>

    <li><a href="#">Purchase  </a>
    </li>
    <li><a href="#">Customer Service</a>
    <ul>
        <li><a href="#">Contact Us</a></li>
        <li><a href="#">CS Panel</a></li>
    </ul>           
        <div class="clear"></div>
    </li>
    <li><a href="#">All Reports</a></li>
    <li><a href="#">Configuration</a>
    <ul> <li><a href="#">Look and Feel </a></li>
         <li><a href="#">Business Details</a></li>
         <li><a href="#">CS Details</a></li>
         <li><a href="#">Emaqil Template</a></li>
         <li><a href="#">Domain and Analytics</a></li>
         <li><a href="#">Courier</a></li>
         </ul>
    <div class="clear"></div>
    </li>
    <li><a href="#">Accounts</a>
    <ul><li><a href="#">Ledgers</a></li>
        <li><a href="#">Account Details</a></li>
        </ul>
         <div class="clear"></div></li>
</ul></td></tr></table></td>
  </tr>
  <tr>
    <td valign="top"><table width="80%" border="0" align="center" cellpadding="0" cellspacing="0">
      <tr>
        <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
          <tr>
            <td width="22%" height="327" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
              <tr>
                <td>&nbsp;</td>
                </tr>
              <tr>
                <td height="45"><strong>-&gt; Products</strong></td>
                </tr>
              <tr>
                <td height="61"><strong>-&gt; Categories</strong></td>
                </tr>
              <tr>
                <td height="48"><strong>-&gt; Sub Categories</strong></td>
                </tr>
            </table></td>
            <td width="78%" valign="top"><table width="100%" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td>&nbsp;</td>
                </tr>
              <tr>
                <td>
                  <table width="90%" border="0" cellspacing="0" cellpadding="0">
                    <tr>
                      <td width="26%">&nbsp;</td>
                      <td width="74%"><h2>Manage Categories</h2></td>
                    </tr>
                  </table></td>
                </tr>
              <tr>
                <td height="30">&nbsp;
                </td>
                </tr>
              <tr>
                <td>

</td>
                </tr>
                <tr>
                <td>
                <table width="49%" align="center" cellpadding="0" cellspacing="0">
                <tr><td>


<?php

                if (isset($_SESSION['error']))
                {
                    echo "<span id='"error'"><p>" . $_SESSION['error'] . "</p></span>";
                    unset($_SESSION['error']);
                }
                ?>
                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
                <p>
                 <label class="style4">Category Name</label>
                   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="categoryname" /><br /><br />
                    <label class="style4">Category Image</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    <input type="file" name="image" /><br />
                    <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
                   <br />
<br />
 <input type="submit" id="submit" value="UPLOAD" />
                </p>
                </form>


                             <?php
session_start();
require("includes/conn.php");

function is_valid_type($file)
{
    $valid_types = array("image/jpg", "image/jpeg", "image/bmp", "image/gif", "image/png");

    if (in_array($file['type'], $valid_types))
        return 1;
    return 0;
}
function showContents($array)
{
    echo "<pre>";
    print_r($array);
    echo "</pre>";
}

$TARGET_PATH = "images/category";
$cname = $_POST['categoryname'];
$image = $_FILES['image'];
$cname = mysql_real_escape_string($cname);
$image['name'] = mysql_real_escape_string($image['name']);
$TARGET_PATH .= $image['name'];
if ( $cname == "" || $image['name'] == "" )
{
    $_SESSION['error'] = "All fields are required";
    header("Location: managecategories.php");
    exit;
}
if (!is_valid_type($image))
{
    $_SESSION['error'] = "You must upload a jpeg, gif, or bmp";
    header("Location: managecategories.php");
    exit;
}


if (file_exists($TARGET_PATH))
{
    $_SESSION['error'] = "A file with that name already exists";
    header("Location: managecategories.php");
    exit;
}

if (move_uploaded_file($image['tmp_name'], $TARGET_PATH))
{

    $sql = "insert into Categories (CategoryName, FileName) values ('$cname', '" . $image['name'] . "')";
    $result = mysql_query($sql) or die ("Could not insert data into DB: " . mysql_error());
  header("Location: mangaecategories.php");
    exit;
}
else
{


    $_SESSION['error'] = "Could not upload file.  Check read/write persmissions on the directory";
    header("Location: mangagecategories.php");
    exit;
}
?> 

这是显示的代码

<?php  
                  require("includes/conn.php"); 

                $sql = "select CategoryID, CategoryName, FileName, Status from Categories";
                $result = mysql_query($sql) or die ("Could not access DB: " . mysql_error());

                while ($row = mysql_fetch_assoc($result))
                {
                     echo "<table border='0' cellpadding='10'>";

                                        echo "<tr><td>  </td><td>Category ID</td><td>Category Name</td><td>Status</td><td>Edit</td><td>Delete</td></tr>";
                                        echo "<tr><td> <img src='"images/" . $row['FileName'] . "'" alt='"'" /> </td>";
                                        echo "<td>". $row['CategoryID'] . "</td>";
                                            echo "<td>". $row['CategoryName'] . "</td>";
                                            echo "<td>". $row['Status']. "</td>";
                                            echo "<td> <a href= 'edit.php?CategoryID=" .$row['id']. "'> Edit </a></td>";
                                            echo "<td> <a href= 'delete.php?CategoryID=" .$row['id']. "'> Edit </a></td>";
                                         echo "</tr> </table>";
                }

            ?>

这里什么都没有发生。請建議

你會發現我在頁面最頂端添加了 session_start((。我还在页面后面删除了 session_start(( 调用。此页面应该可以正常工作。

<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
<title>Welcome</title>

<script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
$(document).ready(function () { 
    $('#nav li').hover(
        function () {
            //show its submenu
            $('ul', this).slideDown(100);
        }, 
        function () {
            //hide its submenu
            $('ul', this).slideUp(100);         
        }
    );
});
    </script>
</head>
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td class="header">&nbsp;</td>
  </tr>
  <tr>
    <td class="menu"><table align="center" cellpadding="0" cellspacing="0" width="80%">
    <tr>
    <td>
    <ul id="nav">
    <li><a href="#">Catalog</a>
    <ul><li><a href="#">Products</a></li>
        <li><a href="#">Bulk Upload</a></li>
        </ul>
        <div class="clear"></div>
        </li>

    <li><a href="#">Purchase  </a>
    </li>
    <li><a href="#">Customer Service</a>
    <ul>
        <li><a href="#">Contact Us</a></li>
        <li><a href="#">CS Panel</a></li>
    </ul>           
        <div class="clear"></div>
    </li>
    <li><a href="#">All Reports</a></li>
    <li><a href="#">Configuration</a>
    <ul> <li><a href="#">Look and Feel </a></li>
         <li><a href="#">Business Details</a></li>
         <li><a href="#">CS Details</a></li>
         <li><a href="#">Emaqil Template</a></li>
         <li><a href="#">Domain and Analytics</a></li>
         <li><a href="#">Courier</a></li>
         </ul>
    <div class="clear"></div>
    </li>
    <li><a href="#">Accounts</a>
    <ul><li><a href="#">Ledgers</a></li>
        <li><a href="#">Account Details</a></li>
        </ul>
         <div class="clear"></div></li>
</ul></td></tr></table></td>
  </tr>
  <tr>
    <td valign="top"><table width="80%" border="0" align="center" cellpadding="0" cellspacing="0">
      <tr>
        <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
          <tr>
            <td width="22%" height="327" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
              <tr>
                <td>&nbsp;</td>
                </tr>
              <tr>
                <td height="45"><strong>-&gt; Products</strong></td>
                </tr>
              <tr>
                <td height="61"><strong>-&gt; Categories</strong></td>
                </tr>
              <tr>
                <td height="48"><strong>-&gt; Sub Categories</strong></td>
                </tr>
            </table></td>
            <td width="78%" valign="top"><table width="100%" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td>&nbsp;</td>
                </tr>
              <tr>
                <td>
                  <table width="90%" border="0" cellspacing="0" cellpadding="0">
                    <tr>
                      <td width="26%">&nbsp;</td>
                      <td width="74%"><h2>Manage Categories</h2></td>
                    </tr>
                  </table></td>
                </tr>
              <tr>
                <td height="30">&nbsp;
                </td>
                </tr>
              <tr>
                <td>

</td>
                </tr>
                <tr>
                <td>
                <table width="49%" align="center" cellpadding="0" cellspacing="0">
                <tr><td>


<?php

                if (isset($_SESSION['error']))
                {
                    echo "<span id='"error'"><p>" . $_SESSION['error'] . "</p></span>";
                    unset($_SESSION['error']);
                }
                ?>
                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
                <p>
                 <label class="style4">Category Name</label>
                   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="categoryname" /><br /><br />
                    <label class="style4">Category Image</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    <input type="file" name="image" /><br />
                    <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
                   <br />
<br />
 <input type="submit" id="submit" value="UPLOAD" />
                </p>
                </form>


                             <?php

require("includes/conn.php");

function is_valid_type($file)
{
    $valid_types = array("image/jpg", "image/jpeg", "image/bmp", "image/gif", "image/png");

    if (in_array($file['type'], $valid_types))
        return 1;
    return 0;
}
function showContents($array)
{
    echo "<pre>";
    print_r($array);
    echo "</pre>";
}

$TARGET_PATH = "images/category";
$cname = $_POST['categoryname'];
$image = $_FILES['image'];
$cname = mysql_real_escape_string($cname);
$image['name'] = mysql_real_escape_string($image['name']);
$TARGET_PATH .= $image['name'];
if ( $cname == "" || $image['name'] == "" )
{
    $_SESSION['error'] = "All fields are required";
    header("Location: managecategories.php");
    exit;
}
if (!is_valid_type($image))
{
    $_SESSION['error'] = "You must upload a jpeg, gif, or bmp";
    header("Location: managecategories.php");
    exit;
}


if (file_exists($TARGET_PATH))
{
    $_SESSION['error'] = "A file with that name already exists";
    header("Location: managecategories.php");
    exit;
}

if (move_uploaded_file($image['tmp_name'], $TARGET_PATH))
{

    $sql = "insert into Categories (CategoryName, FileName) values ('$cname', '" . $image['name'] . "')";
    $result = mysql_query($sql) or die ("Could not insert data into DB: " . mysql_error());
  header("Location: mangaecategories.php");
    exit;
}
else
{


    $_SESSION['error'] = "Could not upload file.  Check read/write persmissions on the directory";
    header("Location: mangagecategories.php");
    exit;
}
?> 

我遇到了同样的问题,但我的解决方案并不像建议的那么明显。事实证明,我的php文件是用UTF-8编写的,这导致了问题。我将整个文件的内容复制/粘贴到一个新的php文件中(Notepad++告诉我这是用ANSI而不是UTF-8编写的(,现在它完美地工作。

答案在上面是罗斯。

首先,将 session_start(( 作为第一行代码意味着您无法将任何对象正确反序列化为会话变量。

出现此问题的原因是 99% 可能是包含文件末尾的尾随空格(是的 - 我知道这听起来不太可能,但请尝试一下(。 错误消息中有问题的文件。 我想备份对我有用的罗斯答案,但这个网站是违反直觉的。

忽略无稽之谈的答案。 删除尾随空格、换行符等...一切都会好起来的。 罗斯知道他在说什么。将 session_start(( 放在文件顶部确实有效,但这不是正确的解决方案。

代码中的session_start();替换为@session_start();

这应该可以解决您的问题。 session_start(( 应在将任何字符发送回浏览器之前调用。在您的情况下,HTML 和空行是在您调用 session_start(( 之前发送的。文档在这里。

为了进一步解释您的问题,即当您提交到其他页面时为什么它会起作用,该页面要么不使用 session_start(( 要么在将任何字符发送回客户端之前调用 session_start((!另一方面,当大量HTML被发送回客户端(浏览器(时,这个页面调用session_start((很久以后。

更好的编码方法是有一个通用的头文件,该文件调用连接到MySQL数据库,调用session_start((并对所有页面执行其他常见操作,并将该文件包含在每个页面的顶部,如下所示:

include "header.php";

这将阻止您遇到的问题,也允许您在整个项目中管理一组通用代码。在查看您的代码后,我建议您绝对考虑一些事情。

<?php
session_start();
                if (isset($_SESSION['error']))
                {
                    echo "<span id='"error'"><p>" . $_SESSION['error'] . "</p></span>";
                    unset($_SESSION['error']);
                }
                ?>
                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
                <p>
                 <label class="style4">Category Name</label>
                   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="categoryname" /><br /><br />
                    <label class="style4">Category Image</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    <input type="file" name="image" /><br />
                    <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
                   <br />
<br />
 <input type="submit" id="submit" value="UPLOAD" />
                </p>
                </form>


                             <?php

require("includes/conn.php");

function is_valid_type($file)
{
    $valid_types = array("image/jpg", "image/jpeg", "image/bmp", "image/gif", "image/png");

    if (in_array($file['type'], $valid_types))
        return 1;
    return 0;
}
function showContents($array)
{
    echo "<pre>";
    print_r($array);
    echo "</pre>";
}

$TARGET_PATH = "images/category";
$cname = $_POST['categoryname'];
$image = $_FILES['image'];
$cname = mysql_real_escape_string($cname);
$image['name'] = mysql_real_escape_string($image['name']);
$TARGET_PATH .= $image['name'];
if ( $cname == "" || $image['name'] == "" )
{
    $_SESSION['error'] = "All fields are required";
    header("Location: managecategories.php");
    exit;
}
if (!is_valid_type($image))
{
    $_SESSION['error'] = "You must upload a jpeg, gif, or bmp";
    header("Location: managecategories.php");
    exit;
}


if (file_exists($TARGET_PATH))
{
    $_SESSION['error'] = "A file with that name already exists";
    header("Location: managecategories.php");
    exit;
}

if (move_uploaded_file($image['tmp_name'], $TARGET_PATH))
{

    $sql = "insert into Categories (CategoryName, FileName) values ('$cname', '" . $image['name'] . "')";
    $result = mysql_query($sql) or die ("Could not insert data into DB: " . mysql_error());
  header("Location: mangaecategories.php");
    exit;
}
else
{


    $_SESSION['error'] = "Could not upload file.  Check read/write persmissions on the directory";
    header("Location: mangagecategories.php");
    exit;
}
?> 

页面顶部session_start();之前使用ob_start();,如下所示

<?php
ob_start();
session_start();

对于可能遇到此问题的其他人 - 如果有人不小心从 php 包含文件中留下尾随空格,也会发生这种情况。 例:

 <?php 
    require_once('mylib.php');
    session_start();
 ?>

在上面的情况下,如果 mylib.php 在其关闭 ?> 标记后有空格,这将导致错误。 如果您包含/需要许多文件,这显然会很烦人。 幸运的是,该错误会告诉您哪个文件有问题。

通常,

当我们在回显或打印后发送标头时,会出现此错误。如果此错误出现在特定页面上,请确保该页面在调用 start_session(( 之前没有回显任何内容。

不可预测的错误示例:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();
//your page content

再举一个例子:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();
//your page content

结论:在调用 session_start(( 或 header(( 函数之前不要输出任何字符,甚至没有空格或换行符

只需将session_start替换为此。

if (!session_id() && !headers_sent()) {
   session_start();
}  

你可以把它放在任何地方,即使是在最后:)对我来说效果很好。_SESSION美元也可以使用。

使用页面顶部的session_start()

有关更多详细信息,请阅读链接session_start

我能够通过删除<?php标签前面的一个空格来解决类似的Warning: session_start(): Cannot send session cache limiter - headers already sent

成功了。

我有一个网站从一台主机转移到另一台主机,它似乎在旧主机上工作正常,但新主机上的几页抛出了错误

警告:session_start((:无法发送会话缓存限制器 - 标头已发送
虽然我一直保持
 <?phpsession_start((;

在页面顶部没有空格,也没有插入任何内容

这真的让我很烦恼,我在打开会话时盯着每一页,它在某些页面上有效,并在其他页面上运行错误我选择了有问题的页面,备份它们,创建新的空白页,然后简单地按原样复制和粘贴代码,保存并上传,问题消失了!

这是你们可能需要考虑的事情,可能是页面的编码或其他什么,不确定问题的确切来源,但这里有一个修复程序,以防你们遇到类似的问题

干杯!

就我而言,我必须在没有 BOM 的情况下设置文件编码。

当我将我的网站重定向到 https://(对于SSL证书(时,这对我来说是开始的。根据我对此问题的经验,session_start()必须在浏览器看到任何 HTML 代码之前。对于我的示例,我在 nav.php 中使用session_start()来确定导航栏的选项。我最终将session_start()放在索引.php文件和每个调用nav.php的页面中的php注释之后。我能够在session_start()之前保留 php 注释,但无法将 HTML 注释保留在 php 之上。

检查 php 标签前是否有多余的空格。