Устранение неполадок "Предупреждение: session_start(): Не удается отправить ограничитель кеша сеанса - уже отправленные заголовки"
Я получаю Предупреждение: 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"> </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> </td>
</tr>
<tr>
<td height="45"><strong>-> Products</strong></td>
</tr>
<tr>
<td height="61"><strong>-> Categories</strong></td>
</tr>
<tr>
<td height="48"><strong>-> Sub Categories</strong></td>
</tr>
</table></td>
<td width="78%" valign="top"><table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td> </td>
</tr>
<tr>
<td>
<table width="90%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="26%"> </td>
<td width="74%"><h2>Manage Categories</h2></td>
</tr>
</table></td>
</tr>
<tr>
<td height="30">
</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>
<input type="text" name="categoryname" /><br /><br />
<label class="style4">Category Image</label>
<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>";
}
?>
Здесь ничего не происходит. Пожалуйста, предложите
Ответы
Ответ 1
Вы найдете, что я добавил 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"> </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> </td>
</tr>
<tr>
<td height="45"><strong>-> Products</strong></td>
</tr>
<tr>
<td height="61"><strong>-> Categories</strong></td>
</tr>
<tr>
<td height="48"><strong>-> Sub Categories</strong></td>
</tr>
</table></td>
<td width="78%" valign="top"><table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td> </td>
</tr>
<tr>
<td>
<table width="90%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="26%"> </td>
<td width="74%"><h2>Manage Categories</h2></td>
</tr>
</table></td>
</tr>
<tr>
<td height="30">
</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>
<input type="text" name="categoryname" /><br /><br />
<label class="style4">Category Image</label>
<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;
}
?>
Ответ 2
У меня была такая же проблема, но мое решение было не таким очевидным, как предлагаемые. Оказалось, что мой php файл был написан в UTF-8, что вызвало проблемы. Я копирую/вставляю содержимое всего файла в новый php файл (Notepad ++ говорит мне, что это написано в ANSI, а не UTF-8), и теперь он работает безупречно.
Ответ 3
Ответ выше Росса.
Во-первых, включение session_start() в качестве первой строки кода означает, что вы не можете десериализовать любые объекты правильно в переменных сеанса.
Причиной для получения этой проблемы является 99%, вероятно, будет конечными пробелами в конце ваших включенных файлов (да - я знаю, что это маловероятно, но просто попробуйте). Оскорбительный файл находится в сообщении об ошибке. Я хотел создать резервную копию ответа Росса, который работал у меня, но этот сайт противоречит интуиции.
ИГНОРИТЕ бессмысленные ответы. Удалите конечные пробелы, символы новой строки и т.д.... и все будет хорошо. РОСС знает, о чем он говорит.
Включение session_start() в начало файла работает, но это не правильное решение.
Ответ 4
Это должно решить вашу проблему. session_start() должен быть вызван до того, как любой символ будет отправлен обратно в браузер. В вашем случае HTML и пустые строки были отправлены до того, как вы вызвали session_start(). Документация здесь.
Чтобы еще больше объяснить ваш вопрос о том, почему он работает при отправке на другую страницу, эта страница либо не использует session_start(), либо вызывает session_start() перед отправкой любого символа обратно клиенту! Эта страница, с другой стороны, вызывала session_start() намного позже, когда много HTML было отправлено обратно клиенту (браузеру).
Лучший способ кодирования - иметь общий заголовочный файл, который вызывает подключение к базе данных 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>
<input type="text" name="categoryname" /><br /><br />
<label class="style4">Category Image</label>
<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;
}
?>
Ответ 5
заменить session_start();
с @session_start();
в вашем коде
Ответ 6
используйте ob_start();
до session_start();
в верхней части страницы, например,
<?php
ob_start();
session_start();
Ответ 7
используйте session_start()
в верхней части страницы.
для более подробной информации, пожалуйста, прочитайте ссылку session_start
Ответ 8
Для других, кто может столкнуться с этим, это может произойти, если кто-то небрежно покидает конечные пробелы из файла include php. Пример:
<?php
require_once('mylib.php');
session_start();
?>
В приведенном выше случае, если mylib.php имеет пробелы после его закрывающего тега? > , это вызовет ошибку. Это, очевидно, может вызвать раздражение, если вы включили/потребовали много файлов. К счастью, ошибка сообщает вам, какой файл оскорбляет.
НТН
Ответ 9
Обычно эта ошибка возникает, когда мы отправляем заголовок после эха или печати. Если эта ошибка возникает на определенной странице, убедитесь, что страница не повторяет ничего перед вызовом 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() даже не в виде пробела или новой строки
Ответ 10
Мне удалось решить аналогичный Warning: session_start(): Cannot send session cache limiter - headers already sent
, просто удалив пробел перед тегом <?php
.
Это сработало.
Ответ 11
В моем случае мне пришлось установить кодировку файла без спецификации.
Ответ 12
У меня был сайт, переносящий с одного хоста на другой, он, похоже, отлично работал на старом хосте, но несколько страниц на новом хосте бросали ошибку
Warning: session_start(): Cannot send session cache limiter - headers already sent
в то время как я всегда держал
<?php
session_start();
в верхней части страницы нет пробелов и ничего не вставлено перед
это действительно беспокоило меня, что я смотрел каждую страницу с открытием сессии, и она работала на некоторых страницах и просматривала ошибку на других
Я выбрал страницы с проблемами, подставил их, создал новые пустые страницы и просто скопировал и вставил код как есть, сохранен и загружен, и проблема не ушла!
Это то, что вам, ребята, может потребоваться, возможно, это была кодировка страницы или что-то в этом роде, не уверенный в том, что она является точным источником проблемы, но вот на что нужно обратить внимание, если вы, ребята, столкнулись с аналогичная проблема
ура!
Ответ 13
Просто замените session_start на это.
if (!session_id() && !headers_sent()) {
session_start();
}
Вы можете поместить его куда угодно, даже в конце:)
Прекрасно работает для меня. $_SESSION также доступна.
Ответ 14
Это началось для меня, когда я перенаправил свой сайт на https://(для SSL-сертификата). Исходя из моего опыта с этой проблемой, session_start()
должен был быть до того, как браузер увидел какой-либо HTML-код. Для моего примера я использовал session_start()
в nav.php, чтобы определить параметры панели навигации. Я закончил тем, что поместил session_start()
сразу после комментариев php в файле index.php и на каждой странице, которая называлась nav.php. Я смог сохранить комментарии php до session_start()
но не смог оставить комментарии HTML выше php.
Ответ 15
Проверьте все лишние пробелы перед тегом php.