PHP中cookies使用指南
Cookie是在HTTP協(xié)議下,服務(wù)器或腳本可以維護(hù)客戶工作站上信息的一種方式。Cookie是由Web服務(wù)器保存在用戶瀏覽器上的小文件,它可以包含有關(guān)用戶的信息(如身份識別號碼、密碼、用戶在Web站點(diǎn)購物的方式或用戶訪問該站點(diǎn)的次數(shù))。無論何時(shí)用戶鏈接到服務(wù)器,Web站點(diǎn)都可以訪問Cookie信息。
怎樣設(shè)置cookies?
在PHP中可以使用setcookie函數(shù)設(shè)置一個(gè)cookie。cookie是 HTTP標(biāo)頭的一部分, 因此設(shè)置cookie功能必須在任何內(nèi)容送到瀏覽器之前。這種限制與header()函數(shù)一樣。任何從客戶端傳來的cookie將自動地轉(zhuǎn)化成一個(gè)PHP變量。PHP取得信息頭并分析, 提取cookie名并變成變量。因此,如果設(shè)置cookie如setcookie("mycookie","Cookies")php將自動產(chǎn)生一個(gè)名為$mycookie,值為"Cookies"的變量。
我們來看一下setcookie函數(shù)語法:
init setcookie(string CookieName,string CookieValue,int CookieExpireTime,path,domain,int secure);
參數(shù)說明:
PATH:表示web服務(wù)器上的目錄,默認(rèn)為被調(diào)用頁面所在目錄
DOMAIN:cookie可以使用的域名,默認(rèn)為被調(diào)用頁面的域名。這個(gè)域名必須包含兩個(gè)".",所以如果你指定你的頂級域名,你必須用".mydomain.com"
SECURE:如果設(shè)為"1",表示cookie只能被用戶的瀏覽器認(rèn)為是安全的服務(wù)器所記住.
cookies使用舉例
假設(shè)我們有這樣一個(gè)需要注冊的站點(diǎn),它自動識別用戶的身份并進(jìn)行相關(guān)的操作:如果是已經(jīng)注冊的用戶,發(fā)送給他信息;如果不是已經(jīng)注冊的用戶,則顯示一個(gè)注冊頁面的鏈接。
按照上面的要求,我們先創(chuàng)建數(shù)據(jù)庫用來保存注冊用戶的信息:名字(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頁面對照數(shù)據(jù)庫檢查cookies。
由于php能轉(zhuǎn)換可識別的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語句輸出用戶信息。
最后,用新的計(jì)數(shù)器值更新數(shù)據(jù)庫。
如果這個(gè)cookie不存在,我們顯示一個(gè)注冊頁(register.php)的鏈接。
下面的register.php是用戶注冊頁面:
/* register.php */
<form method="post" action="regOK.php">
First Name:<input type="text" name="FirstName">
Last Name:<input type="text" name="LastName">
?。糹nput type="submit" value="注冊">
?。?form>
用戶在register.php注冊頁面填寫的信息提交給regOK.php:
/* regOK.php */
if ($FirstName and $LastName and $email) {
……//在數(shù)據(jù)庫查詢用戶是否存在
}
}else{
……//錯(cuò)誤處理
}
上面的程序流程如下:
首先檢查所有的信息是否按要求填寫,如果沒有,返回重新輸入
如果所有信息填好,首先,我們從數(shù)據(jù)庫中取回用戶登錄詳細(xì)資料
mysql_connect() or die ("連接數(shù)據(jù)庫出現(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ù)庫是否有這樣一個(gè)用戶,如果有,它指定舊的信息,并用當(dāng)前的信息建一新的cookie,如果同一用戶沒有數(shù)據(jù)庫登錄,新建一數(shù)據(jù)庫登錄,并建一新的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ù)輸出倒瀏覽器,否則將會出現(xiàn)錯(cuò)誤。
如何實(shí)現(xiàn)跨域名Cookie?
從Cookie規(guī)范上說,一個(gè)cookie只能用于一個(gè)域名,因此,如果在瀏覽器中對一個(gè)域名設(shè)置了一個(gè)cookie,那么這個(gè)cookie對于其它的域名將無效。
下面我們來談一個(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值,或者是通過GET請求發(fā)來的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)在,我們來配置Apache來重寫這個(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)上面的要求,簡單地配置兩個(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>
?。糣irtualHost 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重寫的要求。
相關(guān)文章
解析php session_set_save_handler 函數(shù)的用法(mysql)
本篇文章是對php中session_set_save_handler 函數(shù)的用法(mysql)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP上傳文件時(shí)文件過大$_FILES為空的解決方法
發(fā)現(xiàn)一張gif圖片上傳失敗 size為0,實(shí)際大小為4.66M,下面為大家介紹下PHP上傳文件時(shí)文件過大的解決方法2013-11-11同臺服務(wù)器使用緩存APC效率高于Memcached的演示代碼
之前看到有文章說同臺服務(wù)器上APC的效率是Memcached的7倍,APC效率比Memcached高是肯定的,至于倒底快多少,我寫了個(gè)小程序測試了下。2010-02-02用PHP ob_start()控制瀏覽器cache、生成html實(shí)現(xiàn)代碼
Output Control 函數(shù)可以讓你自由控制腳本中數(shù)據(jù)的輸出。它非常地有用,特別是對于:當(dāng)你想在數(shù)據(jù)已經(jīng)輸出后,再輸出文件頭的情況。2010-02-02PHP實(shí)現(xiàn)下載斷點(diǎn)續(xù)傳的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)下載斷點(diǎn)續(xù)傳的方法,通過自定義函數(shù)來實(shí)現(xiàn)PHP的斷點(diǎn)續(xù)傳下載方法,涉及文件的常見操作與指針和緩沖的用法,代碼中備有較為詳盡的注釋便于閱讀和理解,需要的朋友可以參考下2014-11-11php采用session實(shí)現(xiàn)防止頁面重復(fù)刷新
這篇文章主要介紹了php采用session實(shí)現(xiàn)防止頁面重復(fù)刷新的代碼及使用方法,需要的朋友可以參考下2015-12-12PHP中文處理 中文字符串截取(mb_substr)和獲取中文字符串字?jǐn)?shù)
PHP中文處理 中文字符串截取(mb_substr)和獲取中文字符串字?jǐn)?shù),需要的朋友可以參考下。2011-11-11php中通過虛代理實(shí)現(xiàn)延遲加載的實(shí)現(xiàn)代碼
基本原理是通過一個(gè)虛代理(Virtual Proxy)做占位符,一旦訪問代理對象的某成員(方法或?qū)傩裕虞d就被觸發(fā)。2011-06-06