Intereting Posts
Измените эту функцию js так, чтобы она использовала значение, полученное из db вместо значений, указанных в массиве, для генерации опций Select Как проверить, была ли переменная передана по ссылке в PHP PHP, повторение массива в строку разделенных запятыми значений избыточен PDO :: PARAM_INT? PHP: Невозможно изменить 404 код состояния, но нет ошибки в заголовке () Symfony DomCrawler: найдите элемент с определенным значением атрибута wp_mail () в цикле, только отправка на последний адрес Используя .htaccess, чтобы все страницы .html запускались как .php-файлы? Проблема с получением автора из RSS-ленты wordpress с использованием SimpleXmlElement Как изменять значения отображаются в панели задач Phabricator в режиме рабочего процесса отставания Класс «Mage_Googlecheckout_Helper_Data» не найден file_get_contents синхронный или асинхронный Пустое содержимое потока PHP SSH2, даже с stream_set_blocking? Класс Codeigniter Session отключен для конкретного контроллера Чтение метаданных PDF в PHP

Доступ к $ _COOKIE сразу после setcookie ()

Я пытаюсь получить доступ к значению cookie (используя $_COOKIE ) сразу после вызова функции setcookie() в PHP. Когда я это сделаю, $_COOKIE['uname'] не установлен. Зачем?

Обратите внимание, однако, что $_COOKIE['uname'] устанавливается как ожидалось при следующем выполнении скрипта, например, после обновления страницы.

 setcookie('uname', $uname, time() + 60 * 30); echo "Cookie value: " . $_COOKIE['uname']; 

$_COOKIE устанавливается, когда страница загружается из-за отсутствия состояния в Интернете. Если вам нужен немедленный доступ, вы можете $_COOKIE['uname'] установить $_COOKIE['uname'] или использовать промежуточную переменную.

Например:

 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); } 

Файл cookie не установлен до тех пор, пока ответ не будет отправлен обратно клиенту и не будет доступен на вашем PHP до следующего запроса от клиента после этого.

Однако, когда вы устанавливаете файл cookie в своем скрипте, вы можете:

 setcookie('uname', $uname, time()+60*30); $_COOKIE['uname'] = $uname; 

Если вы хотите получить доступ к значению cookie сразу после вызова setcookie() вы не можете использовать $_COOKIE . Причина этого в характере протокола (см. https://tools.ietf.org/html/rfc6265 ). Когда вы используете setcookie() он определяет Cookie для отправки вместе с остальными HTTP-заголовками для клиента (см. http://php.net/manual/en/function.setcookie.php ). Но $_COOKIE с другой стороны, содержит переменные, переданные текущему скрипту через HTTP Cookies от клиента ( http://php.net/manual/en/reserved.variables.cookies.php ).

Когда вы меняете $_COOKIE после вызова setcookie() – как некоторые рекомендации здесь рекомендуют – он больше не содержит только Cookies от клиента. Это может помешать допущениям, сделанным в стороннем коде, используемом в вашем приложении, и может привести к нежелательным эффектам сайта. Так что в целом это не хорошая практика, и это только вариант, когда вызовы setcookie() являются частью вашего собственного кода.

setcookie() и прозрачным способом получения значения, установленного с помощью setcookie() в рамках одного запроса, является использование headers_list() (см. 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'); 

Но обратите внимание, что это не будет работать в PHP CLI (например, PHPUnit). В таком случае вы можете использовать сторонние расширения, такие как XDebug (см. http://xdebug.org/docs/all_functions#xdebug_get_headers ).

Вы должны установить переменную cookie самостоятельно, если вам это нужно немедленно, к тому времени, когда вы загрузите другую страницу, настоящий cookie будет установлен в результате метода setcookie.

 setcookie('name', $value, time()+60*30); $_COOKIE ['name'] = $value; 

Используя ob_start () и ob_flush (), вы можете отправить cookie клиенту и получить его в одно и то же время выполнения. Попробуй это:

 ob_start(); setcookie('uname', $uname, time() + 60 * 30); ob_flush(); echo "Cookie value: " . $_COOKIE['uname']; 

setcookie() вашего сценария запускается, когда веб-браузер запрашивает страницу в первый раз, в вашем случае перезагрузка. Этот файл cookie хранится в браузере пользователей и недоступен для вашего скрипта, запущенного на сервере, до следующего запроса или в вашем случае следующая перезагрузка.

По следующему запросу браузер отправляет этот файл cookie на сервер, а массив $_COOKIE будет иметь значение, которое вы первоначально установили, и браузер отправил обратно по второму запросу.

Я установил константу в то же время, когда был создан файл cookie

 define('CONSTANT', true); return setcookie('cookiename', 'cookie value goes here', time() + 60 * 60 * 24 * 30, '/'); 

Я могу тут же что-то сделать:

 if(isset($_COOKIE['cookiename']) || $_COOKIE['cookiename'] || defined('CONSTANT') && CONSTANT) 

Мы можем сделать это, используя AJAX-вызов.

Если мы хотим создать куки-файлы при нажатии кнопки, сначала создайте AJAX-вызов для создания куки-файлов, а затем успех первого вызова AJAX, мы можем позвонить другому AJAX для получения файлов 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>