PHP
downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

setrawcookie> <pfsockopen
Last updated: Tue, 30 Jun 2009

view this page in

setcookie

(PHP 4, PHP 5)

setcookieSend a cookie

Description

bool setcookie ( string $name [, string $value [, int $expire= 0 [, string $path [, string $domain [, bool $secure= false [, bool $httponly= false ]]]]]] )

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.

Once the cookies have been set, they can be accessed on the next page load with the $_COOKIE or $HTTP_COOKIE_VARS arrays. Note, superglobals such as $_COOKIE became available in PHP 4.1.0. Cookie values also exist in $_REQUEST.

Parameters

All the arguments except the name argument are optional. You may also replace an argument with an empty string ("") in order to skip that argument. Because the expire argument is integer, it cannot be skipped with an empty string, use a zero (0) instead.

See » Netscape cookie specification for specifics on how each setcookie() parameter works

name

The name of the cookie.

value

The value of the cookie. This value is stored on the clients computer; do not store sensitive information. Assuming the name is 'cookiename', this value is retrieved through $_COOKIE['cookiename']

expire

The time the cookie expires. This is a Unix timestamp so is in number of seconds since the epoch. In other words, you'll most likely set this with the time() function plus the number of seconds before you want it to expire. Or you might use mktime(). time()+60*60*24*30 will set the cookie to expire in 30 days. If set to 0, or omitted, the cookie will expire at the end of the session (when the browser closes).

Note: You may notice the expire parameter takes on a Unix timestamp, as opposed to the date format Wdy, DD-Mon-YYYY HH:MM:SS GMT, this is because PHP does this conversion internally.
expire is compared to the client's time which can differ from server's time.

path

The path on the server in which the cookie will be available on. If set to '/', the cookie will be available within the entire domain . If set to '/foo/', the cookie will only be available within the /foo/ directory and all sub-directories such as /foo/bar/ of domain . The default value is the current directory that the cookie is being set in.

domain

The domain that the cookie is available. To make the cookie available on all subdomains of example.com then you'd set it to '.example.com'. The . is not required but makes it compatible with more browsers. Setting it to www.example.com will make the cookie only available in the www subdomain. Refer to tail matching in the » spec for details.

secure

Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client. When set to TRUE, the cookie will only be set if a secure connection exists. The default is FALSE. On the server-side, it's on the programmer to send this kind of cookie only on secure connection (e.g. with respect to $_SERVER["HTTPS"]).

httponly

When TRUE the cookie will be made accessible only through the HTTP protocol. This means that the cookie won't be accessible by scripting languages, such as JavaScript. This setting can effectively help to reduce identity theft through XSS attacks (although it is not supported by all browsers). Added in PHP 5.2.0. TRUE or FALSE

Return Values

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.

Examples

Some examples follow how to send cookies:

Example #1 setcookie() send example

<?php
$value 
'something from somewhere';

setcookie("TestCookie"$value);
setcookie("TestCookie"$valuetime()+3600);  /* expire in 1 hour */
setcookie("TestCookie"$valuetime()+3600"/~rasmus/"".example.com"1);
?>

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. If you don't want this, you can use setrawcookie() instead if you are using PHP 5. 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);
?>

Example #2 setcookie() delete example

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:

<?php
// set the expiration date to one hour ago
setcookie ("TestCookie"""time() - 3600);
setcookie ("TestCookie"""time() - 3600"/~rasmus/"".example.com"1);
?>

Example #3 setcookie() and arrays

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";
    }
}
?>

The above example will output:

three : cookiethree
two : cookietwo
one : cookieone

Changelog

Version Description
5.2.0 The httponly parameter was added.

Notes

Note: As of PHP 4, you can use output buffering to send output prior to the call of this function, with the overhead of all of your output to the browser being buffered in the server until you send it. You can do this by calling ob_start() and ob_end_flush() in your script, or setting the output_buffering configuration directive on in your php.ini or server configuration files.

Note: If the PHP directive register_globals is set to on then cookie values will also be made into variables. In our examples below, $TestCookie 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. If the value argument is an empty string, or FALSE, and all other arguments match a previous call to setcookie, then the cookie with the specified name will be deleted from the remote client. This is internally achieved by setting value to 'deleted' and expiration time to one year in past.
  • Because setting a cookie with a value of FALSE will try to delete the cookie, you should not use boolean values. Instead, use 0 for FALSE and 1 for TRUE.
  • Cookies names can be set as array names and will be available to your PHP scripts as arrays but separate cookies are stored on the users system. Consider explode() to set one cookie with multiple names and values. It is not recommended to use serialize() for this purpose, because it can result in security holes.

