ANTICHAT

ANTICHAT (https://forum.antichat.io/index.php)
-   PHP (https://forum.antichat.io/forumdisplay.php?f=37)
-   -   Setcokie в Javascript Нужна помошь Срочно =) (https://forum.antichat.io/showthread.php?t=129965)

Whois 15.07.2009 20:57

Setcokie в Javascript Нужна помошь Срочно =)
 
Всем привет, заранее буду признателен за помошь.

Вобщем мне нужно было задать временные куксы, для теста время жизни взял 10 секунд.
На php реализовал это следующим образом:
PHP код:

 setcookie("temporary","blablalbla",time()+10); 

Все хорошо, все работает. Но только в том случае!, КОгда Время на сервере такое е же как и у пользователя на компе. В противном случае будет задан пирожок с неправильным временем жизни.

Чтобы узнать время пользователя пришлось воспользовался javascript. В яваскрипте есть функция gettime - аналог time на php.
Передать переменную из явы в пхп можно (на сколько мне известно) 3 способами:
1. гет запрос
2 пост запрос
3 установить куки
Первые два варианта сразу отбрасываю, т к они требуют обновления страница, остается 3. Гораздо легче задать куки через яву. Собственно тут я и столкнулся спроблемой.
Ниже приведу код:


PHP код:


<SCRIPT LANGUAGE="JavaScript">
function 
setCookie (name, value, expires, path, domain, secure) {
      
document.cookie = name + "=" + escape(value) +
        ((
expires) ? "; expires=" + expires : "") +
        ((
path) ? "; path=" + path : "") +
        ((
domain) ? "; domain=" + domain : "") +
        ((
secure) ? "; secure" : "");
}
</
SCRIPT>

<
SCRIPT LANGUAGE="JavaScript">
setCookie("foo", "bar", "Mon, 01-Jan-2010 00:00:00 GMT", "/");
</
SCRIPT> 

В данном примере в переменной время (expires) нужно указать точное число, а мне же нужно чтобы куки устанавливалось на определенное колиичетсво секунд. Как это сделано в php time()+ секунды. В этом вся и загвостка. Моих знаний не хватает. Буду признателен за помош

Whois 15.07.2009 21:17

ап ап ап =(((

n0reply 15.07.2009 21:33

PHP код:

<html>
<
head></head>
<
body>
 <
SCRIPT LANGUAGE="JavaScript">
  var 
d = new Date( (new Date()).getTime() + 10000 );
  
document.write(d.toString());
 </
SCRIPT>
</
body>
</
html> 

в d будет хранитсья текущая дата клиента + 10 секунд. (getTime() в милисекундах).

Whois 15.07.2009 21:56

А СПАСИБО ВЕРИ МАЧ =) ЩАС БУДУ ПРОБОВАТЬ

Whois 15.07.2009 22:27

чувствуя себя нубом, не могу все совсместить воедино... Нелюблю я яву...может кто поможет?

я делаю так:

PHP код:


 
<SCRIPT LANGUAGE="JavaScript">
function 
setCookie (name, value, expires, path, domain, secure) {
      
document.cookie = name + "=" + escape(value) +
        ((
expires) ? "; expires=" + expires : "") +
        ((
path) ? "; path=" + path : "") +
        ((
domain) ? "; domain=" + domain : "") +
        ((
secure) ? "; secure" : "");
}
</
SCRIPT>

 <
SCRIPT LANGUAGE="JavaScript">
  var 
d = new Date( (new Date()).getTime() + 10000 );
  
setCookie("test111", "bar", "d.toString()", "/");
 </
SCRIPT> 


кукис задается но без времени

n0reply 15.07.2009 22:38

а так:
PHP код:

 <SCRIPT LANGUAGE="JavaScript">
function 
setCookie (name, value, expires, path, domain, secure) {
      
document.cookie = name + "=" + escape(value) +
        ((
expires) ? "; expires=" + expires : "") +
        ((
path) ? "; path=" + path : "") +
        ((
domain) ? "; domain=" + domain : "") +
        ((
secure) ? "; secure" : "");
}
</
SCRIPT>

 <
SCRIPT LANGUAGE="JavaScript">
  var 
d = new Date( (new Date()).getTime() + 10000 );
  
setCookie("test111", "bar", d.toString(), "/");
 </
SCRIPT> 


Whois 15.07.2009 22:43

http://i043.radikal.ru/0907/1c/3bb54faaf3f0.jpg Аналагично, время не задается пачемуТО

FireFenix 15.07.2009 22:56

Цитата:

Чтобы узнать время пользователя пришлось воспользовался javascript. В яваскрипте есть функция gettime - аналог time на php.
Передать переменную из явы в пхп можно (на сколько мне известно) 3 способами:
1. гет запрос
2 пост запрос
3 установить куки
Первые два варианта сразу отбрасываю, т к они требуют обновления страница
AJAX не рулед?
JS выставлять куки - извращение

Whois 15.07.2009 22:59

рулед все.... покажите мне готовое решение... Я сам знаю много способов но силен только в php.... Так что обращаюсь за помощью к вам

n0reply 15.07.2009 23:00

d.toString() я тебе для примера сверху написал, чтобы просто на экран дату вывести, плюс ты ее в кавычки зачем-то заслал.

Видимо проблема с форматом даты в котором выводит ее toString(), возможно этот момент броузро-зависим, проверил щас твой код на FireFox'e, в линуксе, все работает и дата задается.

Попробуй поэксперементируй, вместо toString(): toGMTString(), toLocaleString(), toUTCString(). Вообще посравнивай как твоя опера дату распечатывает. Я так понял
"Mon, 01-Jan-2010 00:00:00 GMT"
с таким вариантом все работает, посмотри насколько toString() от него отличается? Возможно в разных броузерах и вывод будет разный (или даже в разны ОС), и возможно прибется форматировать эту строку вручную строковыми функциями.

FireFenix 15.07.2009 23:04

К примеру так

Вызов на странице функции test
Код:

function Inint_AJAX()
{ 
  try { return new ActiveXObject("Msxml2.XMLHTTP");    } catch(e) {} //IE
  try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {} //IE
  try { return new XMLHttpRequest();                  } catch(e) {} //Native Javascript
  alert("XMLHttpRequest not supported");
  return null;
}

function test(параметры)
{
  var type = document.getElementById("type");
  var url = 'modules/test.php?what=' + type.value;

  var req = Inint_AJAX();

  req.onreadystatechange = function ()
  {
    if (req.readyState == 4)
    {
      if (req.status == 200)
      {
        var text = req.responseText.toString(); //return value
        //Выполнение действия с результатом php ответа text
      }
    }
  };
 

  req.open('GET', url, true); //make connection
  req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=cp1251'); // set Header
  req.send(null); //send value
}

test.php
Код:

<?php

If ($_GET['type'])
}
  echo($_GET['type']); //Отправка AJAX'у ответ
}
?>


Whois 15.07.2009 23:05

n0reply - спасибо что не поленился все рассказать буду эксперементировать. Хотя уже понимаю из вышесказанного что этот способ будет не оптимальным, а мне нужна хотябы 99% работоспособность.
PS Если ктонибудь знает еще способы по заданию кукисов с использованием реального форматама времени пользователя + добавление секунд жизни, пожалуйста отписывайтесь здесь.

Whois 15.07.2009 23:11

Спасибо за помошь. Всем по Плюсику.

n0reply в опере заработала используя toGMTString() , щас попробую метод Феникса. Думаю пост можно закрывать.

FireFenix 15.07.2009 23:15

Я думаю догодаешься адаптировать
Код:

  var type = document.getElementById("type");
  var url = 'modules/test.php?what=' + type.value;

под свои нужды =)

