Перенаправление заголовка PHP не работает
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">
12 ответов
Посмотрите внимательно на ваши включения - возможно, у вас есть пустая строка после закрытия?>?
Это приведет к отправке некоторого буквального пробела в качестве вывода, что не позволит вам делать последующие вызовы заголовка.
Обратите внимание, что разрешено оставлять close?> Вне включаемого файла, что является полезным способом избежать этой проблемы.
(РЕДАКТИРОВАТЬ: просматривая заголовок, вам нужно избегать вывода HTML, если вы хотите выводить заголовки или использовать буферизацию вывода для его захвата).
Наконец, как указывает справочная страница PHP для заголовка, вы должны действительно использовать полные URL для перенаправления:
Примечание: HTTP/1.1 требует абсолютного URI в качестве аргумента для Location: включая схему, имя хоста и абсолютный путь, но некоторые клиенты принимают относительные URI. Обычно вы можете использовать $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] и dirname(), чтобы самостоятельно создать абсолютный URI из относительного:
ОБЩИЕ ПРОБЛЕМЫ:
1) Там не должно быть никакого выхода (т.е. echo...
или части HTML) доheader(...);
команда.
2) послеheader(...);
ты должен использоватьexit();
3) Удалите всепробелы(илиперевод строки) перед <?php
и после?>
теги.
4) Проверьте этот файл php (а также другие.php
файлы, которыеinclude
г) - они должны иметьUTF8 без кодировки BOM(а не только UTF-8). Поскольку по умолчанию UTF8 добавляет невидимый символ в начало файла (называемого " спецификацией "), так что вам следует избегать этого!!!!!!!!!!!
5) Используйте ссылку 301 или 302:
header("location: http://example.com", true, 301 ); exit;
6)Включить отчет об ошибках. И скажи ошибку.
7) Если ничего из вышеперечисленного не помогает, используйте перенаправление JAVASCRIPT (однако не рекомендуется), это может быть последним шансом в пользовательских случаях...:
echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
В качестве альтернативы, чтобы не думать о переводе строки или пробела где-то в файле, вы можете буферизовать вывод. В основном, вы звоните ob_start()
в самом начале файла и ob_end_flush()
в конце. Более подробную информацию вы можете найти в описании функции запуска php.net.
Редактировать: если вы используете буферизацию, вы можете выводить HTML до и после функции header() - буферизация будет игнорировать вывод и возвращать только заголовок перенаправления.
Попробуй это:
**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;
Посмотрите на /Applications/MAMP/htdocs/testygubbins/OO/test/header.php строку 15.
На этой позиции он делает вывод. Почини это.:)
Если я правильно понимаю, что-то уже отправлено из header.php (может быть, немного HTML), поэтому заголовки были установлены. Вам может потребоваться перепроверить файл header.php для любой части, которая может выводить HTML или пробелы перед первым
РЕДАКТИРОВАТЬ: Теперь я уверен, что это вызвано из header.php, так как у вас есть эти выходные данные HTML. Вы можете исправить это, удалив "include('header.php');" и скопируйте следующий код в ваш файл.
include('class.user.php');
include('class.Connection.php');
$date = date('Y-m-j');
Не включайте header.php. Вы не должны выводить HTML, когда вы собираетесь перенаправить.
Создайте новый файл, например. "Pre.php". Поместите это в это:
<?php
include('class.user.php');
include('class.Connection.php');
?>
Затем включите его в header.php вместо включения двух других файлов. В form.php включите pre.php вместо header.php.
Где-то в php-файлах может быть какой-то "простой текст", который интерпретируется как вывод скрипта. Это может быть даже символ новой строки до или после спецификатора тега php script (меньше + знак вопроса + "php").
Кроме того, если я правильно помню, согласно спецификации http, заголовок "Location" принимает только полные URL, а не относительные местоположения. Имейте это в виду тоже.
Ваше включение производит вывод, тем самым делая невозможным отправку http-заголовка позже. Два варианта:
- Переместите вывод куда-нибудь после включения.
- Используйте буферизацию вывода, то есть в самом начале вашего скрипта, поместите ob_start(), и в конце, поместите ob_flush(). Это позволяет PHP сначала ожидать сбора всех выходных данных, определять, в каком порядке их отображать, и выводить их.
Я бы порекомендовал вам изучить второй вариант, поскольку он делает вас гораздо более гибким.
Также попробуйте включить include_once() вместо include(), который также может работать
Также смотрите текстовую кодировку вашего php файла. Мой был UTF-8
с BOM
и это помешало скрипту работать. Но теперь работает без нареканий после снятия BOM
...
Попробуйте перенаправить с помощью JavaScript:
<script type="text/javascript">
window.location.href='index.php';
</script>