2012-04-13 2 views
0

Я получил это предупреждение в PHP:как игнорировать ошибки перенаправления в PHP

Cannot modify header information - headers already sent by (output started at 

Когда я установил в MySQL, Apache и PHP отдельно, но когда я использую WAMP предупреждение не существует и перенаправляет страницы изящно.

Я уже пытался настроить отчет об ошибках только для отображения ошибок, а не предупреждений, и произошло то, что предупреждение не появилось, но страница также не перенаправлялась.

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

+3

Мой код очень сложный и содержит ошибки. Давайте не будем исправлять ошибки, но спрячем их под ковром! ... Шутки в сторону? Есть причина, по которой вы получаете эту ошибку. Узнайте, зачем и зачем. –

+0

Это не хорошая практика, и я, конечно, надеюсь, что вы передумаете. Найдите ошибки и исправьте их. – Leonard

ответ

2

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

Исправление ошибки, выводимой из файла, имевшегося в сообщении об ошибке, является лучшим способом исправить это. Удалять закрытие «?>» из файлов, когда это не нужно, может помочь.

1

Это ужасная практика, но просто установить

error_reporting(0); 

в начале вашего скрипта. В противном случае setit в php.ini

display_errors = Off 

EDIT - возможно, вы выдает что-то перед перенаправлением. Я когда-то провел три дня, отлаживая это, и причина иногда является пробелом в конце файлов или тем фактом, что вы выведете некоторый HTML-код в браузер перед перенаправлением.
Я обычно никогда не закрываю тег php, чтобы избежать этого

+0

будет ли это иметь аналогичный эффект с установкой display_errors = Off в php.ini? Если да, то это также не сработает, ошибка не будет отображаться, но страница также не будет перенаправлена. –

+0

@KyokaSuigetsu, вероятно, вы выводите что-то перед перенаправлением. Я когда-то провел три дня, отлаживая это, и причина иногда является пробелом в конце файлов: –

+0

Я также удалил все пробелы в связанных файлах. Но я все еще получаю эту ошибку. Я не знаю, какая конфигурация wampserver сделала на их установке php, но она просто волшебным образом работает без проблем. –

1

Даже если вы не покажете свою ошибку, ваше приложение не будет работать. Это потому, что, как и в случае ошибки, заголовки уже отправлены. Это означает следующее: Браузер запрашивает ваш php-файл на сервере. Затем сервер выполняет это и отправляет обратно полученный html. Эта ошибка сообщает вам, что вы отправляете что-то обратно в браузер после того, как вы уже отправили результат своего php-файла. Поэтому я предлагаю вам попытаться исправить ошибку, полученную вами, вместо того, чтобы просто не показывать ее.

1

Вы не можете «игнорировать» это предупреждение и перенаправление. Предупреждение говорит так четко:

Не удается отправить заголовки! Заголовки уже отправляются по выходу!

Это означает, что заголовок (заголовок Location не может быть отправлен, так как выход был уже отправлен. (Заголовки могут быть посланы только перед любом и все выхода).

Пожалуйста RTM, вы необходимость к исправить ваши ошибки, не игнорировать их.


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

<?php //Note the space before the opening tag! 
header("Location: this-will-fail.html"); 
?> 
0

Пожалуйста, обратите внимание, что эта ошибка указывает, где именно в вашем коде, вы начали выводить данные в браузер (см output started at ...1, обратите внимание на конечные пробелы \ г \ п, язычки & пространства). Теоретически, выключение отчета об ошибках не приведет к перенаправлению страницы, поскольку заголовки уже отправлены и, следовательно, не могут быть изменены или добавлены.

Что нужно делать, если вам нужно, чтобы перенаправить данные уже посланных что-то вроде этого:

if (headers_sent()) // Check if the headers were already sent 
{ 
    echo("<script>document.location.href='$url';</script>"); // Use client side redirect 
    die(); // Stop here 
} 
else 
{ 
    header("Location: $url"); // Use server side redirect 
} 

Но лучше всего было бы, чтобы выяснить, где выход начался и фиксации, что (если это возможно).

Смежные вопросы