PHP.mk документација

setcookie

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

function.setcookie.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека function.setcookie.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
setcookie

Референца за `function.setcookie.php` со подобрена типографија и навигација.

function.setcookie.php

setcookie

(PHP 4, PHP 5, PHP 7, PHP 8)

setcookieИспрати колаче

= NULL

setcookie(
         string $name,
         string $value = "",
         int $expires_or_options = 0,
         string $path = "",
         string $domain = "",
         bool $secure = false,
         bool $httponly = false
): bool

Алтернативен потпис достапен од PHP 7.3.0 (не е поддржан со именувани параметри):

setcookie(string $name, string $value = "", array $options = []): bool

setcookie() дефинира колаче што ќе се испрати заедно со останатите HTTP заглавија. Како и другите заглавија, колачињата мора да се испратат before било каков излез од скриптата (ова е протоколарно ограничување). Ова бара оваа функција да се повика пред било каков излез, вклучувајќи <html> and <head> тагови, како и било каков празен простор.

Откако колачињата ќе бидат поставени, тие можат да бидат пристапени при следното вчитување на страницата со $_COOKIE низа. Вредностите на колачињата исто така може да постојат во $_REQUEST.

Параметри

(PHP 4, PHP 5, PHP 7, PHP 8) обезбедува нормативна референца за тоа како секој setcookie() параметар се толкува.

name
Името на колачето.
value
Вредноста на колачето. Оваа вредност се чува на компјутерот на клиентот; не чувајте чувствителни информации. Ако се претпостави дека name is 'cookiename', оваа вредност се добива преку $_COOKIE['cookiename']
expires_or_options
Времето кога колачето истекува. Ова е Unix временски печат, така што е во број на секунди од епохата. Еден начин да се постави ова е со додавање на бројот на секунди пред колачето да истече на резултатот од повикувањето на time()» RFC 6265 time()+60*60*24*30 ќе го постави колачето да истече за 30 дена. Друга опција е да се користи mktime() функција. Ако е поставено на 0, или изоставено, колачето ќе истече на крајот од сесијата (кога прелистувачот ќе се затвори).

Забелешка: На expires_or_options параметарот зема Unix временски печат, за разлика од форматот на датумот Wdy, DD-Mon-YYYY HH:MM:SS GMT, бидејќи PHP ја врши оваа конверзија внатрешно.

path
Патеката на серверот на која колачето ќе биде достапно. Ако е поставено на '/', колачето ќе биде достапно во целиот domain. Ако е поставено на '/foo/', колачето ќе биде достапно само во /foo/ директориумот и сите поддиректориуми како /foo/bar/ of domain. Стандардната вредност е тековниот директориум во кој е поставено колачето.
domain
Поддоменот (или целиот домен) на кој е достапно колачето. Поставувањето на поддомен (како 'www.example.com') ќе го направи колачето достапно за тој поддомен и сите други негови поддомени (т.е. w2.www.example.com). За да го направите колачето достапно за целиот домен (вклучувајќи ги сите негови поддомени), едноставно поставете ја вредноста на името на доменот ('example.com', во овој случај). Постарите прелистувачи кои сè уште го имплементираат отфрлениот . На пример, може да бараат водечки . за да одговараат на сите поддомени.
secure
Индицира дека колачето треба да се пренесува само преку безбедна HTTPS конекција од клиентот. Кога е поставено на true, колачето ќе биде поставено само ако постои безбедна конекција. На страната на серверот, програмерот е одговорен да го испрати овој тип на колаче само на безбедна конекција (на пр. во однос на $_SERVER["HTTPS"]).
httponly
Кога true , колачето ќе биде достапно само преку HTTP протоколот. Ова значи дека колачето нема да биде достапно преку скриптни јазици, како JavaScript. Предложено е дека оваа поставка може ефективно да помогне во намалувањето на кражбата на идентитет преку XSS напади (иако не е поддржано од сите прелистувачи), но ова тврдење често се оспорува. true or false
options
Асоцијативен array кој може да има било кој од клучевите expires, path, domain, secure, httponly and samesite. Вредностите имаат исто значење како што е опишано за параметрите со исто име. Вредноста на samesite елементот треба да биде или None, Lax or Strict. Ако некоја од дозволените опции не е дадена, нивните стандардни вредности се исти како стандардните вредности на експлицитните параметри. Ако samesite елементот е изоставен, не е поставен атрибут за SameSite колаче.

