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

Форум PHP

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

 

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

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

тема: Ошибка при вызове функции header
 
 автор: gvidon   (06.04.2010 в 07:18)   письмо автору
 
 

Добрый день .
Только недавно начал программировать на пхп так что не пинайте .
на сервере стоит линукс апаче 1.3 и пхп 4 .
Вот пример скрипта , который я исполняю :
<html>
<head>
<title></title>
</head>
<body>
<h4>Введите логин и пароль </h4>
<form action="<?php echo $PHP_SELF ; ?> " method=post enctype=multipart/form-data>
<input type=text name=login>
<input type=password name=pass >
<input type=submit name="submit" value=Ok></form>
<?php
$dir=$DOCUMENT_ROOT."/login";
if ($submit) {
$data=file($dir);

if ((trim($data[0])==trim($login)) and (trim($data[1])==trim($pass)))
{ header ("Location: indexadmin.php "); exit();

} else echo("Incorrect login" );

}


?>

</body>

</html>
Проблема заключяется в том , апач 1.3 не хочет выполнять header ("Location: indexadmin.php ");
и в ответ я получаю Warning: Cannot add header information - headers already sent by (output started at /var/oxotnikvl/admin.php:4) in /admin.php on line 13 .Ради любопытства я переписал скрипт к другу на сервер с таким же апачем и пхп и у него такой пролемы не произошло .
Я предпологаю что проблема в конфигах апача или пхп .
Помогите кто чем может .

  Ответить  
 
 автор: sim5   (06.04.2010 в 07:29)   письмо автору
 
   для: gvidon   (06.04.2010 в 07:18)
 

Апач тут не при чем, это ваша ошибка. Заголовки должны передаваться до любого вывода в браузер, а у вас перед его передачей выводится html-код, вот вы и получаете ошибку.

Прежде чем пинать Апач или конфигурацию, читать надо мануал, который гласит (о header):

Помните, что header() обязана вызываться до отправки любого вывода: нормальными ли тэгами HTML, пустыми строками в файле, или из PHP. Очень частой ошибкой является чтение кода функциями include() или require(), или другой функцией доступа к файлу, и наличие пробелов или пустых строк, которые выводятся до вызова header(). Та же проблема возникает при использовании единого PHP/HTML-файла.

  Ответить  
 
 автор: gvidon   (06.04.2010 в 07:50)   письмо автору
 
   для: sim5   (06.04.2010 в 07:29)
 

Спасибо за ответ .
Мне интересно почему на другом вебсервере все заработало ?
http://oxotnikvl.ru/admin.php мой сервер где не работает
http://www.sferamarket.ru/~neosfera/admin.php там где работает

  Ответить  
 
 автор: sim5   (06.04.2010 в 07:55)   письмо автору
 
   для: gvidon   (06.04.2010 в 07:50)
 

Вот только не надо о том, что заработало. У вас не заработало (перехода не произойдет), а просто подавлен вывод ошибок на другом сервере. Читайте мануал и исправляйте свой скрипт.

  Ответить  
 
 автор: gvidon   (06.04.2010 в 07:59)   письмо автору
 
   для: sim5   (06.04.2010 в 07:55)
 

А если вывод ошибки подавлен то почему все таки директива сработала и у меня открылась следующая страница ??? если не тяжело нажмите на кнопку ок .

  Ответить  
 
 автор: sim5   (06.04.2010 в 08:29)   письмо автору
 
   для: gvidon   (06.04.2010 в 07:59)
 

Зачем мне жать на вашу кнопку? Такого быть не может.
<?
<?
//не реагируем на ошибки
error_reporting(~E_ALL);
//и отключаем их вывод
ini_set("display_errors""off");
?>
<form action=""><input type="submit" name="sender" value="GO"></form>
<?
//а перехода все равно не будет
if(isset($_GET['sender'])) header('location: test.php');
?>

А теперь две первыых строки кода пропишите так:
error_reporting(E_ALL);
ini_set("display_errors", "on");
Запустите, что получите?