P.S. Если нужно, вот нарыл у себя готовый пример - http://rapidshare.com/files/25620184...-ajax.zip.html

n0reply 15.07.2009 23:43

Проверил твой JS вариант (с toGMTString() ) на FireFox'e (в линухе), тоже все работает, скорее всего просто FF по умолчанию время выводит в GMT формате, наверное и в других броузерах будет работать, если ты в винде, то на IE проверить не долго.

n0reply 15.07.2009 23:56

Как еще один вариант, попробуй обойтись вообще без JS, чистым пхп, примерно так:
PHP код:

<?php
function set_cookie($Name, $Value = '', $MaxAge = 0, $Path = '', $Domain = '', $Secure = false, $HTTPOnly = false) {
  
header('Set-Cookie: ' . rawurlencode($Name) . '=' . rawurlencode($Value)
                        . (empty(
$MaxAge) ? '' : '; Max-Age=' . $MaxAge)
                        . (empty(
$Path)   ? '' : '; path=' . $Path)
                        . (empty(
$Domain) ? '' : '; domain=' . $Domain)
                        . (!
$Secure       ? '' : '; secure')
                        . (!
$HTTPOnly     ? '' : '; HttpOnly'), false);
}

# examples:
set_cookie("test111", "bar", 10);  /* через 10 секунд  кончитсья */
set_cookie("TestCookie", "value", 3600, "/~rasmus/", ".example.com", 1);
?>

по http://www.faqs.org/rfcs/rfc2109.html у Set-Cookie (заголовка) есть параметр Max-Age=delta-seconds. Который задает интервал жизни куки в секундах.

Whois 16.07.2009 18:09

Цитата:

Сообщение от n0reply
Как еще один вариант, попробуй обойтись вообще без JS, чистым пхп, примерно так:
PHP код:

<?php
function set_cookie($Name, $Value = '', $MaxAge = 0, $Path = '', $Domain = '', $Secure = false, $HTTPOnly = false) {
  
header('Set-Cookie: ' . rawurlencode($Name) . '=' . rawurlencode($Value)
                        . (empty(
$MaxAge) ? '' : '; Max-Age=' . $MaxAge)
                        . (empty(
$Path)   ? '' : '; path=' . $Path)
                        . (empty(
$Domain) ? '' : '; domain=' . $Domain)
                        . (!
$Secure       ? '' : '; secure')
                        . (!
$HTTPOnly     ? '' : '; HttpOnly'), false);
}

# examples:
set_cookie("test111", "bar", 10);  /* через 10 секунд  кончитсья */
set_cookie("TestCookie", "value", 3600, "/~rasmus/", ".example.com", 1);
?>

по http://www.faqs.org/rfcs/rfc2109.html у Set-Cookie (заголовка) есть параметр Max-Age=delta-seconds. Который задает интервал жизни куки в секундах.

Отлично =) Думаю самый лучший вариант, $MaxAge - решение всех проблем, никогда не слышал о нем раньше


Время: 08:19