Multiple calls to setcookie() are performed in the order called.

See Also



setrawcookie> <pfsockopen
Last updated: Tue, 30 Jun 2009
 
add a note add a note User Contributed Notes
setcookie
doricee at yahoo dot com
16-Jun-2009 04:15
When checking for whitespace make sure to check for a byte order mark.  Many text editors hide this char and it will cause errors with setcookie.

<?php setcookie("test", "cookietest");?>

<U+FEFF><?php setcookie("test", "cookietest");?>

http://en.wikipedia.org/wiki/Byte-order_mark
jesdisciple{ at t}gmail{d dot t}com
14-Jun-2009 12:41
For those who are writing their own replacement functions to comply with RFC 2109 / 2965 (and the PHP maintainers), note that your Max-Age value should technically be ignored, or at best treated as an ordinary value, unless you set Version=1.
laffen
27-May-2009 08:49
Note that the $_COOKIE variable not will hold multiple cookies with the same name. It is legitimate to set two cookies with the same name to the same host where the sub domain is different.
<?php
setcookie
("testcookie", "value1hostonly", time(), "/", ".example.com", 0, true);
setcookie("testcookie", "value2subdom", time(), "/", "subdom.example.com", 0, true);
?>
The next request from the browser will have both cookies in the $_SERVER['HTTP_COOKIE'] variable, but only one of them will be found in the $_COOKIE variable. Requests to subdom.example.com will have both cookies, while browser request to example.com or www.example.com only sends the cookie with the "value1hostonly" value.

<?php
$kaker
= explode(";", $_SERVER['HTTP_COOKIE']);
foreach(
$kaker as $val){
   
$k = explode("=", $val);
    echo
trim($k[0]) . " => " . $k[1];
}

// output
testcookie => value1hostonly
testcookie
=> value2subdom

?>
Arthur Lui
23-May-2009 06:52
Also note that you should specify the path as '/' if you want the cookie to apply to the entire site, especially if the location of the file where you create the cookies isn't at the root.

The file that created the cookies was /assets/php/login.php and was creating cookies for the path "/assets/php/" only so it drove me nuts when I went to the homepage and the cookie wasn't accessible from there.
kyle [dot] florence [@t] gmail [dot] com
01-May-2009 07:00
Here is a static Cookie wrapper class that you may find helpful:
http://pastebin.com/f10a7bcba

Example usage:

<?php
// Basic usage
Cookie::set('testcookie', 'test');
print(
Cookie::get('testcookie'));

// You can set 'array' cookies in two different ways:
Cookie::set('array[one]', 'item one');
Cookie::set(array('array' => 'two'), 'item two');

// Likewise, you can also get 'array' cookies in two different ways:
print(Cookie::get('array[one]'));
print(
Cookie::get(array('array' => 'one')));

// Or you can grab the whole array at once:
print_r(Cookie::get('array'));

// Deleting cookies is done in the same way:
Cookie::del('array[one]');
Cookie::del(array('array' => 'two'));

// Delete the entire array:
Cookie::del('array');

// Print contents of $_COOKIE (refresh for this)
print '<pre>';
print_r(Cookie::contents());
print
'<pre>';
?>
mm at turkmenweb dot com
30-Apr-2009 04:11
Be aware of "Last-Modified" header when dealing with cookies.
If you are explicitly setting Last-Modified to a past time (a few hours, mins ago, or etc) then even though browser will update your cookie, it won't reflect on your page (if you say <?=$_COOKIE['yourcookie']?> , browser will still print old value). I have seen this in Firefox 3, and in IE8.

Here is the code:

<?php

if(isset($_GET['hide']) && $_GET['hide']=='y'){
setcookie("TmhabarMainNewsHide", 'y', time()+3600*24*1000,"/",".tmhabar.com",0);
}
elseif(isset(
$_GET['hide']) && $_GET['hide']=='n'){
setcookie("TmhabarMainNewsHide", 'n' ,time()+3600*24*1000,"/",".tmhabar.com",0);
}

$last_modified = filemtime('inc/somefile.html');
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified)." GMT");

echo
$_COOKIE['TmhabarMainNewsHide'];

?>

