PHP перенаправление без заголовка () или мета - PullRequest
4 голосов
/ 22 января 2011

Я пытаюсь создать страницу, которая выполняет некоторые действия с базой данных, а затем перенаправляет пользователя обратно на страницу, с которой он пришел.Проблема в том, что я использую функцию require() для подключения к базе данных, поэтому заголовки уже отправлены.О метатеге не может быть и речи, поскольку я хочу, чтобы он выглядел так, как будто все процессы выполняются со страницы, с которой они пришли.Какие-нибудь советы?Есть ли способ, которым я могу использовать require() и header() или мне нужно сбросить один?Есть ли альтернатива header()?

Ответы [ 6 ]

7 голосов
/ 22 января 2011

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

С другой стороны, простое require использование другого файла не приведет к генерации каких-либо заголовков / содержимого, если только этот сценарий не отправит их. Наиболее распространенная «скрытая» причина этого - незаметные пробелы до или после тегов <?php ?>.

4 голосов
/ 22 января 2011

Как отметил Артефакто, подключение к базе данных не должно требовать вывода. Исправьте все, что вы включаете (например, database_connect.php), чтобы не выводить. См. этот поиск по проблеме «заголовки уже отправлены», которая может помочь вам найти «скрытый» вывод.

2 голосов
/ 22 января 2011
ob_start(); // start output buffering
echo "<html......"; // You can even output some content, it will still work.
.
.
.
.
.
header("Location: mypage.php");
ob_flush(); //flush the buffer

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

1 голос
/ 22 января 2011

Вы не можете отправлять заголовки после того, как какой-либо контент уже был отправлен.Переместите вызов header() до вызова require().

0 голосов
/ 22 января 2011

Можно использовать header() с require(), когда я использую буферизацию вывода.Это означает, что весь сценарий буферизуется и сначала отправляется, когда сценарий заканчивается.

Я сделал это, выполнив это

ob_start("ob_gzhandler");  //begin buffering the output

require_once('/classes/mysql.php');

// Some code where I access the database.

header('/somepage.php');
exit;

ob_flush(); //output the data in the buffer
0 голосов
/ 22 января 2011

Вы не можете отправлять заголовки после того, как какие-либо данные были отправлены клиенту.

Однако использование require не означает, что вы что-то выводите.Если я понимаю ваше право, вы можете включить файлы базы данных, выполнить ваши запросы и затем перенаправить пользователя.Это совершенно верно.

Если вам нужно отправить какой-то вывод (зачем вам нужно перенаправить?), Другой вариант - использовать буферизацию вывода.Используя буферизацию вывода, вы не отправляете данные в браузер при их отображении, но сохраняете их в буфере.Данные будут отправлены, когда вы позвоните ob_end_flush или достигнете конца сценария.После ob_end_flush вы не сможете отправлять новые заголовки.Вы начинаете буферизацию вывода с ob_start .

...