PHP中cookies使用指南

來源:互聯網
上載者:User

綜述
  Cookie是在HTTP協議下,伺服器或指令碼可以維護客戶工作站上資訊的一種方式。Cookie是由Web伺服器儲存在使用者瀏覽器上的小檔案,它可以包含有關使用者的資訊(如身份識別號碼、密碼、使用者在Web網站購物的方式或使用者訪問該網站的次數)。無論何時使用者連結到伺服器,Web網站都可以訪問Cookie資訊。
  怎樣設定cookies?
  在PHP中可以使用setcookie函數設定一個cookie。cookie是 HTTP標題的一部分, 因此設定cookie功能必須在任何內容送到瀏覽器之前。這種限制與header()函數一樣。任何從用戶端傳來的cookie將自動地轉化成一個PHP變數。PHP取得資訊頭並分析, 提取cookie名並變成變數。因此,如果設定cookie如setcookie("mycookie","Cookies")php將自動產生一個名為$mycookie,值為"Cookies"的變數。
  我們來看一下setcookie函數文法:
  init setcookie(string CookieName,string CookieValue,int CookieExpireTime,path,domain,int secure);
  參數說明:
  PATH:表示web伺服器上的目錄,預設為被調用頁面所在目錄
  DOMAIN:cookie可以使用的網域名稱,預設為被調用頁面的網域名稱。這個網域名稱必須包含兩個".",所以如果你指定你的頂級網域名稱,你必須用".mydomain.com"
  SECURE:如果設為"1",表示cookie只能被使用者的瀏覽器認為是安全的伺服器所記住.
cookies使用舉例
  假設我們有這樣一個需要註冊的網站,它自動識別使用者的身份並進行相關的操作:如果是已經註冊的使用者,發送給他資訊;如果不是已經註冊的使用者,則顯示一個註冊頁面的連結。
  按照上面的要求,我們先建立資料庫用來儲存註冊使用者的資訊:名字(first name),姓(last name),Email地址(email address),計數器(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)
  然後建一個php頁面對照資料庫檢查cookies。
  由於php能轉換可識別的cookie為相應的變數,所以我們能檢查一個名為"myCookies" 的變數:
    <? if (isset($myCookies)) { // 如果Cookie已經存在
    ……
    } else { //如果Cookie不存在
    ……
    }
    ?>
  當cookie存在時,我們執行下面步驟:
  首先取得cookie值,用explode函數分析成不同的變數,增加計數器,並設一個新cookie:
    $info = explode("&", $myCookies);
    ……
    $count++;
    $CookieString=$FirstName.'&'.$LastName.'&'.$email.'&'.$count;
    SetCookie ("myCookies",$CookieString, time()+3600); //設定cookie
  接著用html語句輸出使用者資訊。
  最後,用新的計數器值更新資料庫。
  如果這個cookie不存在,我們顯示一個註冊頁(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">
  <input type="submit" value="註冊">
  </form>
  使用者在register.php註冊頁面填寫的資訊提交給regOK.php:
  /* regOK.php */
  if ($FirstName and $LastName and $email) {
   ……//在資料庫查詢使用者是否存在
   }
  }else{
  ……//錯誤處理
  }

 上面的程式流程如下:
  首先檢查所有的資訊是否按要求填寫,如果沒有,返回重新輸入
  如果所有資訊填好,首先,我們從資料庫中取回使用者登入詳細資料
    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"];
  檢查資料庫是否有這樣一個使用者,如果有,它指定舊的資訊,並用當前的資訊建一新的cookie,如果同一使用者沒有資料庫登入,建立一資料庫登入,並建一新的cookie。
  現在利用isset()函數檢查使用者是否有計數器,如果有則計數器增加並且建立一個新的cookie:
    $count++; //增加計數器
    $CookieString=$FirstName.'&'.$LastName.'&'.$email.'&'.$count;
    SetCookie ("myCookies",$CookieString, time()+3600);
  如果沒有一使用者計數器,在mysql中加一記錄,並設一cookie
  注意:調用setcookie函數之前應該沒有任何資料輸出倒瀏覽器,否則將會出現錯誤。
  如何?跨網域名稱Cookie?
  從Cookie規範上說,一個cookie只能用於一個網域名稱,因此,如果在瀏覽器中對一個網域名稱設定了一個cookie,那麼這個cookie對於其它的網域名稱將無效。
  下面我們來談一個跨網域名稱cookie的實現方案:
第一步:建立預置指令碼
  將下面的代碼加到預置指令碼中(或出現在所有指令碼之前的函數中)。
    <?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'];
    }
    ?>
  這個代碼運行之後,一個全域變數'sessionid'將可以用於指令碼。它將儲存使用者的cookie中的sessionid值,或者是通過GET請求發來的sessionid值。
第二步:為所有的交叉網域名稱引用使用變數
  建立一個全域的設定檔,用於存放可以進行切換的網域名稱的基本引用形式。例如,如果我們擁有domain1.com和domain2.com,則如下設定:
    <?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.";
    ?>
  上面的代碼將產生如下的輸出:
    Click <a href="http://www.domain2.com/-66543afe6543asdf6asd-/contact/?email=yes">here</a> to contact us.
  在這裡sessionid已經被插入到URL中去了。
第三步:配置Apache
  現在,我們來配置Apache來重寫這個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
  為了實現上面的要求,簡單地配置兩個虛擬伺服器,作為domain1和domain2,如下操作:
    <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重寫的要求。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.