Почему мои куки не устанавливаются? - PullRequest
18 голосов
/ 07 августа 2011

У меня есть следующая функция 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");
}

А потом я беру печенье:

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(), чтобы сэкономить место.

Ответы [ 5 ]

38 голосов
/ 07 августа 2011

попробуйте добавить путь = /, чтобы файл cookie работал со всем сайтом, а не только с текущим каталогом (который меня ранее обнаружил)

пример

setcookie('password',$password,time()+60*60*24*365, '/'); 

также делаетубедитесь, что cookie - это первая вещь, выводимая в соответствии с рекомендациями в руководстве по php (это меня уже успело заметить)

Как и другие заголовки, куки должны отправляться до любого вывода из вашего скрипта (этоограничение протокола).

18 голосов
/ 21 сентября 2013

Почему у вас возникла эта проблема

Проблема заключается в том, что setcookie () не устанавливает куки немедленно , он отправляет заголовки, поэтому браузер устанавливает куки. Это означает, что для текущей загрузки страницы setcookie () не будет генерировать $_COOKIE.

Когда браузер позднее запрашивает страницу, он отправляет куки в заголовках, чтобы PHP мог получить их в виде $ _COOKIE.

Простое старое решение

О решениях, очевидных:

setcookie('username',$username,time()+60*60*24*365);
// 'Force' the cookie to exists
$_COOKIE['username'] = $username;

Лучшее решение

Я создал класс Cookie, который решает проблемы, которые разделяют setcookie () и $ _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;
      }
    }
  }

Тогда вы можете использовать это так:

$Cookie = new Cookie($_COOKIE);
$User = $Cookie->user;
$LastVisit = $Cookie->last;
$Cookie->last = time();

И, конечно, вы должны передать это. Гораздо лучше, чем глобальные.

5 голосов
/ 07 августа 2011

Вот общий синтаксис setcookie

setcookie(name,value,expire,path,domain,secure); 

Посмотрите на третий аргумент, если вы не установите его, скрипт перенесет его в текущий рабочий каталог. Таким образом, если вы установите cookie без указания пути на a.com/b/setcookie.php, то cookie не будет доступен для a.com/checkcookie.php. Что вы делаете, это устанавливаете cookie в подпапке и перенаправляете в родительскую папку, посмотрите на ../, где он недоступен, следовательно, проблема. Как этого избежать? Обычная процедура - указать путь /, в вашем случае / в качестве четвертого параметра. Пятый аргумент для вашего куки-файла установит его безопасность. http://www.php.net/setcookie имеет больше объяснений. Это должно исправить вашу проблему. Если задать путь к домену domain.com, файл cookie будет доступен для всех под domain.com, но не для something.domain.com. Установите значение домена .domain.com, посмотрите на точку, предшествующую domain.com, и сделайте его доступным через anything.domain.com. НТН!

3 голосов
/ 14 февраля 2014

Думаю, я бы добавил еще одну возможную причину, по которой куки-файлы могут не задавать или показывать случайное функциональное поведение.

Следующий случай может быть применим к некоторым программистам, имеющим, как представляется, иллюзорную проблему с настройкой куки-файлов:результат неправильного использования header_remove () ;

Если вы попытаетесь установить cookie до вызова header_remove () , то cookieникогда не будет создан, потому что вы также уничтожили заголовок, который был настроен для создания куки-файла до того, как инструкция была буферизована клиенту.

Когда вы возитесь с этим, вы можете обнаружить, что ваш куки-файл неожиданно работает по неизвестной причине:

При первом запуске, если вы установили cookie и вообще не вызывали header_remove (), затем при втором запуске вы вызываете header_remove (), вы обнаружите, что ваш cookie теперь всегда установлен.

То же самое применимо, если вы попытаетесь изменить значение cookie перед header_remove (), вы снова потерпите неудачу, потому чтоipe изменения, которые вы пытаетесь внести до того, как они фактически буферизируются пользователю.Вам нужно установить куки и любые другие заголовки по этому вопросу после header_remove (), а не до этого.

Если вы использовали header_remove () для намерения изменить иерархию кодов ответа HTTP для сценариев DOM, вы можетебыстро разрешить конфликт стирания заголовка файла cookie, используя следующую команду для явного удаления только кодов ответов:

 header_remove('HTTP/1.0');
0 голосов
/ 21 июня 2018

Для этого требуется, чтобы вы вызывали эту функцию перед любым выводом, включая теги и любые пробелы.

так выглядит структура

<?php
$cookie_name = "user";
$cookie_value = "Ahmed Moftah";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
?>
<?php
if(!isset($_COOKIE[$cookie_name])) {
    echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
    echo "Cookie '" . $cookie_name . "' is set!<br>";
    echo "Value is: " . $_COOKIE[$cookie_name];
}
?>
<html>
<body>



</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...