Читайте мануал и пишите не так как вам хочется, а как требуется.

  Ответить  
 
 автор: gvidon   (06.04.2010 в 08:48)   письмо автору
 
   для: sim5   (06.04.2010 в 08:29)
 

а каким образом можно перенаправить на другую страницу тогда ?

  Ответить  
 
 автор: sim5   (06.04.2010 в 08:56)   письмо автору
 
   для: gvidon   (06.04.2010 в 08:48)
 

Если вы решили писать на РНР, то читайте мануал, учебники. Не изучите вы его никогда, задавая лишь вопросы.
Решить вашу проблему можно двумя способами - первый буферизация вывода (читайте в мануале, что это такое, в первую очередь, а уж потом вопросы), и второй, это переписать свой скрипт так, чтобы отправление заголовка было до любого вывода в браузер. Это сделать не трудно в вашем коде, вот тут можно не заглядывать в мануал, а лишь немного подумать. Попробуйте сперва сами это сделать, а если не получится, тогда с вопросом...

  Ответить  
 
 автор: tihonko   (06.04.2010 в 08:57)   письмо автору
 
   для: gvidon   (06.04.2010 в 07:18)
 

В php.ini есть специальная директика - output_buffering. Ее значение по умолчанию - 0. Это говорит о том, что весь вывод сразу направляется клиенту, как только он прочитывается в скрипте. В этом случаи вы не можете отправить HTTP-заголовки после того как уже началась передача тела HTTP-документа.

Если не хотите переписывать код, то можно выйти из этой ситуации следующий способом:
Нужно вывод перед отправкой сложить в буфер. Тогда будет неважно в какой последовательности у вас в коде фигурируют заголовки и вывод - PHP все равно ничего не отправит до того момента, пока не исполнит весь скрипт.

Активировать буферизацию вывода можно следующими путями:
1. Изменить значение директивы output_buffering на on
2. Активировать буферизацию вывода в самом php - скрипте с помощью функции ob_start()

Первый вариант вам подойдет только в том случаи, если вы можете изменять файл php.ini.
Если такой возможности нет и вы решите использовать второй вариант, то в самом начале скрипта разместите следующий код:
<?php 
  ob_start
();
?>
<html>
<head>
<title></title>
</head>
<body>
..................
..................


P.S. пока печатал ответ, тоже самое уже сказали))

  Ответить  
 
 автор: gvidon   (06.04.2010 в 09:04)   письмо автору
 
   для: tihonko   (06.04.2010 в 08:57)
 

Огромное СПАСИБО tihonko !!!! .
Я включил буферизацию и все заработало :)
Временно буду использовать буфферизацию но немного позже подумаю о переделке скрипта .

  Ответить  
 
 автор: alexey_tihonenko   (06.04.2010 в 09:23)   письмо автору
 
   для: gvidon   (06.04.2010 в 09:04)
 

Пожалуйста!

  Ответить  
 
 автор: Trianon   (06.04.2010 в 13:19)   письмо автору
 
   для: tihonko   (06.04.2010 в 08:57)
 

>Нужно вывод перед отправкой сложить в буфер.
>Тогда будет неважно в какой последовательности у вас в коде фигурируют заголовки и вывод - PHP все равно ничего не отправит до того момента, пока не исполнит весь скрипт.

Это, мягко говоря, несовсем так.
Размер буфера ограничен.

  Ответить  
 
 автор: tihonko   (06.04.2010 в 15:45)   письмо автору
 
   для: Trianon   (06.04.2010 в 13:19)
 

Перечитал мануал:
http://www.php.net/manual/en/function.ob-start.php

Но там в описании функции сказано лишь то, что у нее есть второй необязательный параметр $chunk_size и если он принимает значение по умолчанию(0), то вывод будет отправлен только в конце работы скрипта. Отдельной директивы chunk_size в php.ini тоже не нашел.

Скажите пожалуйста, какой величиной ограничен размер буфера и как ее регулировать?

  Ответить  
Rambler's Top100
вверх

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