PDA

Просмотр полной версии : Setcokie в Javascript Нужна помошь Срочно =)


Whois
15.07.2009, 20:57
Всем привет, заранее буду признателен за помошь.

Вобщем мне нужно было задать временные куксы, для теста время жизни взял 10 секунд.
На php реализовал это следующим образом:
setcookie("temporary","blablalbla",time()+10);


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

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




<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
<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
чувствуя себя нубом, не могу все совсместить воедино... Нелюблю я яву...может кто поможет?

я делаю так:



<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
а так:

<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/256201845/user-proofing-ajax.zip.html

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

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

<?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
Как еще один вариант, попробуй обойтись вообще без JS, чистым пхп, примерно так:

<?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 - решение всех проблем, никогда не слышал о нем раньше