cookie не будет установлен

Это вопрос относительно моего старого: cookie не будет удален: cookie не будет удален, где я были проблемы с удалением файла cookie (но он был установлен «правильно»),

Теперь, когда проблема решена; куки, похоже, не SET

cookie 'set': (не работает)

setcookie("id",$data['id'], time()+3600*24*30,'/');
setcookie("alias",$data['nombre'], time()+3600*24*30,'/');

проверка файлов cookie: (кажется, работает)

    function sesion(){

    if(isset($_COOKIE['id']) && isset($_COOKIE['alias'])){
                    $_SESSION['logueado'] = true;
                    $_SESSION['id'] = $_COOKIE['id'];
                    $_SESSION['alias'] = $_COOKIE['alias'];

                    return true;  //THIS IS NEVER RETURNING TRUE
                }
if(isset($_SESSION['id']) && isset($_SESSION['logueado']) && $_SESSION['logueado'] == true){

                    return true;
                }
                 else{ return false;
    }



    }

файл cookie отключен: (работает)

function cerrar_sesion(){
  session_start();
  $_SESSION['logueado']= false;
  $_SESSION['id']= NULL;
  session_unset();
  session_destroy();
  setcookie("id",false,time()-3600,"/");
  setcookie("alias",false,time()-3600,"/");
  unset($_COOKIE['id']);
  unset($_COOKIE['alias']);
}

Что происходит, так это то, что вход в систему работает только через $_SESSION, поэтому после 30 минут бездействия пользователь больше не входит в систему,

Любая идея, что я делаю неправильно? Большое спасибо!


person Toni Michel Caubet    schedule 18.06.2011    source источник
comment
Проверьте правильность времени сервера.   -  person hakre    schedule 19.06.2011
comment
это на час позже, чем в Испании (GMT, а в Испании GMT плюс 1), но все же я должен установить куки на весь месяц, не так ли? Благодарность!   -  person Toni Michel Caubet    schedule 19.06.2011
comment
Если время сервера неверно, некоторые браузеры отказываются устанавливать файлы cookie.   -  person hakre    schedule 19.06.2011
comment
эхо время(); == 13084374070. Как я могу узнать, который сейчас час? Кстати, по Гринвичу плюс один Mysql NOW(), это одно и то же время для apache и mysql? Благодарность   -  person Toni Michel Caubet    schedule 19.06.2011
comment
Посмотрите заголовки, которые возвращает ваш скрипт. Он должен вернуть рассматриваемое время. Также проверьте, установлены ли файлы cookie в браузере.   -  person hakre    schedule 19.06.2011
comment
Что вы имеете в виду под заголовками?   -  person Toni Michel Caubet    schedule 22.06.2011
comment
информация о моих заголовках: Дата: среда, 06 июля 2011 г., 23:02:48 GMT Сервер: Apache/2.2.15 (Unix) mod_ssl/2.2.15 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0 .2.2635 PHP/5.2.14 mod_ruid2/0.9 X-Powered-By: PHP/5.2.14 Срок действия: четверг, 19 ноября 1981 г., 08:52:00 GMT Cache-Control: без хранения, без кэширования, обязательная повторная проверка, post-check=0, pre-check=0 Прагма: no-cache Варьируется: User-Agent,Accept-Encoding Content-Encoding: gzip Content-Length: 23133 Content-Type: text/html X-Cache: MISS from sv35. byethost35.org Через: 1.1 sv35.byethost35.org:80 (squid/2.7.STABLE9) Соединение: keep-alive 200 OK   -  person Toni Michel Caubet    schedule 07.07.2011
comment
Установлен ли полный вывод ошибок/предупреждений? Кажется, что в заголовках нет файлов cookie, поэтому, возможно, у вас есть общая проблема: вы что-то выводите клиенту перед установкой файлов cookie (это может быть просто пробел в начале/конце файла PHP). Я думаю, вам следует проверить этот дополнительный интервал (и не использовать закрывающий тег PHP в файлах) или просто сделать ‹?php ob_start(); самое первое в вашем сценарии. К сожалению, я знаю, что это отстой, пожалуйста, опубликуйте весь ваш PHP-файл, который вы тестируете, чтобы я мог помочь вам лучше.   -  person XzKto    schedule 22.07.2011


