За последние 24 часа нас посетили 26894 программиста и 1814 роботов. Сейчас ищут 1377 программистов ...

В IE и Firefox не срабатывают cookie

Тема в разделе "Прочие вопросы по PHP", создана пользователем HiveHicks, 11 мар 2007.

  1. HiveHicks

    HiveHicks Активный пользователь

    С нами с:
    11 янв 2007
    Сообщения:
    18
    Симпатии:
    0
    Делаю класс для управления сеансами на основе базы данных. Сессия запускается следующей функцией:
    PHP:
    1.  
    2. <?
    3. protected function open()
    4. {
    5.     global $db;
    6.    
    7.     $cur_time = time();
    8.    
    9.     if ( $_COOKIE['SESSID'] && $_COOKIE['SESSKEY'] )
    10.     {
    11.         $sql = "SELECT *
    12.             FROM {$this->sessions_table}
    13.             WHERE sess_id = '" . $_COOKIE['SESSID'] . "'
    14.                 AND sess_key = '" . $_COOKIE['SESSKEY'] . "'
    15.                 AND sess_browser = '" . $_SERVER['HTTP_USER_AGENT'] . "'
    16.                 AND ($cur_time - sess_started) < {$this->session_lifetime}
    17.                 AND ($cur_time - sess_lastactive) < {$this->session_timeout}";
    18.        
    19.         if ( !($result = $db->query($sql)) )
    20.         {
    21.             return false;
    22.         }
    23.        
    24.         if ( $result->num_rows > 0 )
    25.         {
    26.             $this->sessid = $_COOKIE['SESSID'];
    27.             $this->sesskey = $_COOKIE['SESSKEY'];
    28.            
    29.             $sql = "UPDATE {$this->sessions_table}
    30.                 SET sess_lastactive = $cur_time
    31.                 WHERE sess_id = '{$this->sessid}'
    32.                     AND sess_key = '{$this->sesskey}'";
    33.             if ( !$db->query($sql) )
    34.             {
    35.                 return false;
    36.             }
    37.            
    38.             return true;
    39.         }
    40.     }
    41.    
    42.     list($this->sessid, $this->sesskey) = $this->_generate_sessid();
    43.    
    44.     $this->set_cookie('SESSID', $this->sessid);
    45.     $this->set_cookie('SESSKEY', $this->sesskey);
    46.    
    47.     $sql = "INSERT INTO {$this->sessions_table} (sess_id, sess_key, sess_browser, sess_started, sess_lastactive)
    48.         VALUES ('{$this->sessid}', '{$this->sesskey}', '" . $_SERVER['HTTP_USER_AGENT'] . "', $cur_time, $cur_time)";
    49.     if ( !$db->query($sql) )
    50.     {
    51.         return false;
    52.     }
    53.    
    54.     return true;
    55. }
    56. ?>
    Иными словами, идет проверка на наличие переменных cookie SESSID и SESSKEY. При их наличии сессия проверяется на активность; в случае активности время последней поддержки сессии записывается в базу. Если не удовлетворяется хотя бы одно из этих условий, в базу заносится информация о новой, устанавливаются соответствующие cookie SESSID и SESSKEY. Функция set_cookie() выглядит следующим образом:
    PHP:
    1. <?
    2. public function set_cookie($cookie_name, $cookie_value, $cookie_lifetime = 3600)
    3. {
    4.     $cookie_data = $cookie_name . '=' . $cookie_value;
    5.     $expires = time() + $cookie_lifetime;
    6.     $domain = 'localhost';
    7.     $path = '/';
    8.    
    9.     header('Set-Cookie: ' . $cookie_data . '; expires=' . $expires . '; path=' . $path . '; domain=' . $domain . '; HttpOnly', false);
    10. }
    11. ?>
    Проблема в том, что когда я тестирую программу на Opera, все проходит так, как я и ожидаю - сессия поддерживается, пока не истечет срок ее жизни (1 час), или пользователь не совершал действий в течение 5 минут; но вот если проверять ее на IE 6.0 и на Firefox 2.0, при каждом обновлении страницы создается новая сессия, то есть создается впечатление, что не пишутся cookie. Тестирую на localhost. Cookies во всех браузерах разрешены. Подскажите, чем это может быть вызвано?
     
  2. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    HiveHicks
    можно скромный вопрос? чем функция setcookie не угодила?

    PS: формат даты в expires у вас не верный.
     
  3. HiveHicks

    HiveHicks Активный пользователь

    С нами с:
    11 янв 2007
    Сообщения:
    18
    Симпатии:
    0
    Можно и setcookie - с ней тоже не работает. Я просто привел свою функцию, чтобы было видно, что это не пустышка :)

    Почему expires неверный? Вот цитата из мануала:
     
  4. Mavir

    Mavir Guest

    Цитата из мануала для установки куки с помощью функции setcookie. А Вы чем устанавливаете?
     
  5. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    это параметр функции php должен принимать юниксовый таймстэмп в качестве значения.

    в заголовках формат даты - другой.
    http://ru.php.net/manual/ru/function.se ... .php#70959
     
  6. HiveHicks

    HiveHicks Активный пользователь

    С нами с:
    11 янв 2007
    Сообщения:
    18
    Симпатии:
    0
    Большое спасибо! :)
    А не подскажете заодно, где можно найти хорошую информацию по всем HTTP-заголовкам?
     
  7. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    В HTTP RFC:
    http://www.ietf.org/rfc/rfc2616.txt