PHP中(zhōng)cookies指南(nán)

發布時間:2007年01月26日      浏覽次數:2618 次
PHP中(zhōng)cookies指南(nán)
 綜述
Cookie是在HTTP協議下(xià),服務器或腳本可以維護客戶工(gōng)作站上信息的一(yī)種方式。Cookie是由Web服務器保存在用戶浏覽器上的小(xiǎo)文件,它可以包含有關用戶的信息(如身份識别号碼、密碼、用戶在Web站點購物(wù)的方式或用戶訪問該站點的次數)。無論何時用戶鏈接到服務器,Web站點都可以訪問Cookie信息。
  怎樣設置cookies?
在PHP中(zhōng)可以使用setcookie函數設置一(yī)個cookie。cookie是 HTTP标頭的一(yī)部分(fēn), 因此設置cookie功能必須在任何内容送到浏覽器之前。這種限制與header()函數一(yī)樣。任何從客戶端傳來的cookie将自動地轉化成一(yī)個PHP變量。PHP取得信息頭并分(fēn)析, 提取cookie名并變成變量。因此,如果設置cookie如setcookie("mycookie","Cookies")php将自動産生(shēng)一(yī)個名爲$mycookie,值爲"Cookies"的變量。
我(wǒ)(wǒ)們來看一(yī)下(xià)setcookie函數語法:
init setcookie(string CookieName,string CookieValue,int CookieExpireTime,path,domain,int secure);
參數說明:
PATH:表示web服務器上的目錄,默認爲被調用頁面所在目錄
DOMAIN:cookie可以使用的域名,默認爲被調用頁面的域名。這個域名必須包含兩個".",所以如果你指定你的頂級域名,你必須用".mydomain.com"
SECURE:如果設爲"1",表示cookie隻能被用戶的浏覽器認爲是安全的服務器所記住.
cookies使用舉例
假設我(wǒ)(wǒ)們有這樣一(yī)個需要注冊的站點,它自動識别用戶的身份并進行相關的操作:如果是已經注冊的用戶,發送給他信息;如果不是已經注冊的用戶,則顯示一(yī)個注冊頁面的鏈接。
按照上面的要求,我(wǒ)(wǒ)們先創建數據庫用來保存注冊用戶的信息:名字(first name),姓(last name),Email地址(email address),計數器(visit counter)。
先按下(xià)面步驟建表:
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)
然後建一(yī)個php頁面對照數據庫檢查cookies。
由于php能轉換可識别的cookie爲相應的變量,所以我(wǒ)(wǒ)們能檢查一(yī)個名爲"myCookies" 的變量:
<? if (isset($myCookies)) { // 如果Cookie已經存在
……
} else { //如果Cookie不存在
……
}
?>
當cookie存在時,我(wǒ)(wǒ)們執行下(xià)面步驟:
首先取得cookie值,用explode函數分(fēn)析成不同的變量,增加計數器,并設一(yī)個新cookie:
$info = explode("&", $myCookies);
……
$count++;
$CookieString=$FirstName.'&'.$LastName.'&'.$email.'&'.$count;
SetCookie ("myCookies",$CookieString, time()+3600); //設置cookie
接着用html語句輸出用戶信息。
最後,用新的計數器值更新數據庫。
如果這個cookie不存在,我(wǒ)(wǒ)們顯示一(yī)個注冊頁(register.php)的鏈接。
下(xià)面的register.php是用戶注冊頁面:
/* register.php */
<form method="post" action="regOK.php">
First Name:<input type="text" name="FirstName">
Last Name:<input type="text" name="LastName">
<input type="submit" value="注冊">
</form>
用戶在register.php注冊頁面填寫的信息提交給regOK.php:
/* regOK.php */
if ($FirstName and $LastName and $email) {
 ……//在數據庫查詢用戶是否存在
}
}else{
……//錯誤處理
}
上面的程序流程如下(xià):
首先檢查所有的信息是否按要求填寫,如果沒有,返回重新輸入
如果所有信息填好,首先,我(wǒ)(wǒ)們從數據庫中(zhōng)取回用戶登錄詳細資(zī)料
mysql_connect() or die ("連接數據庫出現錯誤!");
$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"];
檢查數據庫是否有這樣一(yī)個用戶,如果有,它指定舊(jiù)的信息,并用當前的信息建一(yī)新的cookie,如果同一(yī)用戶沒有數據庫登錄,新建一(yī)數據庫登錄,并建一(yī)新的cookie。
現在利用isset()函數檢查用戶是否有計數器,如果有則計數器增加并且建立一(yī)個新的cookie:
$count++; //增加計數器
$CookieString=$FirstName.'&'.$LastName.'&'.$email.'&'.$count;
SetCookie ("myCookies",$CookieString, time()+3600);
如果沒有一(yī)用戶計數器,在mysql中(zhōng)加一(yī)記錄,并設一(yī)cookie
注意:調用setcookie函數之前應該沒有任何數據輸出倒浏覽器,否則将會出現錯誤。
  如何實現跨域名Cookie?
  從Cookie規範上說,一(yī)個cookie隻能用于一(yī)個域名,因此,如果在浏覽器中(zhōng)對一(yī)個域名設置了一(yī)個cookie,那麽這個cookie對于其它的域名将無效。
  下(xià)面我(wǒ)(wǒ)們來談一(yī)個跨域名cookie的實現方案:
第一(yī)步:創建預置腳本
  将下(xià)面的代碼加到預置腳本中(zhōng)(或出現在所有腳本之前的函數中(zhōng))。
    <?php
    /*如果GET變量已經設置了,并且它與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'];
    }
    ?>
這個代碼運行之後,一(yī)個全局變量'sessionid'将可以用于腳本。它将保存用戶的cookie中(zhōng)的sessionid值,或者是通過GET請求發來的sessionid值。
第二步:爲所有的交叉域名引用使用變量
  創建一(yī)個全局的配置文件,用于存放(fàng)可以進行切換的域名的基本引用形式。例如,如果我(wǒ)(wǒ)們擁有domain1.com和domain2.com,則如下(xià)設置:
    <?php
    $domains['domain1'] = "http://www.domain1.com/-$sessionid-";
    $domains['domain2'] = "http://www.domain2.com/-$sessionid-";
    ?>
  我(wǒ)(wǒ)們寫這樣一(yī)段代碼:
    <?php
    echo "Click <a href="", $domains['domain2'], "/contact/?email=yes">here</a> to contact us.";
    ?>
  上面的代碼将産生(shēng)如下(xià)的輸出:
    Click <a href="http://www.domain2.com/-66543afe6543asdf6asd-/contact/?email=yes">here</a> to contact us.
  在這裏sessionid已經被插入到URL中(zhōng)去(qù)了。
第三步:配置Apache
  現在,我(wǒ)(wǒ)們來配置Apache來重寫這個URL。
  我(wǒ)(wǒ)們需要将
    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/? ... 6543afe6543asdf6asd
  爲了實現上面的要求,簡單地配置兩個虛拟服務器,作爲domain1和domain2,如下(xià)操作:
    <VirtualHost 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>
  這些重寫的規則實現了上面兩個URL重寫的要求。
文章來源:http://www.siteengine.net/thread.php?classid=15&id=55
免責聲明:本站相關技術文章信息部分(fēn)來自網絡,目的主要是傳播更多信息,如果您認爲本站的某些信息侵犯了您的版權,請與我(wǒ)(wǒ)們聯系,我(wǒ)(wǒ)們會即時妥善的處理,謝謝合作!