Перенаправление PHP Header не работает

include('header.php');

$name = $_POST['name'];
$score = $_POST['score'];
$dept = $_POST['dept'];

$MyDB->prep("INSERT INTO demo (`id`,`name`,`score`,`dept`, `date`) VALUES ('','$name','$score','$dept','$date')");
// Bind a value to our :id hook
// Produces: SELECT * FROM demo_table WHERE id = '23'
$MyDB->bind(':date', $date);
// Run the query
$MyDB->run();

header('Location:index.php');
    exit;

Приведенный выше код продолжает давать мне проблему с перенаправлением. Ошибка следующая:

Предупреждение: невозможно изменить информацию заголовка - заголовки, уже отправленные (вывод     началось с /Applications/MAMP/htdocs/testygubbins/OO/test/header.php:15) в     /Applications/MAMP/htdocs/testygubbins/OO/test/form.php в строке 16.

Я полностью смущен этим. Кто-нибудь знает, что я должен делать, чтобы заставить его работать?

ИЗМЕНИТЬ

Код header.php:

<?php
include('class.user.php');
include('class.Connection.php');

$date = date('Y-m-j');

?>
<html>
<head>
    <link rel=StyleSheet href="css/style.css" type="text/css" media=screen>
    <title>Test</title>
</head>
<body>
<div id="page">

Ответ 1

Посмотрите внимательно на свои варианты - возможно, у вас есть пустая строка после закрытия? > ?

Это приведет к тому, что некоторые литералы будут отправляться как выходные данные, что предотвратит последующие вызовы заголовков.

Обратите внимание, что законно оставить закрытие? > с включенным файлом, что является полезной идиомой для предотвращения этой проблемы.

(EDIT: глядя на ваш заголовок, вам нужно избегать выполнения любого вывода HTML, если вы хотите выводить заголовки или использовать буферизацию вывода для его захвата).

Наконец, как указывает справочная страница PHP для заголовка, вы должны действительно использовать полные URL для перенаправления:

Примечание. HTTP/1.1 требует абсолютного URI в качестве аргумента для местоположения: включая схему, имя хоста и абсолютный путь, но некоторые клиенты принимают относительные URI. Обычно вы можете использовать $_SERVER [ 'HTTP_HOST'], $_SERVER ['PHP_SELF'] и dirname() для сделать абсолютный URI от относительного один самостоятельно:

Ответ 2

ОБЩИЕ ПРОБЛЕМЫ:

1) не должно быть никакого вывода (т.е. echo.. или HTML-кодов) перед командой header(.......);. p >

2) удалите любое белое пространство (или новая строка) до <?php и после тегов ?>.

3) ЗОЛОТОЙ ПРАВИЛЬ! - проверьте, поддерживает ли этот файл php (а также, если вы include другие файлы) UTF8 без спецификации (а не только UTF-8). Это проблема во многих случаях (потому что UTF8 закодированный файл имеет что-то особенное в начале файла php, которое ваш текстовый редактор не показывает)!!!!!!!!!!!

4) После header(...); вы должны использовать exit;

5) всегда используют ссылку 301 или 302:

header("location: http://example.com",  true,  301 );  exit;

6) Включить отчет об ошибках. И сообщите об ошибке.

7) Если ни одно из вышеизложенных не помогает, используйте перенаправление JAVSCRIPT (однако, сильно не рекомендуемый метод), может быть последним шансом в пользовательских случаях...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

Ответ 3

Альтернативно, чтобы не думать о новой строке или пространстве где-то в файле, вы можете буферизовать вывод. В принципе, вы вызываете ob_start() в самом начале файла и ob_end_flush() в конце. Вы можете найти более подробную информацию в описание функции ob-start php.net.

Edit: Если вы используете буферизацию, вы можете выводить HTML до и после функции header() - буферизация будет игнорировать вывод и возвращать только заголовок перенаправления.

Ответ 4

Попробуйте следующее:

**ob_start();**

include('header.php');

$name = $_POST['name'];
$score = $_POST['score'];
$dept = $_POST['dept'];

$MyDB->prep("INSERT INTO demo (`id`,`name`,`score`,`dept`, `date`) VALUES ('','$name','$score','$dept','$date')");
// Bind a value to our :id hook
// Produces: SELECT * FROM demo_table WHERE id = '23'
$MyDB->bind(':date', $date);
// Run the query
$MyDB->run();

header('Location:index.php');

**ob_end_flush();**

    exit;

Ответ 5

Посмотрите на /Applications/MAMP/htdocs/testygubbins/OO/test/header.php строку 15.

В этом положении он делает некоторый вывод. Почини это.:)

Ответ 6

Если я правильно понял, что-то уже отправлено из header.php(возможно, некоторый HTML), чтобы заголовки были установлены. Возможно, вам придется перепроверить свой файл header.php для любой части, которая может выводить HTML или пробелы перед первым

EDIT: Теперь я уверен, что он вызван с header.php, поскольку у вас есть эти выходные данные HTML. Вы можете исправить это, удалив "include (" header.php "); и скопируйте следующий код в свой файл.

include('class.user.php');
include('class.Connection.php');

        $date = date('Y-m-j');

Ответ 7

У вас может быть некоторый "простой текст" где-то в php файлах, который интерпретируется как вывод script. Это может быть даже новая строка до или после спецификатора тега PHP скрипт (меньше + вопросительный знак + "php" ).

Кроме того, если я правильно помню, согласно спецификации http, заголовок "Location" принимает только полные URL-адреса, а не относительные местоположения. Имейте это в виду тоже.

Ответ 8

Не включайте header.php. Вы не должны выводить HTML, когда собираетесь перенаправлять.

Создайте новый файл, например. "Pre.php". Поместите это в него:

<?php
include('class.user.php');
include('class.Connection.php');
?>

Затем в header.php включите, что вместо двух других файлов. В form.php включить pre.php вместо header.php.

Ответ 9

В вашем включении выводится вывод, что делает невозможным позднее отправить HTTP-заголовок. Два варианта:

  • Переместите вывод где-нибудь после включения.
  • Используйте буферизацию вывода, то есть в самом начале вашего script, поместите ob_start(), а в конце поместите ob_flush(). Это позволяет PHP в первую очередь ожидать, когда будет собран весь вывод, определить, в каком порядке его отобразить, и выводит его.

Я бы порекомендовал вам изучить второй вариант, так как он сделает вас более гибким.

Ответ 10

также попробуйте include_once() вместо include(), который также может работать

Ответ 11

Также см. текстовое кодирование php. Мой был UTF-8 с BOM, и это предотвратило работу script. Но теперь работает безупречно после удаления BOM...

Ответ 12

Попробуйте перенаправить с помощью JavaScript:

<script type="text/javascript">
  window.location.href='index.php';
</script>