Ответы (5)


set cookie lines отлично работает со мной.

что касается }else if(isset($_COOKIE['id']) && i, так как вы вернетесь, если вы удалите else здесь, все еще в порядке, если бы не было возврата выше, вам пришлось бы оставить else здесь, чтобы не оценивать этот блок, вообще говоря, я не уверен, что elseif то же самое, что и else if во всех случаях

Способ построения сеанса функции будет действовать следующим образом:

  • При первой загрузке он покажет: нет файла cookie, нет сеанса, потому что вы не можете увидеть файл cookie до перезагрузки (о чем, я думаю, вы уже знаете). -При второй загрузке вы увидите установленный сеанс cookie. - после второй загрузки вы всегда видите, что сеанс установлен.

Все, что я хочу сказать, что сессия работает именно так, как и ожидалось, поэтому я не вижу никакой проблемы.

<?php

$data='Hello'; 
setcookie("id",$data['id'], time()+3600*24*30,'/');
setcookie("alias",$data['nombre'], time()+3600*24*30,'/');

session_start(); 

function sesion()
     {

        if(isset($_SESSION['id']) && isset($_SESSION['logueado']) 
            && $_SESSION['logueado'] == true)
        {
            echo 'SESSION IS SET<br>';
            return true;
        } 
        if(isset($_COOKIE['id']) && isset($_COOKIE['alias']))
        {
            $_SESSION['logueado'] = true;
            $_SESSION['id'] = $_COOKIE['id'];
            $_SESSION['alias'] = $_COOKIE['alias'];
            echo 'COOKIE is alive and session set'.$_SESSION['alias'].'<br>';
            return true;  //THIS IS NEVER RETURNING TRUE
         }
        else
        {  
            echo 'NO SESSION,   NO COOKIE YET, WAIT UNTIL REFRESH<br>';
            return false;
        } 
} 
 sesion() ; 
?>
person Melsi    schedule 19.06.2011
comment
я пытаюсь так (не иначе), дам вам знать, большое спасибо - person Toni Michel Caubet; 20.06.2011
comment
ну, к сожалению, это не решило мою проблему... есть другие идеи? большое спасибо - person Toni Michel Caubet; 21.06.2011

Как указано выше, вы не можете прочитать файл cookie с той же страницы, на которой он установлен. Я вижу, вы пытались обмануть это с помощью ajax, но я не верю, что это будет правильным трюком, поскольку вызовы Ajax не изменяют состояние страницы, на которой вы все еще находитесь. поэтому вы можете либо выполнить полное обновление, либо перенаправить ИЛИ одновременно с использованием setcookie вы также можете определить нужные вам значения в $_COOKIE, чтобы они были доступны на той же странице. как это:

setcookie("id",$data['id'], time()+3600*24*30,'/');
setcookie("alias",$data['nombre'], time()+3600*24*30,'/');
$_COOKIE['id'] = $data['id'];  
$_COOKIE['alias'] = $data['nombre'];
person plague    schedule 24.07.2011

Попробуйте удалить параметр пути из ваших вызовов setcookie(), возможно, проблема в этом.

Кроме того, вы проверили, что $data действительно содержит какие-либо данные?

person Community    schedule 22.07.2011

Вероятно, у вас есть действительно известная проблема с настройкой файлов cookie, и вы отключили отчеты об ошибках с предупреждениями.

Просто попробуй:

error_reporting(E_ALL);

Вероятно, вы увидите на своей странице что-то вроде "Невозможно изменить заголовки. Заголовки уже отправлены". Это потому, что вам нужно установить файлы cookie, прежде чем отображать что-либо на своей странице. Таким образом, решение вашей проблемы состоит в том, чтобы реализовать код для установки файлов cookie внизу страницы или использовать ob_start/ob_clean.

Дайте мне знать, если это поможет :)

