эхо после сеанса - PullRequest
       2

эхо после сеанса

1 голос
/ 03 января 2011


У меня есть код ниже:

<?php
session_start();
echo "\n\n";
echo "inputAction.php started";

//echo "<br/><br/>";

$name = $_POST["theUser"];
$passw = $_POST["thePassword"];

if (!strcmp($name, "myPassw") && !(strcmp($passw, "1234")) )
{
    //echo "correct";
    $_SESSION['sessionUser']=$name;
    $_SESSION['sessionPassword']=$passw;
    header("location:a.php");

}
else
{
    //echo "wrong";
    header("Location: index.php");
}

?>

Моя первая попытка здесь echo "inputAction.php started"; после session_start();

Однако я обнаружил, что получил ошибку:

inputAction.php started
Warning: Cannot modify header information - headers already sent by (output started at /Library/WebServer/Documents/01032011/inputAction.php:4) in /Library/WebServer/Documents/01032011/inputAction.php on line 16

Но я замечаю, что все будет хорошо, если я закомментирую эхо после session_start();

<?php
session_start();
//echo "\n\n";
//echo "inputAction.php started";

//echo "<br/><br/>";

$name = $_POST["theUser"];
$passw = $_POST["thePassword"];

if (!strcmp($name, "myPassw") && !(strcmp($passw, "1234")) )
{
    //echo "correct";
    $_SESSION['sessionUser']=$name;
    $_SESSION['sessionPassword']=$passw;
    header("location:a.php");

}
else
{
    //echo "wrong";
    header("Location: index.php");
}

?>

Что случилось?Может кто-нибудь объяснить, почему echo делает ошибку?
Означает ли это, что это правило не использовать echo после session_start?
Любые другие способы печати журналов (альтернативы echo), которые яможно использовать после session_start?

Ответы [ 5 ]

3 голосов
/ 03 января 2011

Нет, правило состоит в том, чтобы ничего не выводить до header.И если вы внимательно посмотрите на сообщение об ошибке, оно говорит: «Невозможно изменить информацию заголовка […] в строке 16», потому что «вывод начался в […]: 4».

Строка, в которой выводитсяСтарт не обязательно должен быть первым с echo, так как PHP также имеет внутренний буфер, который не сбрасывается при каждом вызове echo.

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

<?php
ob_start();
session_start();
// …
1 голос
/ 03 января 2011

Это предупреждение выдается при вызове функции header().Функция header() устанавливает HTTP-заголовок для ответа, который вы отправляете обратно.И HTTP-заголовок должен быть первым в ответе.Никакие другие выходные данные не могут быть отображены перед ними.

Существует много решений этой проблемы.Одним из них является включение буферизации вывода , которая волшебным образом позаботится об этом.Лучшее решение - структурировать ваш код так, чтобы вы ничего не выводили перед любыми вызовами функции header() (или session_start()).Если бы вы использовали какой-то MVC-фреймворк (cakephp, symphony, zend, ...), вам даже не пришлось бы об этом беспокоиться.

Эта проблема решалась здесь много раз (это одна изпопулярные вопросы о PHP).Посмотрите на эти результаты поиска .

Также потратьте некоторое время на чтение сообщений об ошибках PHP.В сообщении об ошибке, которое вы указали, четко указано, что ошибка была «выдана» в строке header(), и с какой строки начался вывод.

1 голос
/ 03 января 2011

Вы уже отправили информацию в браузер с помощью \n\n, поэтому браузер создал страницу с заголовками по умолчанию, как если бы вы отправили ей какой-либо текст (даже один символ).

Браузер думает: «Хорошо, это просто открытый текст, поэтому я сделаю из HTML лучшее, что я знаю, и выведу его».При этом создаются заголовки и тело документа, поэтому все остальные заголовки, которые вы хотите отправить, игнорируются, пока этот процесс не будет перезапущен (с обновлением).

Чтобы этого не произошло,не отправляйте информацию в браузер, пока вы не будете готовы к тому, чтобы начать создавать страницу.

Буферизация объектов - это тема средней сложности, для восстановления которой потребуется некоторое время, если вы еще этого не сделали.это раньше.

0 голосов
/ 03 января 2011

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

session_start();
echo '<head><meta http-equiv="refresh" content="5;url=http://www.whatever.com/a.php"></head>';
echo "\n\n";
echo 'inputAction.php started';
etc.etc.etc.

Но, конечно, вам все равно придется проверить входные данные, чтобы определить, что означает url =, что означает, что вы должны либо протестировать дважды, либо просто включить эхо в ifs в любом случае.Конечно, не имеет значения, где находится исходное эхо, если используется ob_start (), потому что он будет выводиться только после завершения работы скрипта.

Кроме того, вам действительно не следует хранить пароли в сеансе.

0 голосов
/ 03 января 2011

Поскольку вы используете функцию header () в своем операторе else, каждый раз, когда ваш код входит туда, он пытается перенаправить вашу страницу.Однако, как сказал Гамбо, header () выдаст ошибку, если в браузер будет выведено что-либо перед вызовом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...