Забелешка: За да поставите колаче што вклучува атрибути што не се меѓу наведените клучеви, користете header().

Забелешка: Враќа samesite is "None" then secure исто така мора да биде овозможено или колачето ќе биде блокирано од клиентот.

Вратени вредности

Ако постои излез пред повикувањето на оваа функција, setcookie() ќе откаже и ќе врати false. Ако setcookie() успешно се извршува, ќе врати true. Ова не покажува дали корисникот го прифатил колачето.

Errors/Exceptions

Ако options низата содржи неподдржани клучеви:

  • Пред PHP 8.0.0, а E_WARNING беше генерирано.
  • Од PHP 8.0.0, а ValueError се фрла.

Дневник на промени

Верзија = NULL
8.2.0 Форматот на датумот на колачето сега е 'D, d M Y H:i:s \G\M\T'; претходно беше 'D, d-M-Y H:i:s T'.
8.0.0 Поминувањето на неподдржани клучеви сега фрла а ValueError наместо да емитува а E_WARNING.
7.3.0 Додадена е алтернативна потпис што поддржува а options низа. Овој потпис исто така поддржува поставување на атрибутот за SameSite колаче.

Примери

Ефектите од следните примери може да се набљудуваат со користење на списокот со колачиња во алатките за развивачи на прелистувачот (обично во табулаторот Storage или Application).

Пример #1 setcookie() испрати пример

<?php

$value
= 'something from somewhere';

// Set a "session cookie" that expires when the browser is closed
setcookie("TestCookie", $value);
// Set a cookie that expires in 1 hour
setcookie("TestCookie", $value, time()+3600);
// Set a cookie that applies only to a specific path on a specific domain
// Note that the domain used should match the site domain
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", true);

?>

Имајте предвид дека делот со вредност на колачето автоматски ќе биде urlencoded и декодиран од PHP. Ова може да се избегне со користење setrawcookie() instead.

» RFC 2109

<?php
// Print an individual cookie
echo $_COOKIE["TestCookie"];

// Another way to debug/test is to view all cookies
print_r($_COOKIE);
?>

Пример #2 setcookie() За да ги видите содржините на колачињата поставени во горниот пример при подоцнежно барање:

избриши пример

За да избришете колаче, поставете го датумот на истекување на вредност во минатото (но не нула, која е резервирана за колачиња за сесија).

<?php
// set the expiration date to one hour ago
setcookie("TestCookie", "", time() - 3600);
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);
?>

Пример #3 setcookie() За да ги избришете колачињата поставени во претходниот пример:

и низи

<?php
// set the cookies
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");

// after the page reloads, print them out
if (isset($_COOKIE['cookie'])) {
foreach (
$_COOKIE['cookie'] as $name => $value) {
$name = htmlspecialchars($name);
$value = htmlspecialchars($value);
echo
"$name : $value <br />\n";
}
}
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

three : cookiethree
two : cookietwo
one : cookieone

Забелешка: „Низа од колачиња“ може да се постави со користење на нотација на низа во името на колачето. Ова има ефект на поставување онолку колачиња колку што има елементи во низата, но кога колачето ќе го прими скриптата, вредностите се ставаат во низа со името на колачето: [ and ] Користење на карактери за разделување како

Белешки

Забелешка: како дел од името на колачето не е во согласност со RFC 6265, дел 4, но се очекува да биде поддржано од корисничките агенти според RFC 6265, дел 5. ob_start() and ob_end_flush() Тампонирањето на излезот може да се користи за да се овозможи излез од скриптата пред повикот на оваа функција. Целиот излез ќе биде тампониран додека не се испразни (или експлицитно или на крајот од извршувањето на скриптата). Ова се прави со повикување output_buffering во скриптата, или поставување на php.ini директива за конфигурација на

