php cookie详解

各参数详解

注意: 1   当一个Cookie被删除时,它的值在当前页在仍然有效的。原因是删除cookie实际也是设置cookie,
      只是把cookie的值设为‘’或者null,或者把cookie的过期日期设为time()-1;当删除一个cookie时,
      服务器首先在响应头里返回给客户端一个响应头 Set-Cookie,指示浏览器删除cookie,但只有在下次请求中浏览器才能告诉服务器cookie被删除了。

2  第四个参数中的路径 是按照网站路径计算的,‘/’  表示网站的根路径 (默认是当前页面的路径)

    3   删除时也是按照制定的路径删除的(默认时当前页面的路径) 

    4   Cookie是可以覆盖的,如果重复写入同名的Cookie,那么将会覆盖之前的Cookie

【补充1】

问题:$_COOKIE数组是通过读取cookie文件来取得cookie的值吗?

答案:严格来说不是通过读取文件。而是通过浏览器请求头。具体地,浏览器发送
     请求的时候会把cookie包含在请求头里,然后服务器端解析这个cookie头,并
     存到$_COOKIE变量里。cookie文件被删除了,相当于cookie被清空了,这时候
     理论上浏览器立刻发送请求时,$_COOKIE应该为空。

【补充2】cookie里一般不保存中文,中文一般经过encode(编码)之后再保存。编码函数,js中有①escape()   ② encodeURI()  ③encodeURIComponent()
          php中有urlencode(),rawurlencode()。

注意①    js和php的编码并不是完全一样的,如对于半角空格,PHP的urlencode输出“+”, 而JS的encodeURIComponent输出“%20”;对于半角“!”来说,
    PHP的urlencode输出“%21”,而JS的encodeURIComponent仍然输出“!”。

  ② 但是貌似两者的解码是可以通用的,js编码后php的解码函数可以正常解码,反之亦然(尚未完全验证)。【php函数iconv()】

定义和用法

setcookie() 函数向客户端发送一个 HTTP cookie。

cookie 是由服务器发送到浏览器的变量。cookie 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 cookie。

cookie 的名称指定为相同名称的变量。例如,如果被发送的 cookie 名为 "name",会自动创建名为 $user 的变量,包含 cookie 的值。

必须在任何其他输出发送前对 cookie 进行赋值。

如果成功,则该函数返回 true,否则返回 false。

语法

setcookie(name,value,expire,path,domain,secure)
参数 描述
name 必需。规定 cookie 的名称。
value 必需。规定 cookie 的值。
expire 可选。规定 cookie 的有效期。
path 可选。规定 cookie 的服务器路径。
domain 可选。规定 cookie 的域名。
secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。

第一个:name,必选参数,这个是cookie的变量名,可以通过$_COOKIE['user']调用变量名为user的cookie.

第二:value,可选参数,这个cookie变量的值,比如说setcookie(“user”,”php”),我们通过调用$_COOKIE['user']可以得到php值;

第三个:expire,可选参数,这个是用来设置cookie变量保存的时间,注意是我们设置的的UNIX时间戳减去当前的UNIX时间戳才是 cookie变量保存的时间。(UNIX时间戳:是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数) ,一般我们可以通过time()函数获取当前的UNIX时间戳,再加上我们要保存的时间(单位为秒)比如说,setcookie(“user”,”php”,time()+3600),这样我们就可以保存user这个cookie变量的时间为3600秒。另外我们可以通过设置的时间戳小于当前的时间戳来删除cookie变量,比如说setcookie(“user”,”php”,time()-1)这样我们就删除了user这个cookie变量了。如果不设置过期时间,则默认为浏览器结束后过期,这称为会话cookie。会话cookie保存在内存中,而设置了过期时间的cookie保存在硬盘的cookie文件中。不同浏览器的存储位置参见此链接http://www.cnblogs.com/everest33Tong/p/6084879.html

第四个:path,cookie的有效范围,这个参数是下一个参数domain基础上的有效范围,如果path设置为”/”,那就是在整个 domain都有效,比如setcookie(“user”,”php”,time()+3600,”/”),这样我们domain下的任何目录,任何文件都可以通过$_COOKIE['user']来调用这个cookie变量的值。如果path设置为”/test”,那么只在domain下的/test 目录及子目录才有效,比如domain下有两个目录: test1,test2,我们设置为setcookie(“user”,”php,time()+3600,”/test1″),那么只有test1目录下才能通过$_COOKIE['user']调用user这个cookie变量的值,test2目录下获取不到。

第五个:domain,cookie有效的域名,如果domain,设置为googlephp.cn,那么在googlephp.cn下的所有子域都有效。假设googlephp.cn有两个子域,php.googlephp.cn,css.googlephp.cn,我们设置为 setcookie(“user”,”php”,time()+3600,”/”,”php.googlephp.cn”),那么只有在 php.googlephp.cn这个子域下才能获取user这个cookie变量的值. 再举一个例子:setcookie(“user”,”php”,time()+3600,”/test”,”php.googlephp.cn”),那么只有在php.googlephp.cn这个子域下的test目录下才能获取user这个cookie变量的值.

第六个:secure,值cookie是否仅通过安全的https,值为0或1,如果值为1,则cookie只能在https连接上有效,默认值为 0,表示cookei在http和https连接上都有效。

1.创建/更新cookie

setCookie($cookieName,$value,time()+秒数);

例子1:创建一个cookie,名字为UserName,值为zs,过期时间为2个星期

setcookie("UserName","zs",time()+2*7*24*3600);

