首頁 > 頭條 > php cookie(專題)

php cookie(專題)

PHPz
發布: 2020-08-10 13:44:45
原創
4421 人瀏覽過

本專題透過圖文、影片的形式全面介紹了php cookie的由來,php cookie屬性有哪些,php cookie函數用法以及php cookie實際應用實例,簡單易懂!歡迎php中文網的同學學習!

php cookie(專題)

一:一是 Cookie ?

cookie 常用於辨識使用者。

cookie 是一種伺服器留在使用者電腦上的小檔案。

每當同一台電腦透過瀏覽器要求頁面時,這台電腦就會傳送 cookie。

透過 PHP,您能夠建立並取回 cookie 的值。

相關專題推薦:php session 

#二:Cookie 的誕生

由於HTTP協定是無狀態的,而伺服器端的業務必須是要有狀態的。

Cookie誕生的最初目的是為了儲存web中的狀態訊息,以方便伺服器端使用。

例如判斷使用者是否是第一次造訪網站。目前最新的規格是RFC 6265,它是一個由瀏覽器伺服器共同協作實現的規格。

三:Cookie 的原理

php cookie(專題)

#第一次造訪網站的時候,瀏覽器發出請求,伺服器回應請求後,會將cookie放入到回應請求中,在瀏覽器第二次發請求的時候,會把cookie帶過去,服務端會辨別用戶身份,當然伺服器也可以修改cookie內容。

四:Cookie 屬性

#Cookie是一段不超過4KB的小型文字數據,由一個名稱(Name)、一個值(Value)和其它幾個用於控制Cookie有效期、安全性、使用範圍的可選屬性組成。

php cookie(專題)

Name 表示 Cookie 的名稱。
Value

表示 Cookie 的值。

Domain

指定了可以存取該 Cookie 的 Web 網站或網域。

Cookie 機制並未遵循嚴格的同源策略,允許一個子域可以設定或取得其父域的 Cookie。

Path

定義了可以在Web網站上存取該Cookie的目錄。

Expires

什麼是有效期,就是圖中的Expires屬性,一般瀏覽器的cookie都是預設儲存的,當關閉瀏覽器結束這個會話的時候,這個cookie也會被刪除。

Secure

指定是否使用HTTPS安全協定傳送Cookie。

使用HTTPS安全協議,可以保護Cookie在瀏覽器和網路伺服器間的傳輸過程中不被竊取和篡改。此方法也可用於Web網站的身份鑑別,即在HTTPS的連線建立階段,瀏覽器會檢查Web網站的SSL憑證的有效性。

HttpOnly 用於防止用戶端腳本透過document.cookie屬性存取Cookie,有助於保護Cookie不被跨站腳本攻擊竊取或竄改。

五:PHP Cookie 函數

#1、setcookie — 傳送Cookie

#
setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] ) : bool
登入後複製

setcookie() 定義了Cookie,會和剩下的HTTP 頭一起傳送給客戶端。 

和其他 HTTP 頭一樣,必須在腳本產生任意輸出之前發送 Cookie(由於協定的限制)。 

請在產生任何輸出之前(包括 和 或空格)呼叫本函數。

一旦設定 Cookie 後,下次開啟頁面時可以使用 $_COOKIE 讀取。 

Cookie 值同樣也存在於 $_REQUEST。

參數

參數描述
nameCookie 名稱。
value

Cookie 值。這個數值儲存在使用者的電腦裡,請勿儲存敏感資訊。

expire

Cookie 的過期時間。

這是一個 Unix 時間戳,也就是 Unix 紀元以來的秒數。

也就是說,基本上可以用 time() 函數的結果加上希望過期的秒數。

path

Cookie 有效的伺服器路徑。

設定成 '/' 時,Cookie 對整個網域 domain 有效。 

如果設定成 '/foo/', Cookie 僅對 domain 中 /foo/ 目錄及其子目錄有效。 

預設值是設定 Cookie 時的目前目錄。

domain

Cookie 的有效網域/子網域。 

設定成子域名,會讓 Cookie 對這個子網域和它的三級網域有效。 

讓 Cookie 對整個網域有效,只要設定成網域就可以了。

secure

設定這個 Cookie 是否只是透過安全的 HTTPS 連線傳給客戶端。

設定成 TRUE 時,只有安全連線存在時才會設定 Cookie。 

如果是在伺服器端處理這個需求,程式設計師需要只在安全連線上傳送此類 Cookie 。

httponly

設定為 TRUE,Cookie 僅可透過 HTTP 協定存取。

這意思是 Cookie 無法透過類似 JavaScript 這樣的腳本語言存取。 

