Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Cannot send session cookie
 
 автор: Be4ep   (18.02.2005 в 15:10)   письмо автору
 
 


Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at z:\home\test1.ru\www\SQL\TDtxt\script.php:8) in z:\home\test1.ru\www\SQL\TDtxt\script.php on line 122


как с этим боротся?

   
 
 автор: cheops   (18.02.2005 в 15:29)   письмо автору
 
   для: Be4ep   (18.02.2005 в 15:10)
 

Следует поместить session_start() в самом начале скрипта.

Куки, сессии, отправка заголовков должны происходить до отправки любой информации в окно браузера, т.е. до любого вывода echo, print или непосредственного вывода вне тэгов <?php и ?>. Это связано с тем, что HTTP-заголовки передаются перед всеми данными и когда происходит вывод в окно браузера PHP вынужден их пред этим отослать клиенту. Поэтому повторно, после вывода информации в браузер он не может работать с куками, сессиями и отправлять заголовки.
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1127
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=837
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=2003
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1603

Если вывод текста до отправки заголовков необходим следует воспользоваться функциями управления вывода, позволяющих задерживать вывод информации в браузер.
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=147
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=148
http://www.softtime.ru/group/id_group=12

   
 
 автор: Axxil   (18.02.2005 в 15:34)   письмо автору
 
   для: Be4ep   (18.02.2005 в 15:10)
 

перед session_start ничего не должно быть.
Проверьте на наличие пробелов, если перед session_start есть какой-нибудь include его нужно спустить после вызова этой функции.
у вас session_start вызывается из 122 строки сценария. А в 8 строчке уже что-то выводится в браузер.

   
 
 автор: Be4ep   (18.02.2005 в 16:57)   письмо автору
 
   для: Axxil   (18.02.2005 в 15:34)
 

вот так все работает без нареканий

<?php
$name 
"User";
if(
$action=='')
{
  
session_start();
  
$_SESSION['name'] = $name;
  echo 
'Привет, '.$_SESSION['name']."<br>";
  echo 
"<a href=".$PHP_SELF."?action=next>На следующую страницу </a>";

}
elseif(
$action=='next')
{
  
session_start();
  echo 
$_SESSION['name'].' , ты пришел на другую страницу этого сайта!';
  echo(
"<br>");
  echo 
"<a href=".$PHP_SELF."?action=next2>На следующую страницу </a>";
}
elseif(
$action=='next2')
{
  
session_start();
  unset(
$_SESSION['name']);
  echo 
'Привет, '.$_SESSION['name'];
  
session_destroy();

}
?>

так что товарищ Axxil вы неправы

   
 
 автор: cheops   (18.02.2005 в 17:23)   письмо автору
 
   для: Be4ep   (18.02.2005 в 16:57)
 

Axxil имеет ввиду вывод в браузер, т.е. когда вы в строке 122 вызываете session_start(), PHP рапортует о невозможности отослать заголовки, так как в строке 8 у вас стоит оператор echo
<?php
echo "<a href=".$PHP_SELF."?action=next>На следующую страницу </a>";
?>

который заставляет сервер отослать HTTP-заголовки.

PS Попробуйте перед <?php поставить пробел - и у вас опять не будут отправляться заголовки.

   
 
 автор: Be4ep   (18.02.2005 в 17:55)   письмо автору
 
   для: cheops   (18.02.2005 в 17:23)
 

тоесть session_start() нужно поставить в начеле скрипта. примерно таким образом:

<?php
session_start
();
$name "User";
if(
$action=='')
{
  
$_SESSION['name'] = $name;
  echo 
'Привет, '.$_SESSION['name']."<br>";
  echo 
"<a href=".$PHP_SELF."?action=next>На следующую страницу </a>";

}
elseif(
$action=='next')
{
  echo 
$_SESSION['name'].' , ты пришел на другую страницу этого сайта!';
  echo(
"<br>");
  echo 
"<a href=".$PHP_SELF."?action=next2>На следующую страницу </a>";
}
elseif(
$action=='next2')
{
  unset(
$_SESSION['name']);
  echo 
'Привет, '.$_SESSION['name'];
  
session_destroy();

}
?>


верно?

   
 
 автор: Be4ep   (18.02.2005 в 18:00)   письмо автору
 
   для: Be4ep   (18.02.2005 в 17:55)
 

тогда при наличии других переменных $_SESSION[] где лучше поставить session_destroy()?

   
 
 автор: cheops   (18.02.2005 в 18:06)   письмо автору
 
   для: Be4ep   (18.02.2005 в 18:00)
 

Это зависит от характера Web-приложения, иногда session_destroy() вообще не вызывается и сессии умирают самостоятельно...

   
 
 автор: Axxil   (18.02.2005 в 18:08)   письмо автору
 
   для: cheops   (18.02.2005 в 18:06)
 

Да, кстати есть такое понятие как время жизни сессии?
То есть может сессия умереть если долго не обновлять страницу?

   
 
 автор: cheops   (18.02.2005 в 18:11)   письмо автору
 
   для: Axxil   (18.02.2005 в 18:08)
 

Она умрёт даже если страница пергружается, обычно время её жизни выставляют в пределах нескольких часов или итого меньше http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=773

   
 
 автор: Axxil   (18.02.2005 в 18:16)   письмо автору
 
   для: cheops   (18.02.2005 в 18:11)
 

Там по ссылке написано что время жизни выставляет аднинистратор.
Где его можно выставить в php.ini?

   
 
 автор: cheops   (18.02.2005 в 18:31)   письмо автору
 
   для: Axxil   (18.02.2005 в 18:16)
 

В php.ini имеется директива
session.gc_maxlifetime = 1440

которая указывает, через сколько секунд сессия будет помечена как отжившая и подлежащая уничтожению сборщиком мусора.
Кроме того, можно использовать директиву session.cookie_lifetime для указания времени жизни cookie в которой хранится идентификатор сессии, если он равен 0, то данная cookie храниться только до момента выключения браузера (сессионная cookie).
session.cookie_lifetime = 3600

   
 
 автор: Be4ep   (18.02.2005 в 18:11)   письмо автору
 
   для: cheops   (18.02.2005 в 18:06)
 

а через сколько сессия умерает?

   
 
 автор: Be4ep   (18.02.2005 в 18:28)   письмо автору
 
   для: Be4ep   (18.02.2005 в 18:11)
 

вот еще вопрос:
как бы мне вот в этот блок,

elseif($action=='next2') 

  unset($_SESSION['name']); 
  echo 'Привет, '.$_SESSION['name']; 
  session_destroy(); 



вставить <META HTTP-EQUIV=Refresh CONTENT=0; URL=обратно в первый блок>
я вставляю таким образом:
echo "<META HTTP-EQUIV=Refresh CONTENT=0; URL=".$PHP_SELF.">";
или
echo "<META HTTP-EQUIV=Refresh CONTENT=0; URL=script.php>";

но получается что он циклично грузит все тотже третий блок

   
 
 автор: Be4ep   (18.02.2005 в 18:31)   письмо автору
 
   для: Be4ep   (18.02.2005 в 18:28)
 

прошу прощенья сам ощибся с кавычками

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования