Почему перенаправление заголовка php вызывает предупреждение? - PullRequest
0 голосов
/ 02 апреля 2011

Предупреждение появляется, когда я использую перенаправление header (Location: ...) в php почему?

это предупреждение:

Предупреждение: невозможно изменить информацию заголовка - заголовкиуже отправлено (вывод начался с ~ \ index.php: 51) в ~ \ addMarket1.php в строке 26

, и это код:

$folder = 'images/markets/';
$orig_w = 500;

if( isset($_POST['submit']) )
{
    $imageFile = $_FILES['image']['tmp_name'];
    $filename = basename( $_FILES['image']['name']);

    if(strstr($_FILES["image"]["type"],"image")){
            list($width, $height) = getimagesize($imageFile);

            $src = imagecreatefromjpeg($imageFile);
            $orig_h = ($height/$width)* $orig_w;

            $tmp = imagecreatetruecolor($orig_w, $orig_h);
            imagecopyresampled($tmp, $src, 0,0,0,0,$orig_w,$orig_h,$width,$height);
            imagejpeg($tmp, $folder.$filename,100);

            imagedestroy($tmp);
            imagedestroy($src);

            $filename = urlencode($filename);
            mysql_query("insert into photos (`image`) values ('$filename')");   
        //  echo '<meta http-equiv="refresh" content="0;URL=../Admin/?p=crop&filename=$filename&height=$orig_h">'; 
        header("Location: ../Admin/crop.php?filename=$filename&height=$orig_h");
    }
    else
    echo "The file uploaded is not image. Please choose jpg, png,gif or png image !";
}

Ответы [ 6 ]

2 голосов
/ 02 апреля 2011

РЕДАКТИРОВАТЬ: его код правильный. Он пропал без вести exit; после header('Location:...'); Таким образом, он все еще отправляет заголовки для текущего документа, когда он пытается сделать перенаправление 302.

2 голосов
/ 02 апреля 2011

Перенаправление выполняется с использованием HTTP [Заголовок] 2 (Location один) .

Заголовки HTTP можно отправлять только до того, как содержимое будет : при создании страницы сервер будет:

  • отправляет заголовки HTTP
  • затем отправьте тело ответа HTTP

Так работает протокол HTTP - с этим ничего не поделаешь.

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


Два возможных решения:

  • Лучший вариант: не отправлять вывод (даже ни одного пробела) перед попыткой отправки заголовков HTTP
  • Бит hacky : Используйте буферизацию вывода , чтобы вывод сохранялся в ОЗУ, а не отправлялся в браузер - что означает, что заголовки HTTP все еще будет отправлено, даже если вывод начал генерироваться.

Примечание: вы можете использовать функцию headers_sent(), чтобы определить, отправлены ли уже заголовки HTTP.

1 голос
/ 02 апреля 2011

Убедитесь, что ваши начальные <?php начинаются с самого начала файла (спецификации UTF могут быть неприятными в этом аспекте, но это не так);и убедитесь, что нет ?>, пока вы не закончили с заголовками.

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

PS: Также проверьте полный вывод (просмотреть исходный код), предшествующий этому предупреждению.Знание того, что выводится, может помочь выяснить почему выводится;)

0 голосов
/ 15 ноября 2011

Вы можете добавить

ob_start();

вверху документа, и он исчезнет

0 голосов
/ 02 апреля 2011

Расширение моего комментария выше:

Учитывая позицию вашего закомментированного тега <meta>, я готов поспорить, что вы уже вывели какой-то HTML-код до того, как ваш скрипт достигнет вызова header().

Нельзя отправлять ЛЮБЫЕ данные в браузер до вызова header().

0 голосов
/ 02 апреля 2011

Из руководства по PHP:

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

Так что, если вы хотите перенаправить, он должен быть первым, что ваш скрипт, или выводит HTML.

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