person kkszysiu    schedule 27.07.2011

Согласно реализации "setcookie()" в PHP, проверка значения файла cookie будет не работать, пока вы не переместите элемент управления со страницы, на которой вы создаете файл cookie. Таким образом, ваш «SET» создаст файл cookie на одной странице, а «session()» следует вызвать с другой страницы, чтобы проверить значение установленного вами файла cookie. Попробуйте и надеюсь, что это поможет!

Попробуйте следующий подход (пожалуйста, уточните его в соответствии с вашими потребностями). То, что я пытаюсь здесь обновить саму страницу после установки файла cookie и функции «session ()», является динамической функцией, которая может иметь или не иметь никаких аргументов. Итак, когда вы передаете ему какой-либо аргумент, cookie будет установлен, в противном случае он будет проверен на существование. Сопутствующей функцией с func_num_args() является func_get_args(). Это поможет вам очистить ожидаемые аргументы в функции.

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set("log_errors", 0);

session_start();

function sesion(){
  // func_num_args() number of arguments passed to the function
  if (func_num_args() == 0) { // if no arguments were passed, means the page is refreshed and cookie won't be set further
    if(isset($_COOKIE['id']) && isset($_COOKIE['alias'])){
      $_SESSION['logueado'] = true;
      $_SESSION['id'] = $_COOKIE['id'];
      $_SESSION['alias'] = $_COOKIE['alias'];

      return true;  //THIS IS NEVER RETURNING TRUE
    }
    if(isset($_SESSION['id']) && isset($_SESSION['logueado']) && $_SESSION['logueado'] == true){
      return true;
    }
    else {
      return false;
    }
  }
  else { // if number of args > 0, means you need to cookie here and refresh the page itself
    global $data; // set this to global as the $data will be available outside of this function
    setcookie("id",$data['id'], time()+3600*24*30,'/');
    setcookie("alias",$data['nombre'], time()+3600*24*30,'/');
    /**
     * refresh the page by javascript instead of header()
     * as header already being sent by the session_start()
     */
    echo '<script language="javascript">
    <!--
    window.location.replace("' . $_SERVER['PHP_SELF'] . '");
    //-->
    </script>';
    die();
  }
}

sesion(1); // passed an argument to set the cookie
?>

Я думаю, вы столкнетесь с проблемой с разделом JavaScript, так как он изменит URL-адрес страницы, и я предполагаю, что вы пытаетесь включить этот скрипт на страницы. Итак, я воспользуюсь помощью call_user_func(). и последняя часть «else» после строк setcookie() будет заменена следующей строкой:

call_user_func("sesion");

Надеюсь, теперь это будет иметь смысл.

person anupam    schedule 22.07.2011
comment
я не уверен, понял ли я, что вы предлагаете мне попробовать :( - person Toni Michel Caubet; 22.07.2011
comment
Извините, если мое предложение вам непонятно. Я не был уверен в том, проверяете ли вы наличие файлов cookie на той же странице, на которой вы их создаете? Если вы это сделаете, это не сработает. Требуется промежуточное обновление страницы. Могу я получить ваш код, пожалуйста? - person anupam; 22.07.2011
comment
ну правда очень долго. Вы предлагаете ajax-вызов файла, который устанавливает cookie перед перезагрузкой? - person Toni Michel Caubet; 22.07.2011
comment
Звучит как хороший трюк. Попробуйте и дайте мне знать результат. Могу направить дальше. - person anupam; 22.07.2011
comment
Я отредактировал ответ другим возможным подходом. Пожалуйста, попробуйте и это. - person anupam; 22.07.2011
comment
Я сделал тест на мой предложенный подход. Но это тоже не сработает. Вам нужно установить файл cookie на другой странице, а на другой странице необходимо проверить значения. Кажется, это единственное решение вашей проблемы. - person anupam; 22.07.2011