setcookie() defines a cookie to
be sent along with the rest of the HTTP headers. Like other
headers, cookies must be sent before any output from your
script (this is a protocol restriction). This requires that
you place calls to this function prior to any output,
including html and head tags as well as any
whitespace. If output exists prior to calling this function,
setcookie() will fail and return FALSE. If
setcookie() successfully runs, it will return TRUE. This does not indicate whether
the user accepted the cookie.
All the arguments except the
name argument are optional. If only the name
argument is present, the cookie by that name will be deleted
from the remote client. You may also replace an argument with
an empty string ("") in order to skip that argument.
Because the expire and secure arguments are integers,
they cannot be skipped with an empty string, use a zero
(0)
instead. The following table explains each parameter of the
setcookie() function, be sure to read
the Netscape cookie specification for
specifics.
表格 1. setcookie() parameters
explained
Once the cookies have been set, they can be accessed on
the next page load with the
$_COOKIE or $HTTP_COOKIE_VARS
arrays. Note,
autoglobals such as $_COOKIE
became available in PHP
4.1.0. $HTTP_COOKIE_VARS has
existed since PHP 3. Cookie values also exist in
$_REQUEST.
注: If the PHP directive register_globals is set to on then cookie values will also be made into variables. In our examples below, $TextCookie will exist. It's recommended to use $_COOKIE.
Common Pitfalls:
Cookies will not become visible until the next
loading of a page that the cookie should be visible for.
To test if a cookie was successfully set, check for the
cookie on a next loading page before the cookie expires.
Expire time is set via the
expire parameter. A nice way to debug the
existence of cookies is by simply calling print_r($_COOKIE);.
Cookies must be deleted with the same parameters as
they were set with.
Cookies names can be set as array names and will be
available to your PHP scripts as arrays but seperate
cookies are stored on the users system. Consider
explode() or serialize() to set one cookie
with multiple names and values.
In PHP 3, multiple calls to
setcookie() in the same script will be performed in
reverse order. If you are trying to delete one cookie before
inserting another you should put the insert before the
delete. In PHP 4, multiple calls to
setcookie() are performed in the order called.
Some examples follow how to send cookies:
Note that the value portion of the cookie will
automatically be urlencoded when you send the cookie, and
when it is received, it is automatically decoded and assigned
to a variable by the same name as the cookie name. To see the
contents of our test cookie in a script, simply use one of
the following examples:
?php // Print an individual cookie echo $_COOKIE["TestCookie"]; echo $HTTP_COOKIE_VARS["TestCookie"]; // Another way to debug/test is to view all cookies print_r($_COOKIE); ? |
When deleting a cookie you should assure that the
expiration date is in the past, to trigger the removal
mechanism in your browser. Examples follow how to delete
cookies sent in previous example:
You may also set array cookies by using array notation
in the cookie name. This has the effect of setting as many
cookies as you have array elements, but when the cookie is
received by your script, the values are all placed in an
array with the cookie's name:
?php // set the cookies setcookie ("cookie[three]", "cookiethree"); setcookie ("cookie[two]", "cookietwo"); setcookie ("cookie[one]", "cookieone"); // after the page reloads, print them out if (isset($_COOKIE['cookie'])) { foreach ($_COOKIE['cookie'] as $name = $value) { echo "$name : $value br / \n"; } } /* which prints three : cookiethree two : cookietwo one : cookieone */ ? |
For more information on cookies, see Netscape's cookie
specification at
http://www.netscape.com/newsref/std/cookie_spec.html.
Microsoft Internet Explorer 4 with Service Pack 1
applied does not correctly deal with cookies that have their
path parameter set.
Netscape Communicator 4.05 and Microsoft Internet
Explorer 3.x appear to handle cookies incorrectly when the
path and time are not set.