У меня есть следующая функция PHP:
function validateUser($username){ session_regenerate_id (); $_SESSION['valid'] = 1; $_SESSION['username'] = $username; setcookie('username2',$username,time()+60*60*24*365); header("Location: ../new.php"); }
И затем я беру cookie:
echo $_COOKIE['username2']; exit();
(Я только положил exit()
для целей отладки)
Только проблема, она выходит пустая. Есть идеи?
UPDATE: Так вызывается функция:
if(mysql_num_rows($queryreg) != 0){ $row = mysql_fetch_array($queryreg,MYSQL_ASSOC); $hash = hash('sha256', $row['salt'] . hash('sha256', $password)); if($hash == $row['password']) { if($row['confirm'] == 1){ if(isset($remember)){ setcookie('username',$username,time()+60*60*24*365); setcookie('password',$password,time()+60*60*24*365); } else { setcookie('username','',time()-3600); setcookie('password','',time()-3600); } validateUser($username);
Я не включил все операторы if()
чтобы сохранить некоторое пространство.
попробуйте добавить путь = /, так что cookie работает для всего сайта не только в текущем каталоге (который раньше меня поймал)
пример
setcookie('password',$password,time()+60*60*24*365, '/');
также убедитесь, что файл cookie – это первое, что выводится, как указано в руководстве по php (это тоже меня укусило)
Как и другие заголовки, файлы cookie должны быть отправлены до выхода из вашего скрипта (это ограничение протокола).
Проблема возникает из-за того, что setcookie () не устанавливает cookie немедленно , он отправляет заголовки, чтобы браузер устанавливал файлы cookie. Это означает, что для текущей загрузки страницы setcookie () не будет генерировать никаких $_COOKIE
.
Когда браузер позже запрашивает страницу, он отправляет файлы cookie в заголовки, чтобы PHP мог получить их в виде $ _COOKIE.
О решениях, очевидном:
setcookie('username',$username,time()+60*60*24*365); // 'Force' the cookie to exists $_COOKIE['username'] = $username;
Я создал класс, Cookie
, который решает проблемы, связанные с sharecookie () и $ _COOKIE:
// Class that abstracts both the $_COOKIE and setcookie() class Cookie { // The array that stores the cookie protected $data = array(); // Expiration time from now protected $expire; // Domain for the website protected $domain; // Default expiration is 28 days (28 * 3600 * 24 = 2419200). // Parameters: // $cookie: $_COOKIE variable // $expire: expiration time for the cookie in seconds // $domain: domain for the application `example.com`, `test.com` public function __construct($cookie, $expire = 2419200, $domain = null) { // Set up the data of this cookie $this->data = $cookie; $this->expire = $expire; if ($domain) $this->domain = $domain; else { $this->domain = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; } } public function __get($name) { return (isset($this->data[$name])) ? $this->data[$name] : ""; } public function __set($name, $value = null) { // Check whether the headers are already sent or not if (headers_sent()) throw new Exception("Can't change cookie " . $name . " after sending headers."); // Delete the cookie if (!$value) { setcookie($name, null, time() - 10, '/', '.' . $this->domain, false, true); unset($this->data[$name]); unset($_COOKIE[$name]); } else { // Set the actual cookie setcookie($name, $value, time() + $this->expire, '/', $this->domain, false, true); $this->data[$name] = $value; $_COOKIE[$name] = $value; } } }
не// Class that abstracts both the $_COOKIE and setcookie() class Cookie { // The array that stores the cookie protected $data = array(); // Expiration time from now protected $expire; // Domain for the website protected $domain; // Default expiration is 28 days (28 * 3600 * 24 = 2419200). // Parameters: // $cookie: $_COOKIE variable // $expire: expiration time for the cookie in seconds // $domain: domain for the application `example.com`, `test.com` public function __construct($cookie, $expire = 2419200, $domain = null) { // Set up the data of this cookie $this->data = $cookie; $this->expire = $expire; if ($domain) $this->domain = $domain; else { $this->domain = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; } } public function __get($name) { return (isset($this->data[$name])) ? $this->data[$name] : ""; } public function __set($name, $value = null) { // Check whether the headers are already sent or not if (headers_sent()) throw new Exception("Can't change cookie " . $name . " after sending headers."); // Delete the cookie if (!$value) { setcookie($name, null, time() - 10, '/', '.' . $this->domain, false, true); unset($this->data[$name]); unset($_COOKIE[$name]); } else { // Set the actual cookie setcookie($name, $value, time() + $this->expire, '/', $this->domain, false, true); $this->data[$name] = $value; $_COOKIE[$name] = $value; } } }
с// Class that abstracts both the $_COOKIE and setcookie() class Cookie { // The array that stores the cookie protected $data = array(); // Expiration time from now protected $expire; // Domain for the website protected $domain; // Default expiration is 28 days (28 * 3600 * 24 = 2419200). // Parameters: // $cookie: $_COOKIE variable // $expire: expiration time for the cookie in seconds // $domain: domain for the application `example.com`, `test.com` public function __construct($cookie, $expire = 2419200, $domain = null) { // Set up the data of this cookie $this->data = $cookie; $this->expire = $expire; if ($domain) $this->domain = $domain; else { $this->domain = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; } } public function __get($name) { return (isset($this->data[$name])) ? $this->data[$name] : ""; } public function __set($name, $value = null) { // Check whether the headers are already sent or not if (headers_sent()) throw new Exception("Can't change cookie " . $name . " after sending headers."); // Delete the cookie if (!$value) { setcookie($name, null, time() - 10, '/', '.' . $this->domain, false, true); unset($this->data[$name]); unset($_COOKIE[$name]); } else { // Set the actual cookie setcookie($name, $value, time() + $this->expire, '/', $this->domain, false, true); $this->data[$name] = $value; $_COOKIE[$name] = $value; } } }
Затем вы можете использовать его следующим образом:
$Cookie = new Cookie($_COOKIE); $User = $Cookie->user; $LastVisit = $Cookie->last; $Cookie->last = time();
И, конечно же, вы должны пройти его. Гораздо лучше, чем глобалы.
Вот общий синтаксис setcookie
setcookie(name,value,expire,path,domain,secure);
Посмотрите на третий аргумент, если вы его не установили, сценарий перенесет его в текущий рабочий каталог. Поэтому, если вы установили cookie без установки пути на a.com/b/setcookie.php
cookie будет недоступен для a.com/checkcookie.php
. То, что вы делаете, – это установить cookie в подпапку и перенаправить на родительскую папку, посмотрите ../
, где она недоступна, поэтому проблема. Как этого избежать? Обычная процедура заключается в том, чтобы указать путь /
, в вашем случае предложение /
качестве четвертого параметра. Пятый аргумент для вашего файла cookie будет безопасным. http://www.php.net/setcookie имеет больше объяснений. Это должно решить вашу проблему. Настройка пути к домену domain.com
сделает cookie доступным для всего домена domain.com
, но не для something.domain.com
. Установите значение домена в .domain.com
, посмотрите на точку, предшествующую domain.com, и сделайте ее доступной через anything.domain.com
. НТН!
Думаю, я добавлю еще одну возможную причину, по которой cookie может не устанавливать или показывать случайное функциональное поведение.
Следующий случай может быть применим к некоторым программистам, имеющим то, что кажется проблемой иллюзорного параметра cookie в результате неправильного использования header_remove () ;
Если вы попытаетесь установить файл cookie перед вызовом header_remove (), cookie никогда не будет создан, потому что вы также уничтожили заголовок, который был настроен для создания файла cookie, прежде чем команда будет буферизована клиенту.
Вы можете найти, когда возитесь с тем, что ваш печенье внезапно работает по неизвестной причине:
При первом запуске, если вы установите cookie и вообще не вызываете header_remove (), тогда во втором запуске вы вызываете header_remove (), вы обнаружите, что ваш cookie теперь всегда установлен.
То же самое относится и к вам, если вы попытаетесь изменить значение cookie перед header_remove (), вы снова потерпите неудачу, потому что он уничтожит изменения, которые вы пытаетесь сделать, прежде чем они будут фактически буферизованы пользователю. Вы должны установить cookie и любые другие заголовки, если это не так, как раньше.
Если вы использовали команду header_remove () для изменения иерархии кодов HTTP-ответа для DOM Scripting, вы можете быстро решить эту проблему с помощью заголовка заголовка cookie, используя следующее, чтобы явно очистить коды ответов:
header_remove('HTTP/1.0');