PHP中cookies使用指南
Cookie是在HTTP協(xié)議下,服務(wù)器或腳本可以維護(hù)客戶工作站上信息的一種方式。Cookie是由Web服務(wù)器保存在用戶瀏覽器上的小文件,它可以包含有關(guān)用戶的信息(如身份識(shí)別號(hào)碼、密碼、用戶在Web站點(diǎn)購(gòu)物的方式或用戶訪問(wèn)該站點(diǎn)的次數(shù))。無(wú)論何時(shí)用戶鏈接到服務(wù)器,Web站點(diǎn)都可以訪問(wèn)Cookie信息。
怎樣設(shè)置cookies?
在PHP中可以使用setcookie函數(shù)設(shè)置一個(gè)cookie。cookie是 HTTP標(biāo)頭的一部分, 因此設(shè)置cookie功能必須在任何內(nèi)容送到瀏覽器之前。這種限制與header()函數(shù)一樣。任何從客戶端傳來(lái)的cookie將自動(dòng)地轉(zhuǎn)化成一個(gè)PHP變量。PHP取得信息頭并分析, 提取cookie名并變成變量。因此,如果設(shè)置cookie如setcookie("mycookie","Cookies")php將自動(dòng)產(chǎn)生一個(gè)名為$mycookie,值為"Cookies"的變量。
我們來(lái)看一下setcookie函數(shù)語(yǔ)法:
init setcookie(string CookieName,string CookieValue,int CookieExpireTime,path,domain,int secure);
參數(shù)說(shuō)明:
PATH:表示web服務(wù)器上的目錄,默認(rèn)為被調(diào)用頁(yè)面所在目錄
DOMAIN:cookie可以使用的域名,默認(rèn)為被調(diào)用頁(yè)面的域名。這個(gè)域名必須包含兩個(gè)".",所以如果你指定你的頂級(jí)域名,你必須用".mydomain.com"
SECURE:如果設(shè)為"1",表示cookie只能被用戶的瀏覽器認(rèn)為是安全的服務(wù)器所記住.
cookies使用舉例
假設(shè)我們有這樣一個(gè)需要注冊(cè)的站點(diǎn),它自動(dòng)識(shí)別用戶的身份并進(jìn)行相關(guān)的操作:如果是已經(jīng)注冊(cè)的用戶,發(fā)送給他信息;如果不是已經(jīng)注冊(cè)的用戶,則顯示一個(gè)注冊(cè)頁(yè)面的鏈接。
按照上面的要求,我們先創(chuàng)建數(shù)據(jù)庫(kù)用來(lái)保存注冊(cè)用戶的信息:名字(first name),姓(last name),Email地址(email address),計(jì)數(shù)器(visit counter)。
先按下面步驟建表:
mysql> create database users;
Query OK, 1 row affected (0.06 sec)
mysql> use users;
Database changed
mysql> create table info (FirstName varchar(20), LastName varchar(40), email varchar(40), count varchar(3));
Query OK, 0 rows affected (0.05 sec)
然后建一個(gè)php頁(yè)面對(duì)照數(shù)據(jù)庫(kù)檢查cookies。
由于php能轉(zhuǎn)換可識(shí)別的cookie為相應(yīng)的變量,所以我們能檢查一個(gè)名為"myCookies" 的變量:
?。? if (isset($myCookies)) { // 如果Cookie已經(jīng)存在
……
} else { //如果Cookie不存在
……
}
?>
當(dāng)cookie存在時(shí),我們執(zhí)行下面步驟:
首先取得cookie值,用explode函數(shù)分析成不同的變量,增加計(jì)數(shù)器,并設(shè)一個(gè)新cookie:
$info = explode("&", $myCookies);
……
$count++;
$CookieString=$FirstName.'&'.$LastName.'&'.$email.'&'.$count;
SetCookie ("myCookies",$CookieString, time()+3600); //設(shè)置cookie
接著用html語(yǔ)句輸出用戶信息。
最后,用新的計(jì)數(shù)器值更新數(shù)據(jù)庫(kù)。
如果這個(gè)cookie不存在,我們顯示一個(gè)注冊(cè)頁(yè)(register.php)的鏈接。
下面的register.php是用戶注冊(cè)頁(yè)面:
/* register.php */
?。糵orm method="post" action="regOK.php">
First Name:<input type="text" name="FirstName">
Last Name:<input type="text" name="LastName">
?。糹nput type="submit" value="注冊(cè)">
</form>
用戶在register.php注冊(cè)頁(yè)面填寫的信息提交給regOK.php:
/* regOK.php */
if ($FirstName and $LastName and $email) {
……//在數(shù)據(jù)庫(kù)查詢用戶是否存在
}
}else{
……//錯(cuò)誤處理
}
上面的程序流程如下:
首先檢查所有的信息是否按要求填寫,如果沒有,返回重新輸入
如果所有信息填好,首先,我們從數(shù)據(jù)庫(kù)中取回用戶登錄詳細(xì)資料
mysql_connect() or die ("連接數(shù)據(jù)庫(kù)出現(xiàn)錯(cuò)誤!");
$query="select * from info where FirstName='$FirstName' and LastName='$LastName' and email='$email'";
$result = mysql_db_query("users", $query);
$info=mysql_fetch_array($result);
$count=$info["count"];
檢查數(shù)據(jù)庫(kù)是否有這樣一個(gè)用戶,如果有,它指定舊的信息,并用當(dāng)前的信息建一新的cookie,如果同一用戶沒有數(shù)據(jù)庫(kù)登錄,新建一數(shù)據(jù)庫(kù)登錄,并建一新的cookie。
現(xiàn)在利用isset()函數(shù)檢查用戶是否有計(jì)數(shù)器,如果有則計(jì)數(shù)器增加并且建立一個(gè)新的cookie:
$count++; //增加計(jì)數(shù)器
$CookieString=$FirstName.'&'.$LastName.'&'.$email.'&'.$count;
SetCookie ("myCookies",$CookieString, time()+3600);
如果沒有一用戶計(jì)數(shù)器,在mysql中加一記錄,并設(shè)一cookie
注意:調(diào)用setcookie函數(shù)之前應(yīng)該沒有任何數(shù)據(jù)輸出倒瀏覽器,否則將會(huì)出現(xiàn)錯(cuò)誤。
如何實(shí)現(xiàn)跨域名Cookie?
從Cookie規(guī)范上說(shuō),一個(gè)cookie只能用于一個(gè)域名,因此,如果在瀏覽器中對(duì)一個(gè)域名設(shè)置了一個(gè)cookie,那么這個(gè)cookie對(duì)于其它的域名將無(wú)效。
下面我們來(lái)談一個(gè)跨域名cookie的實(shí)現(xiàn)方案:
第一步:創(chuàng)建預(yù)置腳本
將下面的代碼加到預(yù)置腳本中(或出現(xiàn)在所有腳本之前的函數(shù)中)。
?。?php
/*如果GET變量已經(jīng)設(shè)置了,并且它與cookie變量不同
*則使用get變量(更新cookie)
*/
global $HTTP_COOKIE_VARS, $HTTP_GET_VARS;
if (isset($sessionid) && isset($HTTP_GET_VARS['sessionid']) && ($HTTP_COOKIE_VARS['sessionid'] != $HTTP_GET_VARS['sessionid'])) {
SetCookie('sessionid', $HTTP_GET_VARS['sessionid'], 0, '/', '');
$HTTP_COOKIE_VARS['sessionid'] = $HTTP_GET_VARS['sessionid'];
$sessionid = $HTTP_GET_VARS['sessionid'];
}
?>
這個(gè)代碼運(yùn)行之后,一個(gè)全局變量'sessionid'將可以用于腳本。它將保存用戶的cookie中的sessionid值,或者是通過(guò)GET請(qǐng)求發(fā)來(lái)的sessionid值。
第二步:為所有的交叉域名引用使用變量
創(chuàng)建一個(gè)全局的配置文件,用于存放可以進(jìn)行切換的域名的基本引用形式。例如,如果我們擁有domain1.com和domain2.com,則如下設(shè)置:
?。?php
$domains['domain1'] = "http://www.domain1.com/-$sessionid-";
$domains['domain2'] = "http://www.domain2.com/-$sessionid-";
?>
我們寫這樣一段代碼:
?。?php
echo "Click <a href="", $domains['domain2'], "/contact/?email=yes">here</a> to contact us.";
?>
上面的代碼將產(chǎn)生如下的輸出:
Click <a >here</a> to contact us.
在這里sessionid已經(jīng)被插入到URL中去了。
第三步:配置Apache
現(xiàn)在,我們來(lái)配置Apache來(lái)重寫這個(gè)URL。
我們需要將
http://www.domain2.com/-66543afe6543asdf6asd-/contact/
變成這樣:
http://www.domain2.com/contact/?sessionid=66543afe6543asdf6asd
并且這種url:
http://www.domain2.com/-66543afe6543asdf6asd-/contact/?email=yes
變成這樣:
http://www.domain2.com/contact/?email=yes&sessionid=66543afe6543asdf6asd
為了實(shí)現(xiàn)上面的要求,簡(jiǎn)單地配置兩個(gè)虛擬服務(wù)器,作為domain1和domain2,如下操作:
?。糣irtualHost ipaddress>
DocumentRoot /usr/local/www/domain1
ServerName www.domain1.com
RewriteEngine on
RewriteRule ^/-(.*)-(.*?.*)$ $2&sessionid=$1 [L,R,QSA]
RewriteRule ^/-(.*)-(.*)$ $2?sessionid=$1 [L,R,QSA]
?。?VirtualHost>
<VirtualHost ipaddress>
DocumentRoot /usr/local/www/domain2
ServerName www.domain2.com
RewriteEngine on
RewriteRule ^/-(.*)-(.*?.*)$ $2&sessionid=$1 [L,R,QSA]
RewriteRule ^/-(.*)-(.*)$ $2?sessionid=$1 [L,R,QSA]
?。?VirtualHost>
這些重寫的規(guī)則實(shí)現(xiàn)了上面兩個(gè)URL重寫的要求。
- php實(shí)現(xiàn)的Cookies操作類實(shí)例
- php設(shè)置session值和cookies的學(xué)習(xí)示例
- PHP CURL獲取cookies模擬登錄的方法
- 怎樣使用php與jquery設(shè)置和讀取cookies
- 解析php通過(guò)cookies獲取遠(yuǎn)程網(wǎng)頁(yè)的指定代碼
- php cookies中刪除的一般賦值方法
- php中用數(shù)組的方法設(shè)置cookies
- php讀取javascript設(shè)置的cookies的代碼
- PHP用戶指南-cookies部分
- php利用cookies實(shí)現(xiàn)購(gòu)物車的方法
相關(guān)文章
解析php session_set_save_handler 函數(shù)的用法(mysql)
本篇文章是對(duì)php中session_set_save_handler 函數(shù)的用法(mysql)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP上傳文件時(shí)文件過(guò)大$_FILES為空的解決方法
發(fā)現(xiàn)一張gif圖片上傳失敗 size為0,實(shí)際大小為4.66M,下面為大家介紹下PHP上傳文件時(shí)文件過(guò)大的解決方法2013-11-11同臺(tái)服務(wù)器使用緩存APC效率高于Memcached的演示代碼
之前看到有文章說(shuō)同臺(tái)服務(wù)器上APC的效率是Memcached的7倍,APC效率比Memcached高是肯定的,至于倒底快多少,我寫了個(gè)小程序測(cè)試了下。2010-02-02用PHP ob_start()控制瀏覽器cache、生成html實(shí)現(xiàn)代碼
Output Control 函數(shù)可以讓你自由控制腳本中數(shù)據(jù)的輸出。它非常地有用,特別是對(duì)于:當(dāng)你想在數(shù)據(jù)已經(jīng)輸出后,再輸出文件頭的情況。2010-02-02PHP實(shí)現(xiàn)下載斷點(diǎn)續(xù)傳的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)下載斷點(diǎn)續(xù)傳的方法,通過(guò)自定義函數(shù)來(lái)實(shí)現(xiàn)PHP的斷點(diǎn)續(xù)傳下載方法,涉及文件的常見操作與指針和緩沖的用法,代碼中備有較為詳盡的注釋便于閱讀和理解,需要的朋友可以參考下2014-11-11php采用session實(shí)現(xiàn)防止頁(yè)面重復(fù)刷新
這篇文章主要介紹了php采用session實(shí)現(xiàn)防止頁(yè)面重復(fù)刷新的代碼及使用方法,需要的朋友可以參考下2015-12-12PHP中文處理 中文字符串截取(mb_substr)和獲取中文字符串字?jǐn)?shù)
PHP中文處理 中文字符串截取(mb_substr)和獲取中文字符串字?jǐn)?shù),需要的朋友可以參考下。2011-11-11php中通過(guò)虛代理實(shí)現(xiàn)延遲加載的實(shí)現(xiàn)代碼
基本原理是通過(guò)一個(gè)虛代理(Virtual Proxy)做占位符,一旦訪問(wèn)代理對(duì)象的某成員(方法或?qū)傩裕?,加載就被觸發(fā)。2011-06-06