или конфигурациски датотеки на серверот.

  • Вообичаени стапици: expires_or_options Колачињата нема да станат видливи до следното вчитување на страницата за која колачето треба да биде видливо. За да проверите дали колачето е успешно поставено, проверете го колачето на следната страница што се вчитува пред да истече колачето. Времето на истекување се поставува преку print_r($_COOKIE);.
  • параметарот. Убав начин за отстранување грешки во постоењето на колачиња е едноставно со повикување value Колачињата мора да се избришат со истите параметри со кои биле поставени. Ако setcookie()аргументот е празен стринг, и сите други аргументи се совпаѓаат со претходен повик на 'deleted' , тогаш колачето со наведеното име ќе биде избришано од далечинскиот клиент. Ова се постигнува внатрешно со поставување на вредноста на
  • и времето на истекување во минатото. false За да ги видите содржините на колачињата поставени во горниот пример при подоцнежно барање: 0 for false and 1 for true.
  • ќе се обиде да го избрише колачето, булови вредности не треба да се користат. Наместо тоа, користете json_encode() Имињата на колачињата можат да се постават како имиња на низи и ќе бидат достапни за PHP скрипти како низи, но посебни колачиња се чуваат од прелистувачот. Разгледајте serialize() да поставите едно колаче со повеќе имиња и вредности. Не се препорачува да се користи

за оваа цел бидејќи може да резултира со безбедносни дупки. setcookie() Повеќе повици на

Види Исто така

Белешки од корисници 14 белешки

walterquez
пред 13 години
Instead of this:
<?php setcookie( "TestCookie", $value, time()+(60*60*24*30) ); ?>

You can this:
<?php setcookie( "TestCookie", $value, strtotime( '+30 days' ) ); ?>
секција за колачиња
пред 13 години
Want to remove a cookie?

Many people do it the complicated way:
setcookie('name', 'content', time()-3600);

But why do you make it so complicated and risk it not working, when the client's time is wrong? Why fiddle around with time();

Here's the easiest way to unset a cookie:
setcookie('name', 'content', 1);

Thats it.
Анонимен
пред 5 години
Just an example to clarify the use of the array options, especially since Mozilla is going to deprecate / penalise the use of SameSite = none,  which is used by default if not using array options. 

<?php
$arr_cookie_options = array (
                'expires' => time() + 60*60*24*30, 
                'path' => '/', 
                'domain' => '.example.com', // leading dot for compatibility or use subdomain
                'secure' => true,     // or false
                'httponly' => true,    // or false
                'samesite' => 'None' // None || Lax  || Strict
                );
setcookie('TestCookie', 'The Cookie Value', $arr_cookie_options);    
?>
Bachsau
пред 9 години
It's worth a mention: you should avoid dots on cookie names.

<?php
// this will actually set 'ace_fontSize' name:
setcookie( 'ace.fontSize', 18 );
?>
nacho at casinelli dot com
19 години пред
Note when setting "array cookies" that a separate cookie is set for each element of the array.

On high traffic sites, this can substantially increase the size of subsequent HTTP requests from clients (including requests for static content on the same domain).

More importantly though, the cookie specification says that browsers need only accept 20 cookies per domain.  This limit is increased to 50 by Firefox, and to 30 by Opera, but IE6 and IE7 enforce the limit of 20 cookie per domain.  Any cookies beyond this limit will either knock out an older cookie or be ignored/rejected by the browser.
Анонимен
19 години пред
something that wasn't made clear to me here and totally confused me for a while was that domain names must contain at least two dots (.), hence 'localhost' is invalid and the browser will refuse to set the cookie! instead for localhost you should use false.

to make your code work on both localhost and a proper domain, you can do this:

<?php

$domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
setcookie('cookiename', 'data', time()+60*60*24*365, '/', $domain, false);

?>
paul nospam AT nospam sitepoint dot com
пред 1 година
In any web browser there is a very commonly used option "Open previous windows and tabs" which is disabled by default, but many people enable it.
When this option is active, the web browser, when closing and reopening, instead of executing the termination and starting a new session, saves and restores the current session along with session cookies and sessionStorage.
Both session cookies and sessionStorage, contrary to expectations, can live for a very long time until the user closes the tab before closing the web browser.
If you want a cookie, for example with a time offset, to be guaranteed to have a short lifetime, you should explicitly specify this short lifetime, rather than relying on self-deletion on the session cookie.
gabe на fijiwebdesign точка com
19 години пред
If you want to delete all cookies on your domain, you may want to use the value of:

<?php $_SERVER['HTTP_COOKIE'] ?>

rather than:

<?php $_COOKIE ?>