要有效減少 XSS 攻擊時的身份竊取行為,建議用此設置,不過這個說法經常有爭議。

#

返回值

如果在调用本函数以前就产生了输出,setcookie() 会调用失败并返回 FALSE。

如果 setcookie() 成功运行,返回 TRUE。

示例

<?php
$value = &#39;something from somewhere&#39;;

setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600);  /* 1 小时过期  */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", 1);
?>
登入後複製

2、setrawcookie — 发送未经 URL 编码的 cookie

setrawcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] ) : bool
登入後複製

setrawcookie() 和 setcookie() 非常相似,唯一不同之处是发送到浏览器的 cookie 值没有自动经过 URL 编码(urlencode)。

六:PHP Cookie 简单示例

1、基本操作

<?php

//添加Cookie
setcookie(&#39;username&#39;, &#39;phpcn&#39;, time() + 3600);

//获取Cookie
$username = $_COOKIE[&#39;username&#39;];

//删除Cookie
setcookie(&#39;username&#39;, &#39;&#39;, time() - 3600);

//修改Cookie
setcookie(&#39;username&#39;, &#39;phpcn-updated&#39;, time() + 3600);

?>
登入後複製

2、面向过程封装

<?php

/**
 * 获取 Cookie
 * @param  string $name Cookie 名称
 * @return mixed       Cookie 值
 */
function cookie_get($name)
{
	return isset($_COOKIE[$name]) ? $_COOKIE[$name] : null;
}

/**
 * 删除 Cookie
 * @param  string $name Cookie 名称
 */
function cookie_del($name)
{
	setcookie($name, &#39;&#39;, time() - 3600);
}

/**
 * 设置Cookie
 * @param  string  $name   Cookie 名称
 * @param  mixed  $value  Cookie 值
 * @param  integer $expire Cookie 过期时间
 * @param  string  $path   Cookie 有效路径
 * @param  string  $domian Cookie 有效域名/子域名
 */
function cookie_set($name, $value, $expire = 3600, $path = &#39;/&#39;, $domian = &#39;&#39;)
{
	setcookie($name, $value, time() + $expire);
}

/**
 * 检测 Cookie
 * @param  string  $name      Cookie 名称
 * @param  boolean $has_empty 检测为空
 * @return boolean             
 */
function cookie_has($name)
{
	return isset($_COOKIE[$name]);
}

?>
登入後複製

3、面向对象封装

<?php


class Cookie
{
    const OPTION_EXPIRE = &#39;expire&#39;;
    const OPTION_PATH = &#39;path&#39;;
    const OPTION_DOMAIN = &#39;domain&#39;;
    const OPTION_SECURE = &#39;secure&#39;;
    const OPTION_HTTPONLY = &#39;httponly&#39;;

    /**
     * Cookie 实例
     * @var null
     */
    private static $instance = null;

    /**
     * Cookie 选项
     * @var array
     */
    private $options = [
        self::OPTION_EXPIRE => 3600,
        self::OPTION_PATH => &#39;/&#39;,
        self::OPTION_DOMAIN => &#39;domain&#39;,
        self::OPTION_SECURE => false,
        self::OPTION_HTTPONLY => false
    ];

    /**
     * Cookie constructor.
     * @param $options
     */
    private function __construct($options)
    {
        $this->setOptions($options);
    }

    /**
     *  privated __clone
     */
    private function __clone()
    {

    }

    /**
     * 获取实例
     * @param $options
     * @return Cookie|null
     */
    public static function getInstance($options)
    {
        if (is_null(self::$instance)) {
            self::$instance = new self($options);
        }

        return self::$instance;
    }

    /**
     * 设置选项
     * @param $name
     * @param $value
     */
    public function setOption($name, $value)
    {
        if (isset($this->options[$name])) {
            $this->options[$name] = $value;
        }

        throw new InvalidArgumentException(&#39;Cookie option not exists:{$name}&#39;);
    }

    /**
     * 设置多个选项
     * @param $options
     */
    public function setOptions($options)
    {
        foreach ($options as $name => $value) {
            $this->setOption($name, $value);
        }
    }

    /**
     * 设置 Cookie
     * @param $name
     * @param $value
     * @param array $options
     */
    public function set($name, $value, $options = [])
    {
        $this->setOptions($options);

        if (is_array($value) || is_object($value)) {
            $value = json_encode($value);
        }

        setcookie(
            $name,
            $value,
            $this->options[self::OPTION_EXPIRE],
            $this->options[self::OPTION_PATH],
            $this->options[self::OPTION_DOMAIN],
            $this->options[self::OPTION_SECURE],
            $this->options[self::OPTION_HTTPONLY]
        );
    }

    /**
     * 获取 Cookie
     * @param $name
     * @return array|mixed
     */
    public function get($name)
    {
        $value = $_COOKIE[$name];

        if (is_array($value)) {
            $arr=[];
            foreach ($value as $k => $v) {
                $arr[$k] = substr($v, 0,1) == &#39;{&#39; ? json_decode($value) : $v;
            }
            return $arr;
        } else {
            return substr($value, 0,1) == &#39;{&#39; ? json_decode($value) : $value;
        }
    }

    /**
     * 删除 Cookie
     * @param $name
     * @param array $options
     */
    public function del($name, $options = [])
    {
        $this->setOptions($options);

        $value = $_COOKIE[$name];

        if ($value) {
            if (is_array($value)) {
                foreach ($value as $k => $v) {
                    setcookie(
                        $name . &#39;[&#39; . $k . &#39;]&#39;,
                        &#39;&#39;,
                        time() - 3600,
                        $this->options[self::OPTION_EXPIRE],
                        $this->options[self::OPTION_PATH],
                        $this->options[self::OPTION_DOMAIN],
                        $this->options[self::OPTION_SECURE],
                        $this->options[self::OPTION_HTTPONLY]
                    );
                    unset($v);
                }
            }else{
                setcookie(
                    $name,
                    &#39;&#39;,
                    time() - 3600,
                    $this->options[self::OPTION_EXPIRE],
                    $this->options[self::OPTION_PATH],
                    $this->options[self::OPTION_DOMAIN],
                    $this->options[self::OPTION_SECURE],
                    $this->options[self::OPTION_HTTPONLY]
                );
                unset($value);
            }
        }
    }
}
登入後複製

4、记住登录账号示例

<?php

function cookie_get_username()
{
    return isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : null;
}

function cookie_get_password()
{
    return isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : null;
}

function cookie_get_remember()
{
    return isset($_COOKIE[&#39;remember&#39;]) ? &#39;checked&#39; : null;
}


if ($_SERVER[&#39;REQUEST_METHOD&#39;] === &#39;POST&#39;) {

    $username = $_POST[&#39;username&#39;];
    $password = $_POST[&#39;password&#39;];

    if (isset($_POST[&#39;remember&#39;]) && $_POST[&#39;remember&#39;] === &#39;1&#39;) {
        setcookie(&#39;username&#39;, $username, time() + 3600);
        setcookie(&#39;password&#39;, $password, time() + 3600);
        setcookie(&#39;remember&#39;, &#39;1&#39;, time() + 3600);
    } else {
        setcookie(&#39;username&#39;, &#39;&#39;, time() - 3600);
        setcookie(&#39;password&#39;, &#39;&#39;, time() - 3600);
        setcookie(&#39;remember&#39;, &#39;&#39;, time() - 3600);
    }

    die(&#39;登录成功!&#39;);
}

?>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<form action="" method="post">
    <table width="300" border="1" align="center" cellpadding="5" cellspacing="5">
        <thead>
        <tr>
            <td colspan="2" align="center"><b>登录</b></td>
        </tr>
        </thead>
        <tr align="center">
            <td>用 户 名</td>
            <td><input type="text" name="username" value="<?=cookie_get_username()?>"></td>
        </tr>
        <tr align="center">
            <td>密码</td>
            <td><input type="password" name="password" value="<?=cookie_get_password()?>"></td>
        </tr>
        <tr align="center">
            <td>记住账号</td>
            <td>
                <input type="checkbox" name="remember" value="1" <?=cookie_get_remember()?>>
            </td>
        </tr>
        <tr align="center">
            <td colspan="2"><input type="submit" name="Submit" value="提交" /></td>
        </tr>
    </table>
</form>
登入後複製

六:php cookie 精选技术文章

1 .PHP7中创建COOKIE和销毁COOKIE的方法

2. 如何设置cookie和删除cookie

3. PHP 中 Session 和 Cookie 区别?

4. PHP 怎么带着 Cookie 跳转?

5. 注意!Laravel删除Cookie的小坑

6. PHP会话控制:cookie和session区别与用法深入理解

7. PHP之你不得不知道的COOKIE含义及使用方式

8. 怎样关闭阻止第三方cookie

9. JS读取PHP中设置的中文cookie时出现乱码怎么办

10. ThinkPHP6.0:Session和Cookie机制的变化

七:php cookie 相关视频教程

1. PHP中cookie怎么记录及删除变量?(图文+视频)

2. PHP cookie实现记录用户登陆信息的方法(图文+视频)

3. PHP cookie实现判断用户是否登录的方法(图文+视频)

4. PHP基于Cookie的购物车模块设计

5. 预定义变量(二):$_COOKIE浏览器上的小甜点

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板