本專題透過圖文、影片的形式全面介紹了php cookie的由來,php cookie屬性有哪些,php cookie函數用法以及php cookie實際應用實例,簡單易懂!歡迎php中文網的同學學習!
一:一是 Cookie ?
cookie 常用於辨識使用者。
cookie 是一種伺服器留在使用者電腦上的小檔案。
每當同一台電腦透過瀏覽器要求頁面時,這台電腦就會傳送 cookie。
透過 PHP,您能夠建立並取回 cookie 的值。
相關專題推薦:php session
#二:Cookie 的誕生
由於HTTP協定是無狀態的,而伺服器端的業務必須是要有狀態的。
Cookie誕生的最初目的是為了儲存web中的狀態訊息,以方便伺服器端使用。
例如判斷使用者是否是第一次造訪網站。目前最新的規格是RFC 6265,它是一個由瀏覽器伺服器共同協作實現的規格。
三:Cookie 的原理
#第一次造訪網站的時候,瀏覽器發出請求,伺服器回應請求後,會將cookie放入到回應請求中,在瀏覽器第二次發請求的時候,會把cookie帶過去,服務端會辨別用戶身份,當然伺服器也可以修改cookie內容。
四:Cookie 屬性
#Cookie是一段不超過4KB的小型文字數據,由一個名稱(Name)、一個值(Value)和其它幾個用於控制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。
參數
參數 | 描述 |
name | Cookie 名稱。 |
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 = 'something from somewhere'; 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('username', 'phpcn', time() + 3600); //获取Cookie $username = $_COOKIE['username']; //删除Cookie setcookie('username', '', time() - 3600); //修改Cookie setcookie('username', 'phpcn-updated', 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, '', 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 = '/', $domian = '') { 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 = 'expire'; const OPTION_PATH = 'path'; const OPTION_DOMAIN = 'domain'; const OPTION_SECURE = 'secure'; const OPTION_HTTPONLY = 'httponly'; /** * Cookie 实例 * @var null */ private static $instance = null; /** * Cookie 选项 * @var array */ private $options = [ self::OPTION_EXPIRE => 3600, self::OPTION_PATH => '/', self::OPTION_DOMAIN => 'domain', 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('Cookie option not exists:{$name}'); } /** * 设置多个选项 * @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) == '{' ? json_decode($value) : $v; } return $arr; } else { return substr($value, 0,1) == '{' ? 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 . '[' . $k . ']', '', 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, '', 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['username']) ? $_COOKIE['username'] : null; } function cookie_get_password() { return isset($_COOKIE['username']) ? $_COOKIE['username'] : null; } function cookie_get_remember() { return isset($_COOKIE['remember']) ? 'checked' : null; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = $_POST['username']; $password = $_POST['password']; if (isset($_POST['remember']) && $_POST['remember'] === '1') { setcookie('username', $username, time() + 3600); setcookie('password', $password, time() + 3600); setcookie('remember', '1', time() + 3600); } else { setcookie('username', '', time() - 3600); setcookie('password', '', time() - 3600); setcookie('remember', '', time() - 3600); } die('登录成功!'); } ?> <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>
6. PHP会话控制:cookie和session区别与用法深入理解
9. JS读取PHP中设置的中文cookie时出现乱码怎么办
10. ThinkPHP6.0:Session和Cookie机制的变化
1. PHP中cookie怎么记录及删除变量?(图文+视频)
2. PHP cookie实现记录用户登陆信息的方法(图文+视频)