to dertermine the cookie names. 
If cookie names are in Array notation, eg: user[username] 
Then PHP will automatically create a corresponding array in $_COOKIE. Instead use $_SERVER['HTTP_COOKIE'] as it mirrors the actual HTTP Request header. 

<?php

// unset cookies
if (isset($_SERVER['HTTP_COOKIE'])) {
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach($cookies as $cookie) {
        $parts = explode('=', $cookie);
        $name = trim($parts[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}

?>
ilya at ilya dot top
пред 5 години
The " PHPSESSID " cookie will soon be rejected because its " sameSite " attribute is set to " none " or an invalid value, and without " secure " attribute. To learn more about the "sameSite" attribute, visit https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie/SameSite.

<?php
 ini_set("session.cookie_secure", 1);
 session_start();

my PHP code .... 

?>
synnus at gmail dot com
пред 11 години
Caveat: if you use URL RewriteRules to get stuff like this: domain.com/bla/stuf/etc into parameters, you might run into a hickup when setting cookies.
At least in my setup a change in one of the parameters resulted in the cookie not being 'there' anymore.
The fix is simple: specify the domain. '/' will usualy do fine.
Анонимен
пред 15 години
A period in a cookie name (like user.name) seems to show up in the $_COOKIE array as an underscore (so user_name). This means that for example $_COOKIE["user_name"] must be used to read a cookie that has been set with setcookie("user.name" ...), which is already rather confusing. 

Furthermore the variable $_COOKIE["user_name"] will retain the value set by setcookie("user.name" ...) and no amount of calling setcookie("user_name" ...) will alter this value. This is rather trivially fixed by clearing the "user.name" cookie, but it can take a while to realize this since there's only "user_name" in $_COOKIE.

Hope this saves someone some time.
laffen
пред 16 години
Note that the $_COOKIE variable not will hold multiple cookies with the same name. It is legitimate to set two cookies with the same name to the same host where the sub domain is different. 
<?php
setcookie("testcookie", "value1hostonly", time(), "/", ".example.com", 0, true);
setcookie("testcookie", "value2subdom", time(), "/", "subdom.example.com", 0, true);
?>
The next request from the browser will have both cookies in the $_SERVER['HTTP_COOKIE'] variable, but only one of them will be found in the $_COOKIE variable. Requests to subdom.example.com will have both cookies, while browser request to example.com or www.example.com only sends the cookie with the "value1hostonly" value.

<?php
$kaker = explode(";", $_SERVER['HTTP_COOKIE']);
foreach($kaker as $val){
    $k = explode("=", $val);
    echo trim($k[0]) . " => " . $k[1];
}

// output
testcookie => value1hostonly
testcookie => value2subdom

?>
ellert at vankoperen dot nl
Nimja
Please keep in mind that if you call setcookie() several times during the script execution (even for the same name, domain and path), then Set-Cookie header will be sent several times, and only after receiving all of them, client browser will "merge" them, replacing first value for the cookie with the next etc.

This may cause very large headers length sometimes, so you'll have to either increase buffers for your web server; change your code logic to determine all possibly-changing parameters values right from the start; implement some sort of global Response object keeping all the data, including cookies as well, till the end of processing (sort of optimized output beffering); or just avoid storing any large data in cookies.
alexsvetalena at mail dot ru
пред 1 година
As of PHP 7.3, you can use this syntax:

setcookie( $name,  $value,  $options)

Be aware that the array in $options is not fully compatible with array key names. In other words, the order of your array values matters regardless of the array key names.

<?PHP

// Correct (with key names):
setcookie(
    'my_cookie',
    'my_value',
    [
        'expires' => time() + 3600,
        'path' => '/',
    ]
);

// Correct (without key names):
setcookie(
    'my_cookie',
    'my_value',
    [
        time() + 3600, // expires
        '/' // path
    ]
);

// Incorrect Usage (wrong order as key names are ignored):
setcookie(
    'my_cookie',
    'my_value',
    [
        'path' => '/', // WRONG: should be 2nd
        'expires' => time() + 3600, // WRONG: should be 1st
    ]
);

// Here's the correct order of the $options array with default values:
$options = [
    'expires' => 0,
    'path' => "",
    'domain' => "",
    'secure' => false,
    'httponly' => false
];

setcookie(
    'my_cookie',
    'my_value',
    $options 
);

?>

If you do not provide options, the default values will be used.
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.