2014-02-02 2 views
0

У меня есть страница, структурированная, как показано ниже, и у меня возникают проблемы с перенаправлением на работу. Эта страница получает идентификатор из URL-адреса и использует его в запросе. Если нет совпадения, просто переадресовывайтесь на другую страницу.Использование header() для перенаправления после использования include()

Я получаю «заголовки уже отправленные ошибки» из-за включения. Мне нужно, чтобы они были там независимо. Есть ли другой способ сделать перенаправление, если результат запроса пуст?

include('somepage.php'); 

$id = $_GET['id']; 
$query = mysql_query("My query is here"); 

if(mysql_num_rows($query)==0) { header('Location:htp://example.com'); } 

Я пробовал использовать exit(); и различные функции обработки останова.

somepage.php:

<html> 
<head> 
(standard html) 
include('sql-connect.php'); 
</head> 

<body> 
(code to format the header portion of the site) 
+0

Почему включают должны быть там? Вы выводите HTML в somepage.php? – codeaddict

+0

Что делает какая-то страница - это, очевидно, выводит что-то - не делайте этого, и вы должны иметь возможность перенаправить –

+0

pleae, покажите нам somepage.php. У меня есть выход перед заголовком, он не будет работать. –

ответ

1

Вы можете поставить ob_start() в начале файла, так что ваш файл выглядит следующим образом:

<?php 
ob_start(); 
include 'somepage.php'; 

$id = $_GET['id']; 
$query = mysql_query("My query is here"); 

if(mysql_num_rows($query)==0) { header('Location:htp://example.com'); } 

Кроме того, вы можете повторить HTML редирект:

<?php 
if(mysql_num_rows($query)==0) { echo '<meta http-equiv="refresh" content="0; url=http://example.com/">'; die(); } 
+0

СПАСИБО! Так просто. Я могу принять ваш ответ примерно через 10 минут. –

+0

Я использовал только ob_start(); –

+1

В свободное время читайте об этом в http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php, как указано в @Hamza –

1

Вам нужно добавить ob_start() в начале файла, и если это все еще не работает, тогда вы тоже d, чтобы добавить ob_flush();, чтобы полностью очистить старый заголовок.

flush(); // Flush the buffer 
    ob_flush(); 
    header("Location: htp://example.com"); 
+0

Спасибо! Это верно, как сказал Мартин перед вами. –

+2

Как знание, прочитайте ответ Марио на http: // stackoverflow.ком/вопросы/8028957/как-к-FIX-заголовки, уже отправлены-ошибка-в-PHP – Hamza

0

Вы можете иметь пустую строку после закрытия?> Это вызовет некоторые буквальных пробелов быть отправлены в качестве выходного сигнала, предотвращая вас от последующих вызовов заголовков. Обратите внимание, что законно оставить закрытие?> Off include-файла, что является полезной идиомой для предотвращения этой проблемы.

ob_start() может исправить вашу проблему.

<html> 
<?php 
/* This will give an error. Note the output 
* above, which is before the header() call */ 
header('Location: http://www.example.com/'); 
exit; 
?> 
0

«заголовки уже прислал сообщение об ошибке» означает, что ваш скрипт (somepage.php) уже послал заголовки в браузер, так что вы не можете изменить эти заголовки и перенаправить пользователя на другой URL.

Наилучшим решением является изменение «включает» оператор и ваша проверка:

$id = $_GET['id']; 
$query = mysql_query("My query is here"); 

if(mysql_num_rows($query)==0) { header('Location:htp://example.com'); } 

include('somepage.php'); 

Кроме того, вы можете предотвратить ваш somepage.php от отправки каких-либо данных клиенту.

Второй вариант заключается в использовании функции ob_start(), ob_get_contents(), ob_end_clean():

ob_start(); 
include('somepage.php'); 

$id = $_GET['id']; 
$query = mysql_query("My query is here"); 

if(mysql_num_rows($query)==0) { header('Location:htp://example.com'); } 
$content = ob_get_contents(): 
ob_end_clean(); 
echo $content; 
Смежные вопросы