Próbuję uzyskać dostęp do wartości pliku cookie (używając $_COOKIE
) natychmiast po wywołaniu setcookie()
funkcji w PHP. Kiedy to robię,$_COOKIE['uname']
nie jest ustawione. Czemu?
Należy jednak pamiętać, że $_COOKIE['uname']
jest to ustawiane zgodnie z oczekiwaniami po następnym wykonaniu skryptu, na przykład po odświeżeniu strony.
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];
$_COOKIE
sobie odpowiednie wpisy, albo wykonując natychmiastowe przekierowanie (na tę samą stronę).Odpowiedzi:
$_COOKIE
jest ustawiana podczas ładowania strony ze względu na bezpaństwowy charakter sieci. Jeśli chcesz uzyskać natychmiastowy dostęp, możesz ustawić$_COOKIE['uname']
siebie lub użyć zmiennej pośredniej.Na przykład:
if (isset($_COOKIE['uname'])) { // get data from cookie for local use $uname = $_COOKIE['uname']; } else { // set cookie, local $uname already set setcookie('uname', $uname, time() + 1800); }
źródło
$uname
w swoim skrypcie. Podczas gdy Mark Baker używa$_COOKIE['uname']
bezpośrednio.setcookie()
. Ta odpowiedź może nie odpowiadać dokładnie Twoim potrzebom. Ale to nie czyni tego źle . OP i SO uznali tę odpowiedź za przydatną.setcookie()
tym kodzie dostęp nie jest możliwy$_COOKIE['uname']
Plik cookie nie jest ustawiany, dopóki odpowiedź nie zostanie wysłana z powrotem do klienta i nie jest dostępny w twoim PHP do następnego żądania od klienta.
Jeśli jednak ustawisz plik cookie w swoim skrypcie, możesz:
setcookie('uname', $uname, time()+60*30); $_COOKIE['uname'] = $uname;
źródło
Jeśli chcesz uzyskać dostęp do wartości pliku cookie natychmiast po wywołaniu
setcookie()
, nie możesz użyć$_COOKIE
. Przyczyną tego jest natura protokołu (patrz https://tools.ietf.org/html/rfc6265 ). Kiedysetcookie()
go używasz , definiuje plik cookie, który ma być wysłany wraz z resztą nagłówków HTTP do klienta (patrz http://php.net/manual/en/function.setcookie.php ). Ale$_COOKIE
z drugiej strony zawiera zmienne przekazywane do aktualnego skryptu przez pliki cookie HTTP od klienta ( http://php.net/manual/en/reserved.variables.cookies.php ).Kiedy zmieniasz się
$_COOKIE
po wywołaniusetcookie()
- jak zalecają niektóre odpowiedzi tutaj - nie zawiera już tylko plików cookie od klienta. Może to kolidować z założeniami przyjętymi w kodzie strony trzeciej używanym w Twojej aplikacji i może powodować niepożądane efekty na stronie. Więc ogólnie nie jest to dobra praktyka i jest to opcja tylko wtedy, gdy wywołaniasetcookie()
są częścią twojego własnego kodu.Czystym i przejrzystym sposobem uzyskania wartości ustawionej w
setcookie()
ramach tego samego żądania jest użycieheaders_list()
(patrz http://php.net/manual/en/function.headers-list.php ) :function getcookie($name) { $cookies = []; $headers = headers_list(); // see http://tools.ietf.org/html/rfc6265#section-4.1.1 foreach($headers as $header) { if (strpos($header, 'Set-Cookie: ') === 0) { $value = str_replace('&', urlencode('&'), substr($header, 12)); parse_str(current(explode(';', $value, 1)), $pair); $cookies = array_merge_recursive($cookies, $pair); } } return $cookies[$name]; } // [...] setcookie('uname', $uname, time() + 60 * 30); echo "Cookie value: " . getcookie('uname');
Ale zauważ, że to nie zadziała w PHP CLI (np. PHPUnit). W takim przypadku możesz użyć rozszerzeń innych firm, takich jak XDebug (patrz http://xdebug.org/docs/all_functions#xdebug_get_headers ).
źródło
explode()
nie działa dla mnie, po prostu zwraca jeden element tablicy z całym ciągiem w środku: ideone.com/7SnV9yMusisz samodzielnie ustawić zmienną cookie, jeśli potrzebujesz jej od razu, zanim załadujesz inną stronę, prawdziwy plik cookie zostanie ustawiony w wyniku metody setcookie.
setcookie('name', $value, time()+60*30); $_COOKIE ['name'] = $value;
źródło
Możemy to zrobić za pomocą połączeń AJAX.
Jeśli chcemy tworzyć pliki cookie za pomocą przycisku, więc najpierw utwórz wywołanie AJAX do tworzenia plików cookie, a następnie po powodzeniu pierwszego połączenia AJAX możemy wywołać inny AJAX w celu pobrania plików cookie.
function saveCookie() { var base_url = $('#base_url').val(); var url = base_url + '/index/cookie'; $.ajax({ 'url': url, 'type': 'POST', 'success': function (data) { if (data) { var url = base_url + '/index/get_cookie'; $.ajax({ 'url': url, 'type': 'POST', 'success': function (response) { var container = $('#show'); if (response) { container.html(response); } } }); } } }); } <button type="button" onclick="saveCookie()">Save Cookie</button> <div id="show"></div>
źródło
Miałem podobny problem, gdy użyłem funkcji z dołączonego pliku i rozwiązałem go za pomocą funkcji, która zarówno zwraca wartość pliku cookie, jak i ustawia plik cookie.
function setCookie($input) { setcookie('uname', $input, time() + 60 * 30); return $input; } if(!isset($_COOKIE['uname'])) { $uname = setCookie($whatever); } else { $uname = $_COOKIE['uname']; } echo "Cookie value: " . $uname;
źródło
Używając ob_start () i ob_flush () możesz wysłać plik cookie do klienta i pobrać go w tym samym czasie wykonywania. Spróbuj tego:
ob_start(); setcookie('uname', $uname, time() + 60 * 30); ob_flush(); echo "Cookie value: " . $_COOKIE['uname'];
źródło
Twój scenariusz
setcookie()
Funkcja działa, gdy przeglądarka internetowa żąda strony po raz pierwszy, w twoim przypadku przeładowanie. Ten plik cookie jest przechowywany w przeglądarce użytkownika i nie jest dostępny dla Twojego skryptu działającego na serwerze do następnego żądania lub w Twoim przypadku do ponownego załadowania.Przy następnym żądaniu przeglądarka wysyła ten plik cookie na serwer, a tablica
$_COOKIE
będzie miała początkowo ustawioną wartość, a przeglądarka odeśle z powrotem przy drugim żądaniu.źródło
Ustawiłem stałą w tym samym czasie, gdy plik cookie był tworzony
define('CONSTANT', true); return setcookie('cookiename', 'cookie value goes here', time() + 60 * 60 * 24 * 30, '/');
Mogę wtedy od razu coś zrobić poprzez:
if(isset($_COOKIE['cookiename']) || $_COOKIE['cookiename'] || defined('CONSTANT') && CONSTANT)
źródło