Проблема CakePHP «Не удается изменить информацию заголовка» НЕ является пробелом - PullRequest
0 голосов
/ 22 июня 2011

Вот ошибка:

Warning (2): Cannot modify header information - headers already sent by (output started at /usr/share/php/cake/basics.php:111) [CORE/cake/libs/controller/controller.php, line 640]

$status =   "Location: http://mydomain.com/blog/index"

header - [internal], line ??
Controller::header() - CORE/cake/libs/controller/controller.php, line 640
Controller::redirect() - CORE/cake/libs/controller/controller.php, line 621
PostsController::add() - APP/controllers/posts_controller.php, line 25
Object::dispatchMethod() - CORE/cake/libs/object.php, line 115
Dispatcher::_invoke() - CORE/cake/dispatcher.php, line 227
Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 194
[main] - APP/webroot/index.php, line 88

Вот код для posts_controller.php:

function add() {
    if (!empty($this->data)) {
        $this->Post->create();
        if ($this->Post->save($this->data)) {
            $this->Session->setFlash(__('Post saved!!', true));
            $this->redirect(array('action'=>'index')); // line 25
        } else {
        }
    }
    $tags = $this->Post->Tag->find('list');
    $statuses = $this->Post->Status->find('list');
    $this->set(compact('tags', 'statuses'));
}

Вот строка 111: echo "\n<pre class=\"cake-debug\">\n";

Вывод debug_print_backtrace() в basics.php файл основного торта: http://pastebin.com/fBFrkYsP

Я просмотрел все файлы, которые я отредактировал (в отличие от тех, которые я только что выпек), и у меня нет пробелов за пределами php скобок (). Я использовал этот скрипт: Найти все файлы с пустым или WS в BOF или EOF .

Мой текстовый редактор настроен на UTF-8. В основном проблема исчезает, когда я закомментирую строку 25 (отмечена выше с комментарием). Но я должен быть в состоянии использовать перенаправление ... Кто-нибудь может указать мне правильное направление?

EDIT: добавлена ​​строка на 111 выше; РЕДАКТИРОВАТЬ 2: добавлен вывод debug_print_backtrace ()

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

640 - начало цикла foreach в stripslashes_deep()

111 - это debug()

Похоже, вы вызываете функцию debug() где-то в вашем коде?

Также в вашем коде это:

заголовок -

, а не =

0 голосов
/ 22 июня 2011

Не только пробел, но и любой вывод, например echo, который вы делаете, создает вывод, который в дальнейшем не позволит использовать header().

Вы можете обойти это, включив буферизацию вывода по умолчанию:

; output_buffering
;   Default Value: Off
;   Development Value: 4096
;   Production Value: 4096

output_buffering = 4096

Но только если (случайный) вывод меньше размера буфера.

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

$url = 'http://absolut.http/uri';
if (!headers_sent()) {
   header('Location: '.$url, 301);
} else {
   printf('<meta http-equiv="Location" content="%s>"', $url);
}
printf('<h1><a href="%s">Moved.</a></h1>', $url);
exit;
0 голосов
/ 22 июня 2011

Помните, что header () необходимо вызывать перед отправкой любого фактического вывода, либо обычными тегами HTML, пустыми строками в файле, либо из PHP.

В вашем случае вы используете echo в строке 111, что является частью "или из PHP" выше.

Поскольку эта строка, похоже, из основного пакетаЯ полагаю, вы вызываете функцию, которая каким-то образом вызывает этот вывод.Вы можете использовать debug_print_backtrace() рядом со строкой 111, чтобы увидеть цепочку вызовов функций, ведущих к вызову echo.

...