Last-Modified header above is being set to a time in the past (last modification time of a certain file). In the browser, after the '/?hide=y' call, output still remains 'n' -> as if cookie value hasn't changed. When you go to Firefox's "View Page Info", there cookie is set to 'y' (which is an expected behavior). Doesn't matter how many times I refreshed the page, or followed other inner links of the page, cookie value never changed. It only changes if you CTRL+F5 in the browser.

I guess this is an expected behavior of a browser, not to update the page if it's last-modified header is set to back in time. But on the other hand, dynamic values should change in page. So, just be aware :) Btw, everything worked perfectly once I have commented out the 'header("Last-Modified: "....' line in the code above.

Hope this helps someone. Peace.
Muhammed Mamedov
Steve
17-Apr-2009 08:04
Beware, the example below works fine on my testing server but didn't work on my providers server;

<?php
setcookie
("SessionID","a test cookie");
?>

Once the cookie is set my entire web site fails with messages
similar to.

 "An appropriate representation of the requested resource could not be found on this server."

I'd used similar code for years on another site, but where the value was numeric, I'd made a minor change to generate a random string for the session ID and then got this issue.

The solution is not to use the cookie name "SessionID", i.e.

<?php
setcookie
("SessionToken","a test cookie");
?>

works fine.
dan at reverb-marketing dot com
05-Apr-2009 06:49
Consider adding a version number to your cookie string.  That way if your site gets an upgrade and the contents of your cookie change then it won't create (as big of) a headache for old users.

<?php
$foo
=unserialize($_COOKIE['remember_me']);
if(
$foo['version']==1) {
 
// original cookie.  Ignore it?  Process it differently?
 
old_and_busted($foo['data']);
} else if(
$foo['version']==2) {
 
// new cookie, proceed as normal
 
new_hotness($foo['data']);
}
?>
maksymus007 at gmail dot com
13-Feb-2009 02:47
To resolve problem of time difference between time on server and on client, just set a cookie with maximum lifetime and as one of its fields set local server time, that will be compared while cookie is read.
paul at webtop-designs dot com
10-Feb-2009 07:14
If you are trying to send cookies and keep getting a message about headers already sent but you cannot find where, check your files...a single space after the closing ?> in php is classed as output and will cause this issue.

Zend Framework users will note the new technique and not closing your files at all...that is to combat this same problem.

Make sure that ?> are the very last 2 characters of your file.

//erlin
erikinc at bredband dot net
08-Feb-2009 09:03
When working with encryption and setcookie( ) the decryption might fail in an seemingly random manner, making the cookie seem corrupt. This is due to the fact that php url-encodes the data before sending it to the client, and may therefore effectively be changing the ciphertext. A decryption of a changed ciphertext will render the plaintext unreadable. Due to the fact that this error only occurs when the ciphertext acctually contains characters needing encoding can make it very hard to identify.

One way to solve this problem, is to implement the url-encoding in the script, by using urlencode( ) and urldecode( ).
Prior to setting the cookie, use urlencode( ):
<?php

$ciphertext
= $myEncryptionObject->encrypt( $plaintext );
$safeCiphertext = urlencode( $ciphertext );
setcookie( "myCookie", $safeCiphertext, 0, "", "", false, true);

?>

And then using urldecode( ) prior to decryption of the ciphertext:
<?php

$safeData
= $_COOKIE[ "myCookie" ];
$ciphertext = urldecode( $safeData );
$plaintext = $myEncryptionObject->decrypt( $ciphertext );

?>
Frank
09-Dec-2008 03:22
One note on storing information in an "array" in a cookie:

You CANNOT access that array as a normal array.

So for example if you store:

<?php
setcookie
("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");

$_COOKIE[cookie][one] returns nothing.
?>

You MUST use foreach to grab all the information listed in the example above.

Not sure if this is a bug in php or a "feature."

Hopefully, this can save others some time.
bogdan at moongate dot ro
11-Sep-2008 09:58
Beware of the Cookie Monster (http://preview.tinyurl.com/5964ho) -- always set $secure to true for cookies set within secure environments (i.e. when your code is being accessed via HTTPS).

Also be advised that PHP's session manager doesn't do that automatically -- by default starting a session within a secure environment sets a cookie which is then accessible via non-secure channels. For sessions started in secure environments use:

<?php INI_Set('session.cookie_secure',true); ?>

before starting the session.
Link dot random at gmail dot com
03-Sep-2008 09:49
Platform: Windows XP SP2, IIS5.2, Php5.2.5:

I've had my share of sessioning problems and all of them came from the fact that i'm using Php Designer 2007 as my php editor.. Cookies must be sent before any output from your script including <html> and <head> tags as well as any whitespaces, well this php editor was sending a sort of data before the headers that i want to send which cause to have the given error: "Cannot send session Cookie - headers already sent", even after using output buffers to fixe the problem of the time the cookies are sent i still had the same problem.
Solution? Don't use any editor..! notepad is all you need... Used notepad, and it worked like magic!
php at gigadepot dot com
27-Jul-2008 05:17
If you use a multiple cookie name with the function bellow

example :

createcookie("member[name]","jack");

don't work with array

error with "rawurlencode($name)"

I'm use : createcookie(array('member'=>'name'),'jack');

<?php
createCookie
($name, $value='', $maxage=0, $path='',$domain='', $secure=false, $HTTPOnly=false)
    {
        if(
is_array($name))
        {
            list(
$k,$v)    =    each($name);

               
$name    =    $k.'['.$v.']';

        }
       
$ob = ini_get('output_buffering');
       
// Abort the method if headers have already been sent, except when output buffering has been enabled
       
if ( headers_sent() && (bool) $ob === false || strtolower($ob) == 'off' )
            return
false;
        if ( !empty(
$domain) )
        {
           
// Fix the domain to accept domains with and without 'www.'.
           
if ( strtolower( substr($domain, 0, 4) ) == 'www.' ) $domain = substr($domain, 4);
           
// Add the dot prefix to ensure compatibility with subdomains
           
if ( substr($domain, 0, 1) != '.' ) $domain = '.'.$domain;
           
// Remove port information.
           
$port = strpos($domain, ':');
            if (
$port !== false ) $domain = substr($domain, 0, $port);
        }
       
// Prevent "headers already sent" error with utf8 support (BOM)
        //if ( utf8_support ) header('Content-Type: text/html; charset=utf-8');
       
if(is_array($name))
        {
           
header('Set-Cookie: '.$name.'='.rawurlencode($value)
                                    .(empty(
$domain) ? '' : '; Domain='.$domain)
                                    .(empty(
$maxage) ? '' : '; Max-Age='.$maxage)
                                    .(empty(
$path) ? '' : '; Path='.$path)
                                    .(!
$secure ? '' : '; Secure')
                                    .(!
$HTTPOnly ? '' : '; HttpOnly'), false);
        }else{
           
header('Set-Cookie: '.rawurlencode($name).'='.rawurlencode($value)
                                    .(empty(
$domain) ? '' : '; Domain='.$domain)
                                    .(empty(
$maxage) ? '' : '; Max-Age='.$maxage)
                                    .(empty(
$path) ? '' : '; Path='.$path)
                                    .(!
$secure ? '' : '; Secure')
                                    .(!
$HTTPOnly ? '' : '; HttpOnly'), false);
        }
        return
true;
    }
?>
jphansen at uga dot edu
22-Apr-2008 12:43
If you'd like to set a cookie for a prolonged time, here's an example for a cooking lasting 1 year, which passes seconds--60 seconds * 60 minutes * 24 hours * 365 days = 1 year--as the $expire argument.

<?php
setcookie
($name, $value, time()+(60*60*24*365));
?>
isooik at gmail-antispam dot com
26-Feb-2008 01:18
Here's a more advanced version of the php setcookie() alternative function:

<?php

   
/**
     * A better alternative (RFC 2109 compatible) to the php setcookie() function
     *
     * @param string Name of the cookie
     * @param string Value of the cookie
     * @param int Lifetime of the cookie
     * @param string Path where the cookie can be used
     * @param string Domain which can read the cookie
     * @param bool Secure mode?
     * @param bool Only allow HTTP usage?
     * @return bool True or false whether the method has successfully run
     */
   
function createCookie($name, $value='', $maxage=0, $path='', $domain='', $secure=false, $HTTPOnly=false)
    {
       
$ob = ini_get('output_buffering');

       
// Abort the method if headers have already been sent, except when output buffering has been enabled
       
if ( headers_sent() && (bool) $ob === false || strtolower($ob) == 'off' )
            return
false;

        if ( !empty(
$domain) )
        {
           
// Fix the domain to accept domains with and without 'www.'.
           
if ( strtolower( substr($domain, 0, 4) ) == 'www.' ) $domain = substr($domain, 4);
           
// Add the dot prefix to ensure compatibility with subdomains
           
if ( substr($domain, 0, 1) != '.' ) $domain = '.'.$domain;

           
// Remove port information.
           
$port = strpos($domain, ':');

            if (
$port !== false ) $domain = substr($domain, 0, $port);
        }

       
// Prevent "headers already sent" error with utf8 support (BOM)
        //if ( utf8_support ) header('Content-Type: text/html; charset=utf-8');

       
header('Set-Cookie: '.rawurlencode($name).'='.rawurlencode($value)
                                    .(empty(
$domain) ? '' : '; Domain='.$domain)
                                    .(empty(
$maxage) ? '' : '; Max-Age='.$maxage)
                                    .(empty(
$path) ? '' : '; Path='.$path)
                                    .(!
$secure ? '' : '; Secure')
                                    .(!
$HTTPOnly ? '' : '; HttpOnly'), false);
        return
true;
    }

?>

Regards,
Isaak
sebasg37 at gmail dot com
08-Feb-2008 03:10
As said, you can avoid the annoying "headers already sent in line..", using the ob_start() (function that serves as buffer) doing this:

<?php
ob_start
();

echo
"somtehing";
setcookie("cookie", "value"); /* if you didn't add the ob_start() function at this point the headers would have been already sent and the cookie have not been saved */

ob_end_flush();
?>
dave at shout411 dot com
04-Feb-2008 01:51
firefox will permit a short cookie length, eg +60
IE6 (all i tested as yet) will not create the cookie for +60
It will though accept +120 (two minutes)
d.
globexdesigns at gmail dot com
07-Dec-2007 12:45
Quotes are important when giving cookies parameters. If it looks like you can't delete your cookies, or cookies doesn't delete verify that both your cookies names are consistent.

<?php
setcookie
(mycookie, $test, time() + 3600);
setcookie("mycookie","",time() - 3600);
?>

The above is wrong. But the examples are right:

<?php
setcookie
("mycookie", $test, time() + 3600);
setcookie("mycookie","",time() - 3600);
?>

<?php
setcookie
(mycookie, $test, time() + 3600);
setcookie(mycookie,"",time() - 3600);
?>
Alexander Fleischer
29-Nov-2007 04:48
Using $httponly also prevents the browser to pass a cookie to the java class loader. If a session cookie is required to access java .class / .jar files, loading of the applet will fail. In this case, session.cookie_httponly may be switched off.
soeren dot spreng at gmail dot com
22-Nov-2007 10:35
Beware: The Internet Explorer doesn't accept Cookies with an expiretime, which is to long. time() + time() for example doesn't work and the Cookie won't be created!
amalinovski at yahoo dot com
30-Oct-2007 08:29
Problem with setcookie() and UTF-8 recognizing by browser:
- If you want to use UTF-8 characters in your php file, some editors insert special bytes in the very beginning of the file. This prevents setcookie() from working, because these special bytes are sent to the browser BEFORE the header, and you get "Header already sent" error;
- If you delete these bytes (with a hex editor), setcookie() will work fine, but the browser will STOP recognizing UTF-8 encoding automatically! The user will need to set the encoding to UTF-8 manually to see your page correctly.
Here's how to get out of this:

Instead of:

<?php
setcookie
("aaa", "bbb");
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Write this:

<?php
header
("Content-Type: text/html; charset=utf-8");
setcookie("aaa", "bbb");
?><html>
<head>
...

(make sure you have no special bytes before "<?")
mikeh at view22 dot com
19-Oct-2007 06:56
Observed: session cookies were expiring even though the session was still active.  (To test, set a cookie expiry of 5 seconds and keep hitting the page every second.  The session will expire and create a new SESSID after 5 seconds despite the fact that you hit the page only a second ago.)

Calling this function before starting the session fixed it.  It copies the cookie contents back to itself while forcing an update to the expiry time in the cookie.

<?php
function FreshenSessionCookie($lifetimeSeconds, $cookieName = 'PHPSESSID')
{
    if (isset(
$_COOKIE[$cookieName]))
        {
       
$data = $_COOKIE[$cookieName];
       
$timeout = time()+$lifetimeSeconds;
       
setcookie($cookieName, $data$timeout);
        }
}
?>
cwillard at fastmail dot fm
22-Aug-2007 02:55
If you're looking to set multiple values in your cookie (rather than setting multiple cookies) you might find these useful.

<?php
function build_cookie($var_array) {
  if (
is_array($var_array)) {
    foreach (
$var_array as $index => $data) {
     
$out.= ($data!="") ? $index."=".$data."|" : "";
    }
  }
  return
rtrim($out,"|");
}

function
break_cookie ($cookie_string) {
 
$array=explode("|",$cookie_string);
  foreach (
$array as $i=>$stuff) {
   
$stuff=explode("=",$stuff);
   
$array[$stuff[0]]=$stuff[1];
    unset(
$array[$i]);
  }
  return
$array;
}
?>
Hopefully someone finds these useful.
bluewaterbob
13-Jul-2007 06:51
if you are having problems seeing cookies sometimes or deleting cookies sometimes, despite following the advice below, make sure you are setting the cookie with the domain argument. Set it with the dot before the domain as the examples show: ".example.com".  I wasn't specifying the domain, and finally realized I was setting the cookie when the browser url had the http://www.example.com and later trying to delete it when the url didn't have the www. ie. http://example.com. This also caused the page to be unable to find the cookie when the www. wasn't in the domain.  (When you add the domain argument to the setcookie code that creates the cookie, make sure you also add it to the code that deletes the cookie.)
john at codeproject dot com
17-Jun-2007 05:52
If you ever have to modify, add, or delete cookies (that you added with php) using Javascript, try using this piece of code i found here:
http://www.webtoolkit.info/javascript-cookies.html
Its rather simple and very useful.
jonathan dot bergeron at rve dot ulaval dot ca
24-May-2007 07:05
About the delete part, I found that Firefox only remove the cookie when you submit the same values for all parameters, except the date, which sould be in the past. Submiting blank values didn't work for me.

Example :
- set -

<?php setcookie( "name", "value", "future_timestamp", "path", "domain" ); ?>

- delete -
<?php setcookie( "name", "value", "past_timestamp", "path", "domain" ); ?>

Jonathan
anonIMouS
10-Apr-2007 08:42
This code sets cookie with Max-Age.
See to:
http://www.zend.com/zend/week/week198.php#Heading3
http://www.faqs.org/rfcs/rfc2109.html
<?php
function set_cookie($Name, $Value = '', $MaxAge = 0, $Path = '', $Domain = '', $Secure = false, $HTTPOnly = false) {
 
header('Set-Cookie: ' . rawurlencode($Name) . '=' . rawurlencode($Value)
                        . (empty(
$MaxAge) ? '' : '; Max-Age=' . $MaxAge)
                        . (empty(
$Path)   ? '' : '; path=' . $Path)
                        . (empty(
$Domain) ? '' : '; domain=' . $Domain)
                        . (!
$Secure       ? '' : '; secure')
                        . (!
$HTTPOnly     ? '' : '; HttpOnly'), false);
}

# examples:
set_cookie("TestCookie", $value, 3600);  /* expire in 1 hour */
set_cookie("TestCookie", $value, 3600, "/~rasmus/", ".example.com", 1);
?>
Marcin Wiazowski
30-Mar-2007 08:08
'session.cookie_domain' should be set to empty string for all local domain names, not only for 'localhost' (but should not be empty for local IP addresses):

<?php
ini_set
('session.cookie_domain', (strpos($_SERVER['HTTP_HOST'],'.') !== false) ? $_SERVER['HTTP_HOST'] : '');
?>
mike
26-Mar-2007 04:00
Be careful of using the same cookie name in subdirectories. Setting a simple cookie

<?php setcookie("region", $_GET['set_region']); ?>

both in the root / and for instance in this case /admin/ will create 2 cookies with different paths. In reading the cookies back only the first one is read regardless of path.
21-Mar-2007 10:40
if you only want to do something once per unique visitor, you can test if a cookie is set, and if not, set the cookie and perform the action. This being the poorman's version, it has a problem, where if a user is blocking cookies they will appear as a first time visitor each time. What you can do to avoid this is to set a test cookie first and check that it exists. If it exists, then check to see if your second cookie has been set. If the first one is set, but the second isn't, then you know this is a first time visitor.
gabe at fijiwebdesign dot com
25-Feb-2007 03:25
If you want to delete all cookies on your domain, you may want to use the value of:

<?php $_SERVER['HTTP_COOKIE'] ?>

rather than:

<?php $_COOKIE ?>

to dertermine the cookie names.
If cookie names are in Array notation, eg: user[username]
Then PHP will automatically create a corresponding array in $_COOKIE. Instead use $_SERVER['HTTP_COOKIE'] as it mirrors the actual HTTP Request header.

<?php

// unset cookies
if (isset($_SERVER['HTTP_COOKIE'])) {
   
$cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach(
$cookies as $cookie) {
       
$parts = explode('=', $cookie);
       
$name = trim($parts[0]);
       
setcookie($name, '', time()-1000);
       
setcookie($name, '', time()-1000, '/');
    }
}

?>
09-Feb-2007 01:13
something that wasn't made clear to me here and totally confused me for a while was that domain names must contain at least two dots (.), hence 'localhost' is invalid and the browser will refuse to set the cookie! instead for localhost you should use false.

to make your code work on both localhost and a proper domain, you can do this:

<?php

$domain
= ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
setcookie('cookiename', 'data', time()+60*60*24*365, '/', $domain, false);

?>
brian dot powell at insetsolutions dot com
06-Feb-2007 02:35
Here is problem I ran into during a recent bout with IE7 and cookies.  IE will not delete a cookie value if the time is set to the past.  It will hold the value no matter how far in the past you set the "expire" value.  IE7 is the only browser I have had problems with - so here is the solution I came up with.

<?PHP

//check to see how to set the cookie
$Browsertype = $_SERVER['HTTP_USER_AGENT'];
$Parts = explode(" ",$Browsertype);
$MSIE = array_search("MSIE",$Parts);
               
if(
$MSIE)
{
setcookie("name", "", time()+20000);
}
else
{
setcookie("name", "", time()-20000, "/", ".domain.com" );
}

?>
ahmetantmen at msn dot com
19-Jan-2007 11:36
You can be sure about the cookie files contents weren't changed.

<?php

$Seperator
= '--';
$uniqueID = 'Ju?hG&F0yh9?=/6*GVfd-d8u6f86hp';
$Data = 'Ahmet '.md5('123456789');

setcookie('VerifyUser', $Data.$Seperator.md5($Data.$uniqueID));

if (
$_COOKIE) {
  
$Cut = explode($Seperator, $_COOKIE['VerifyUser']);
   if (
md5($Cut[0].$uniqueID) === $Cut[1]) {
      
$_COOKIE['VerifyUser'] = $Cut[0];
   } else {
       die(
'Cookie data is invalid!!!');
   }
}

echo
$_COOKIE['VerifyUser'];

?>

Create a unique id for your site and create a hash with md5($Data.$uniqueID). Attacker can understant that it must be re-hash after change cookie content.
But doesn't. Because cannot guess your unique id. Seperate your hash and data with seperator and send that cookie. Control that hash of returned value and your unique id's is same returned hash. Otherwise you have to stop attack. Sorry for my poor english!
stovenator at gmail dot com
13-Jan-2007 02:54
If you are having issues with IE7 and setcookie(), be sure to verify that the cookie is set via http for http sites, and https for https site.

Also, if the time is incorrect on your server, IE7 will also disallow those cookies from being set.
05-Jan-2007 09:33
If you ever find yourself in a situation where you need to overwrite a non-PHP application's session cookie, you can do that with the following line:

<?php
header
("Set-Cookie: SIDNAME=$overwrite; path=/; secure");
?>

I couldn't get setcookie() to do this for all major web browsers, but manually sending the header did the trick. Note: Remove secure if you aren't mandating SSL connections.
felixcca at yahoo dot ca
31-Dec-2006 05:36
I found out recently that assigning FALSE to a cookie will destroy it.

I thought it might interest some of you.
kurtubba at gmail dot com
14-Dec-2006 01:12
When setting a top level domain ex ".mydomain.com" you must add the secure arg so it should look like

<?php
setcookie
("TestCookie", $value, time()+3600, "/", ".example.com", 0);
?>


ignoring the secure arg makes IE ignores the cookie
to get the top level domain use

<?php
$myDomain
= ereg_replace('^[^\.]*\.([^\.]*)\.(.*)$', '\1.\2',$_SERVER['HTTP_HOST']);
?>


to avoid localhost switch use

<?php
$phpCkDmn
= $_SERVER['HTTP_HOST'] != "localhost" ? $myDomain : false;
?>
paul nospam AT nospam sitepoint dot com
07-Dec-2006 04:59
Note when setting "array cookies" that a separate cookie is set for each element of the array.

On high traffic sites, this can substantially increase the size of subsequent HTTP requests from clients (including requests for static content on the same domain).

More importantly though, the cookie specification says that browsers need only accept 20 cookies per domain.  This limit is increased to 50 by Firefox, and to 30 by Opera, but IE6 and IE7 enforce the limit of 20 cookie per domain.  Any cookies beyond this limit will either knock out an older cookie or be ignored/rejected by the browser.
hansel at gretel dot com
06-Nov-2006 04:12
The following code snippet combines abdullah's and Charles Martin's examples into a powerful combination function (and fixes at least one bug in the process):

<?php
 
function set_cookie_fix_domain($Name, $Value = '', $Expires = 0, $Path = '', $Domain = '', $Secure = false, $HTTPOnly = false)
  {
    if (!empty(
$Domain))
    {
     
// Fix the domain to accept domains with and without 'www.'.
     
if (strtolower(substr($Domain, 0, 4)) == 'www.'$Domain = substr($Domain, 4);
     
$Domain = '.' . $Domain;

     
// Remove port information.
     
$Port = strpos($Domain, ':');
      if (
$Port !== false$Domain = substr($Domain, 0, $Port);
    }

   
header('Set-Cookie: ' . rawurlencode($Name) . '=' . rawurlencode($Value)
                          . (empty(
$Expires) ? '' : '; expires=' . gmdate('D, d-M-Y H:i:s', $Expires) . ' GMT')
                          . (empty(
$Path) ? '' : '; path=' . $Path)
                          . (empty(
$Domain) ? '' : '; domain=' . $Domain)
                          . (!
$Secure ? '' : '; secure')
                          . (!
$HTTPOnly ? '' : '; HttpOnly'), false);
  }
?>

Basically, if the domain parameter is supplied, it is converted to support a broader range of domains.  This behavior may or may not be desireable (e.g. could be a security problem depending on the server) but it makes cookie handling oh-so-much-nicer (IMO).
adruff at gmail dot com
06-Aug-2006 05:14
If you intend to use persistent cookies (vice session cookies that are deleted when the browser is closed) be aware:
1) Firefox appears to require that you include all paramaters, or it will ignore the expiration and treat the cookie as a session cookie
2) My version of firefox (1.5.0.6) defaults to 'keep cookies until i close firefox' , which essentially makes every cookie a session cookie. This of course sucks for devs, but i suppose is supposed to be a security feature for the end user. If the user wants to configure firefox to respect the expiration date and retain cookies beyond the session, the user must change it to 'keep cookies until they expire'.
gareth at gw126 dot com
05-Jun-2006 02:38
You can use cookies to prevent a browser refresh repeating some action from a form post... (providing the client is cookie enabled!)

<?php
//Flag up repeat actions (like credit card transaction, etc)
if(count($_POST)>0) {
   
$lastpost= isset($_COOKIE['lastpost']) ? $_COOKIE['lastpost'] : '';
    if(
$lastpost!=md5(serialize($_POST))) {
       
setcookie('lastpost', md5(serialize($_POST)));
       
$_POST['_REPEATED']=0;
    } else {
       
$_POST['_REPEATED']=1;
    }
}

//At this point, if $_POST['_REPEATED']==1, then  the user
//has hit the refresh button; so don't do any actions that you don't
//want to repeat!
?>

Hope that helps :)

Gareth
simon at ruderich dot com
01-Aug-2005 09:21
If you want to delete a session cookie, you can do it with this code:

<?php
  session_start
();

 
// many code

 
$sessionName = session_name();
 
$sessionCookie = session_get_cookie_params();

 
session_destroy();

 
setcookie($sessionName, false, $sessionCookie['lifetime'], $sessionCookie['path'], $sessionCookie['domain'], $sessionCookie['secure']);
 
?>

This works also well if the session cookie params or the session name were changed.
terry at scribendi dot com
08-May-2005 02:07
A few comments have suggested using serialize() to set object or array data into a cookie.  There are a couple of reasons to be carefull with that technique:

Security: If the cookie is human readable, then it is also fairly easy for end users to play around with it.  Wrapping your cookie setting and getting in an encryption routine will prevent tampering, and make sure that your cookies don't make any sense to any client-side exploits or other sites they get sent to thanks to browser bugs.

Bulk: If you serialize even a fairly simple class, then you get a lot of data.  Large cookies will make browser requests fat and slow, and some browsers have a limit on cookie size, so think about what data you really need to persist, and create __sleep() and __wakeup() methods to package the data into the shortest possible form.  You can get better and faster results when you write your own __sleep() and __wakup() to implode() or pack() your da