|
Posted by Rik on 08/13/07 09:49
On Mon, 13 Aug 2007 11:35:59 +0200, ofiras <ofiasu@gmail.com> wrote:
> Hii everyone,
> I've been programming in php for a long time, and the cookies have
> always been a trouble for me.
> When I have headers before the cookies set, I get a problem.
> Even if I leave space on the first row before I set the cookie, and
> there is nothing else,
> It says I have headers before.
> Is it like that for everyone, or is it just my host?
> If so, is there anything that I can do to set cookies anywhere I want?
Read up on the HTTP protocol. A response of a server is divided into
headers & body (not to be confused with an HTML head & body). Something
like this:
(header)
200 OK
Content-length: xxx
(...more headers)
(empty line, followed by body)
<!DOCTYPE html>
<html>
....etc
As your script produces (non-header) output, the empty line, which
seperates the headers from the body of the response, is sent to the
browser, followed by whatever output you specified further. A cookie has
to be set in the headers (with a Set-Cookie statement), and there's no way
of going back as soon as this empty line has been sent.
If you have to set a cookie somewhere, consider these options:
1. Do almost all processing _before_ generating output. As soon as you get
out of an HTML mindset (and those atrocious files mixing HTML & PHP like
there's no tomorrow) this is actually quite easy.
2. Capture output in a variable, and only echo / print it as soon as you
know no further processing/header() or setcookie() calls are needed.
3. Turn on output buffering (ob_start()) at the start of the script.
(Which will effectively do something like (2) only with somewhat less
control).
The last one is a bit of cheat, and does not promote good code writing. It
is however most simple one. Drawback is that on a slow loading page, it
will take a while to get even a bit of content, while with output
buffering of it can load 'as you go' (depending on how your browser
handles it offcourse). If possible, go for (1).
--
Rik Wasmus
[Back to original message]
|