例子2:如果不设置时间,就不会保存到cookie文件中。浏览器不关时,能够访问。当浏览器关闭时,就无法访问了。

setcookie("Age","18");
 

2.取cookie的值

$_cookie[$cookieName];

例子:取出UserName的值,放在变量$uName中

$uName=$_COOKIE['UserName'];

取值的时候,一般会先判断是否为空,再进行取值操作。上面的取值操作一般这样写:

if (!empty($_COOKIE['UserName']))
{

$uName=$_COOKIE['UserName'];

}

 3.删除指定cookie(3种方法)

setcookie($cookieName,value,time()-秒数);
//或者
setcookie($cookiename, '');
//或者
setcookie($cookiename, NULL);
注:网上还有一种方法:setcookie($cookiename),自己测试了下,这种方法浏览器中一直有$cookiename这个键,其值没有任何值。不推荐用

例子:删除UserName

setcookie("UserName","zs",time()-3600);

 4.删除当前会话的所有cookie

foreach($_COOKIE as $key=>$val){
setcookie($key,"",time()-100);
}

当无cookie时,本机保存cookie的文件也将删除。

文章二

1、设置Cookie

PHP用SetCookie函数来设置Cookie。必须注意的一点是:Cookie是HTTP协议头的一部分,用于浏览器和服务器之间传递信息,所以必须在任何属于HTML文件本身的内容输出之前调用Cookie函数。

SetCookie函数定义了一个Cookie,并且把它附加在HTTP头的后面,SetCookie函数的原型如下:

int SetCookie(string name, string value, int expire, string path, string domain, int secure);

除了name之外所有的参数都是可选的。value,path,domain三个参数可以用空字符串代换,表示没有设置;expire 和 secure两个参数是数值型的,可以用0表示。expire参数是一个标准的Unix时间标记,可以用time()或mktime()函数取得,以秒为单位。secure参数表示这个Cookie是否通过加密的HTTPS协议在网络上传输。 当前设置的Cookie不是立即生效的,而是要等到下一个页面时才能看到.这是由于在设置的这个页面里Cookie由服务器传递给客户浏览器,在下一个页面浏览器才能把Cookie从客户的机器里取出传回服务器的原因。 在同一个页面设置Cookie,实际是从后往前,所以如果要在插入一个新的Cookie之前删掉一个,你必须先写插入的语句,再写删除的语句,否则可能会出现不希望的结果。 来看几个例子:

简单的:

SetCookie("MyCookie", "Value of MyCookie");

带失效时间的:

SetCookie("WithExpire", "Expire in 1 hour", time()+3600);//3600秒=1小时

什么都有的:

SetCookie("FullCookie", "Full cookie value", time()+3600, "/forum", ".phpuser.com", 1);

这里还有一点要说明的,比如你的站点有几个不同的目录,那么如果只用不带路径的Cookie的话,在一个目录下的页面里设的Cookie在另一个目录的页面里是看不到的,也就是说,Cookie是面向路径的。实际上,即使没有指定路径,WEB服务器会自动传递当前的路径给浏览器的,指定路径会强制服务器使用设置的路径。解决这个问题的办法是在调用SetCookie时加上路径和域名,域名的格式可以是“www.phpuser.com”,也可是 “.phpuser.com”。 SetCookie函数里表示value的部分,在传递时会自动被encode,也就是说,如果value的值是“test value”在传递时就变成了“test%20value”,跟URL的方法一样。当然,对于程序来说这是透明的,因为在PHP接收Cookie的值时会自动将其decode。

如果要设置同名的多个Cookie,要用数组,方法是:

SetCookie("CookieArray[]", "Value 1");

SetCookie("CookieArray[]", "Value 2");

SetCookie("CookieArray[0]", "Value 1");

SetCookie("CookieArray[1]", "Value 2");

2、接收和处理Cookie

PHP对Cookie的接收和处理的支持非常好,是完全自动的,跟FORM变量的原则一样,特别简单。 比如设置一个名为MyCookier的Cookie,PHP会自动从WEB服务器接收的HTTP头里把它分析出来,并形成一个与普通变量一样的变量,名为 $myCookie,这个变量的值就是Cookie的值。数组同样适用。

另外一个办法是引用PHP的全局变量$HTTP_COOKIE_VARS数组。

分别举例如下:(假设这些都在以前的页面里设置过了,并且仍然有效)

echo $MyCookie;

echo $CookieArray[0];

echo count($CookieArray);

echo $HTTP_COOKIE_VARS["MyCookie"];

就这么简单。

3、删除Cookie

要删除一个已经存在的Cookie,有两个办法:

一是调用只带有name参数的SetCookie,那么名为这个name的Cookie将被从关系户机上删掉;(不建议用)

另一个办法是设置Cookie的失效时间为 time()或time()-1,那么这个Cookie在这个页面的浏览完之后就被删除了(其实是失效了)。 要注意的是,当一个Cookie被删除时,它的值在当前页在仍然有效的。

4、使用Cookie的限制

首先是必须在HTML文件的内容输出之前设置;

其次不同的浏览器对Cookie的处理不一致辞,且有时会出现错误的结果。比如:MS IE+SERVICE PACK 1不能正确处理带域名和路径的Cookie,Netscape Communicator 4.05和MS IE 3.0不能正确处理不带路径和时间的Cookie。至于MS IE 5 好象不能处理带域名、路径和时间的Cookie。这是我在设计本站的页面时发现的。

第三个限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个

上一篇:loj 1044(dp+记忆化搜索)


下一篇:gulp常用插件