Re: Location ....

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, December 28, 2005 8:15 am, Christian Ista wrote:
> PHP? I tried this code : header("Location: mypage.php");
>
> But in some case, I have error message "headers already sent". Then I

You know the old saying, "You can't step in the same stream twice"?

Think about it.

Really think about it.

Now...

The data being sent to the browser from Apache/PHP is a stream.

Its raw output looks something like this:

---------------------------------------------------------------
HTTP/1.1 200 OK
Date: Fri, 30 Dec 2005 19:52:44 GMT
Server: Apache/1.3.34 (Unix) DAV/1.0.3 PHP/4.4.1 mod_ssl/2.8.25
OpenSSL/0.9.7d-p1
X-Powered-By: PHP/4.4.1
Connection: close
Content-Type: text/html

<HTML>
        <HEAD>
                <TITLE>Lynch Interplanetary Enterprises</TITLE>
        </HEAD>
.
.
.
</HTML>
---------------------------------------------------------------
Now, pay VERY close attention to that blank line right after the
Content-type: text/html
line.

That BLANK line marks the end of the "headers"

Everything above the blank line is in the "headers"
Everything below is the "body" of the HTTP, which is what the browser
shows you with "View Source"

Now, imagine all that output, headers and blank line and body,
streaming out from your server, like water from a garden hose.

There's a lot you can do to it before the water gets shot out the end
of the nozzle.

You could add a water heater and treat your lawn to a warm shower
instead of cold.

You could add a filtration system and give your lawn distilled water.

You could add a plant food system to give it yummy chemicals.

Buuuuuuuuuuuuuuuuuuuuuut

Once that water leaves the host, you don't have a lot of control over it.

It's gone.

Beyond re-calling.

In the same way, once PHP sends the BLANK LINE to denote the end of
headers, you can't send more headers.

This works:

---------------------------------------------------------------
HTTP/1.1 200 OK
Date: Fri, 30 Dec 2005 19:52:44 GMT
Server: Apache/1.3.34 (Unix) DAV/1.0.3 PHP/4.4.1 mod_ssl/2.8.25
OpenSSL/0.9.7d-p1
X-Powered-By: PHP/4.4.1
Connection: close
Content-Type: text/html
Location: mypage.php

<HTML>
        <HEAD>
                <TITLE>Lynch Interplanetary Enterprises</TITLE>
        </HEAD>
.
.
.
</HTML>
---------------------------------------------------------------

This can NOT work:

---------------------------------------------------------------
HTTP/1.1 200 OK
Date: Fri, 30 Dec 2005 19:52:44 GMT
Server: Apache/1.3.34 (Unix) DAV/1.0.3 PHP/4.4.1 mod_ssl/2.8.25
OpenSSL/0.9.7d-p1
X-Powered-By: PHP/4.4.1
Connection: close
Content-Type: text/html

<HTML>
Location: mypage.php
        <HEAD>
                <TITLE>Lynch Interplanetary Enterprises</TITLE>
        </HEAD>
.
.
.
</HTML>
---------------------------------------------------------------

Look carefully for the position of the line
Location: mypage.php

See the difference?

If you try to call the header() function AFTER some content has been
sent, then you get the error message.

Move the header() line earlier in your PHP code, and it will work fine.

PS
Blank lines and spaces COUNT as "output".

So this:
<?php $x = 1; ?> <?php header("Location: mypage.php");?>
will NOT work because that space "counts"

This will work:
<?php $x = 1; ?><?php header("Location: mypage.php");?>

Similarly, watch out for BLANK LINES after the last ?> in your files.

They will trip you up for header()

-- 
Like Music?
http://l-i-e.com/artists.htm

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux