Header() работает после вывода данных. Как такое возможно?

MOHAPX

Новичок
Header() работает после вывода данных. Как такое возможно?

Насколько я знаю, инструкция header() не работает после вывода данных, но работая с системой php-nuke заметил, что срабатывает такой вариант:
PHP:
if (...) {
echo "text";
$db->sql_query(...);
header("location: file.php");
}
И все работает! Как можно это объяснить и, по возможности повторить в своих скриптах?

Спасибо всем, кто ответит...
 

SafeWay

Guest
в самом начале скрипта напиши ob_start(); и в конце ob_end_flush(); - и буит всё окей )
 

neko

tеam neko
не надо этого делать
пользы никакой -- зато вред огромный
 

SafeWay

Guest
Originally posted by neko
не надо этого делать
пользы никакой -- зато вред огромный
Польза есть, а какой вред?
у меня стоит вначале:
ob_start("ob_gzhandler"); в чём трабла?
 

neko

tеam neko
пользуйся модулями (mod_gzip/mod_deflate)
они весь контент не буферизуют, там буфер маленький (и настраиваемый)
правда это уменьшает компрессию, но не сильно

или еще
zlib.output_compression
в php.ini

-~{}~ 24.08.04 10:00:

а делать буферизацию ради возможности в любом месте посылать заголовки -- ламерство
 

alpine

Новичок
/*
PHP:
if (...) { 
echo "text"; 
$db->sql_query(...); 
header("location: file.php"); 
}
*/
А какой смысл в этом куске кода?
 

SafeWay

Guest
Originally posted by neko


а делать буферизацию ради возможности в любом месте посылать заголовки -- ламерство
Окей, учту, но что если надо посылать заголовки в любом месте?
 

neko

tеam neko
alpine
никакого абсолютно
но я могу объяснить как он появился на свет
человек который это писал -- абсолютно не имел понятия, что у него получится должно в результате

-~{}~ 24.08.04 10:11:

SafeWay
что если надо посылать заголовки в любом месте?
так не бывает, что надо
бывает такой стиль наипсания скриптов -- когда очень хочется это делать
а чтобы так прям "надо" -- не бывает
 

impossible

Новичок
если требуется вывести что-то перед тем как переправить пользователя в другое место, кажись луше так:
PHP:
echo '<script language="javascript" type="text/javascript">
<!--
setTimeout("location.href=\'туды=)\'",3000);
-->
</script>';
 

SafeWay

Guest
Я предпочитаю стправляться средствами PHP имхо, JS в браузере может быть вырублен.
 

alpine

Новичок
SafeWay
На этом форуме видел как сделано когда пост отправляешь?
 

Stefix

Guest
impossible

а нафига setTimeout? После echo надо ставить die;

еще вариант, если портировать что-то такого типа ставить: вместо echo создать функцию echo_my и глобальную переменную $html.


Например
PHP:
$html="";
function echo_my ($str)
{
global $html;
$html .= $str;
};
echo_my ("text<br />\n");
mysql_query ("update mytable set mytext='a' where Id=1");
echo_my ("another_text<br />\n");
header ("Location:file.php");
echo $html;
die;
 

alpine

Новичок
Stefix
/*
echo $html;
*/
А куда это будет выводится в таком случае? Я что этот $html увижу?
 

Фанат

oncle terrible
Команда форума
alpine
на этом форуме сделано так потому, что раньше браузеры не понимали локейшен с решеткой.
Выводить надпись на пару секунд, действительно, нет смысла.

-~{}~ 24.08.04 11:24:

header ("Location:file.php");
echo $html;
Да, маразм крепчал.
 

Stefix

Guest
ой, наоборот! :)

-~{}~ 24.08.04 10:32:

Фанат, любишь глумиться над чужими ошибками?
Если-бы никто не ошибался, то смысла бы в человечестве не было.
 

alpine

Новичок
Фанат
А допустим правильно будет делать
PHP:
echo '...'; // Вывод чего-то на экран
sleep(5);
header('Location: some_where.php');
?
 

neko

tеam neko
Stefix
да хоть наоборот, хоть как это бред
ты либо выводишь что-то
либо перенаправлешь браузер

alpine
см. выше

-~{}~ 24.08.04 11:38:

alpine
см. также phpfaq.ru/na_tanke
 
Сверху