PHP setcookie() 函数定义要与其余 HTTP 标头一起发送的 cookie。setcookie() 函数会自动对cookie值进行 urlencode 编码。
与其他标头一样,cookie 必须在脚本的任何输出之前发送。这需要在任何输出之前调用此函数,包括 <html> 和 <head> 标记以及任何空白。
设置 cookie 后,可以在下一个页面加载时使用
Cookie 是存储在客户端计算机上的文本文件,它们用于跟踪目的。 PHP 透明地支持 HTTP cookie。识别回访用户涉及三个步骤:
- 服务器脚本向浏览器发送一组 cookie。例如姓名、年龄或 ID 等。
- 浏览器将此信息存储在本地计算机上以供将来使用。
- 下次浏览器向 Web 服务器发送任何请求时,它会发送这些 Cookie信息发送到服务器,服务器使用该信息来识别用户。
语法
setcookie(name, value, expires, path,
domain, secure, httponly)
//自 PHP 7.3.0 起可用的替代签名
setcookie(name, value, options)
参数
name | 必填。 指定 cookie 的名称。 |
value | 可选。 指定 cookie 的值。该值存储在客户端计算机上。该值可以通过 $_COOKIE['cookiename'] 检索。 |
expires | 可选。 指定 cookie 过期的时间。这是一个 Unix 时间戳,以纪元以来的秒数表示。例如: time()+60*60*24*30 将设置 cookie 在 30 天后过期。如果设置为 0 或省略,cookie 将在会话结束时(当浏览器关闭时)过期。默认值为 0。 |
path | 可选。 指定cookie的服务器路径。如果设置为"/",则 cookie 将在整个域中可用。如果设置为"/php/",则 cookie 将仅在 /php/ 目录和 php 的所有子目录中可用。默认值是设置 cookie 的当前目录。 |
domain | 可选。 指定 cookie 可用的(子)域名。要使 cookie 在 example.com 的所有子域上可用,请将域设置为"example.com"。将其设置为 www.example.com 将使 cookie 仅在 www 子域中可用 |
secure | 可选。 指定 cookie 是否只能通过安全 HTTPS 连接从客户端传输。当设置为 true 时,仅当存在安全连接时才会设置 cookie。默认值为 false。 |
httponly | 可选。 如果设置为 true,则只能通过 HTTP 协议访问 cookie(无法通过脚本语言(例如 JavaScript)访问 cookie)。此设置有助于减少通过 XSS 攻击进行的身份盗用。默认值为 false。 |
options |
|
返回值
如果在调用此函数之前存在输出,setcookie() 将失败并且返回假。如果setcookie()成功运行,它将返回true。这并不表明用户是否接受cookie。
示例:发送cookie
下面的示例展示了如何使用PHP脚本发送设置cookie请求。
<!DOCTYPE html>
<?php
//会话结束时过期
setcookie("name", "John Smith");
//1小时后过期
setcookie("age", 27, time()+3600);
//1小时后过期-此cookie将可用
//如果通过安全设置则在整个域内
//来自客户端的HTTPS连接
setcookie("hobbies", "painting", time()+3600, "/", "", 1);
?>
<html>
<head><title>Setting Cookies</title></head>
<body>
<?php echo "Set Cookies"; ?>
</body>
</html>
示例:访问cookie
可以通过$_COOKIE['cookiename']检索cookie的值。考虑下面的示例:
<!DOCTYPE html>
<?php
//1小时后过期
setcookie("TestCookie", "CookieValue", time()+3600);
?>
<html>
<head><title>Accessing Cookies</title></head>
<body>
<?php
if(!isset($_COOKIE["TestCookie"])) {
echo "This cookie is not set.";
} else {
"Value is: ".$_COOKIE['TestCookie'];
}
?>
</body>
</html>
示例:删除 cookie
要删除 cookie,可以使用 setcookie()设置过去的过期日期 功能。这将触发浏览器中的删除机制。
<!DOCTYPE html>
<?php
//设置过去1小时内的过期日期
//触发浏览器中的删除机制
setcookie("TestCookie", "CookieValue", time()-3600);
?>
<html>
<head><title>Deleting Cookies</title></head>
<body>
<?php echo "Deleting Cookies"; ?>
</body>
</html>
示例:修改cookie
要修改cookie,只需使用setcookie( ) 函数。
<!DOCTYPE html>
<?php
//这将修改过期时间
//时间为2小时
setcookie("TestCookie", "CookieValue", time()+7200);
?>
<html>
<head><title>Modifying Cookies</title></head>
<body>
<?php echo "Modifying Cookies"; ?>
</body>
</html>
示例:检查 cookie 是否启用
下面的示例可用于检查 cookie 是否启用。首先,尝试使用 setcookie() 函数创建一个测试 cookie,然后对 $_COOKIE 数组变量进行计数:
<!DOCTYPE html>
<?php
//这会将过期时间修改为2小时
setcookie("TestCookie", "CookieValue", time()+7200, "/");
?>
<html>
<head><title>Modifying Cookies</title></head>
<body>
<?php
if(count($_COOKIE) > 0) {
echo "Cookies are enabled.";
//代码
} else {
echo "Cookies are disabled.";
//代码
}
?>
</body>
</html>
示例:setcookie() 和数组
可以通过在 cookie 名称中使用数组表示法来设置数组 cookie。考虑下面的示例:
<!DOCTYPE html>
<?php
//设置cookie数组
setcookie("arr[three]", "cookiethree");
setcookie("arr[two]", "cookietwo");
setcookie("arr[one]", "cookieone");
?>
<html>
<head><title>Modifying Cookies</title></head>
<body>
<?php
//页面重新加载后,显示它们
if (isset($_COOKIE['arr'])) {
foreach ($_COOKIE['arr'] as $name => $value) {
$name = htmlspecialchars($name);
$value = htmlspecialchars($value);
echo "$name : $value <br>\n";
}
}
?>
</body>
</html>
上述代码的输出将是:
three : cookiethree
two : cookietwo
one : cookieone
注意:当发送cookie时,cookie的值部分将自动进行URL编码,当接收到cookie时,它将自动解码并分配给与cookie名称相同的变量。如果您不希望这样,可以使用setrawcookie()函数。