powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Cookie устанавливаются только после перезагрузки.
26 сообщений из 26, показаны все 2 страниц
Cookie устанавливаются только после перезагрузки.
    #34959981
DiMamont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть простенькая страничка в начале, которой стоит кусок кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?php
if (array_key_exists("usname",$_POST))
	{
	$y2k = mktime( 0 , 0 , 0 , 1 , 1 , 2010 );
	setcookie("user_name",$_POST["usname"],$y2k);
	}
if (isset($user_name)==false)
{
?>
тут HTML код  1 
<?php } 
else
{?>
тут HTML код  2 
<?php } ?>
То есть по моей задумке, когда методом пост приходит переменная usname, то она пишется в куку и выводится HTML код 2. А если usname не пришло, то выводится код 1.
Но на практике при получении usname куки остаются пустыми и выводится код 1.
Причем, если сразу после setcookie поставить редирект на эту же страницу, то куки появляются.
То есть если добавить в код две строки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?php
if (array_key_exists("usname",$_POST))
	{
	$y2k = mktime( 0 , 0 , 0 , 1 , 1 , 2010 );
	setcookie("user_name",$_POST["usname"],$y2k);
	$URL="http://localhost/labo.php";
	header ("Location: $URL");
	}
if (isset($user_name)==false)
{
?>
тут HTML код  1 
<?php } 
else
{?>
тут HTML код  2 
<?php } ?>
то страница перезагружается и выводится код 2
Подскажите в чем косяк? [src][/SRC]
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #34960939
evgenijj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
int setcookie (string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

setcookie() определяет куку для отправки вместе с остальной header-информацией.Куки обязаны быть отправлены до любых других шапок/headers (это ограничение кук, а не РНР). Это требует, чтобы вы помещали вызовы этой функции перед тэгами <html> или <head>.

Все аргументы, кроме name, являются необязательными.Если имеется только аргумент name, кука с этим именем будет удалена с удалённого клиента.Вы можете также заместить любой аргумент пустой строкой (""), чтобы пропустить этот аргумент.Аргументы expire и secure это целые числа/integer и они не могут быть пропущены с помощью пустой строки. В них используйте нуль (0).Аргумент expire это обычное Unix time integer, возвращаемое функциями time() или mktime().Аргумент secure указывает, что данная кука должна передаваться только через секретное HTTPS-соединение.

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

Обычные ловушки:

* Куки будут невидимы до тех пор, пока не будет загружена следующая страница.
* Куки обязаны быть удалены с теми же параметрами, с которыми были установлены.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #34961707
DiMamont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть это нормальное их поведение, и возможно стоит сделать просто промежуточную страницу, которая устанавливает куки?
Все заголовки у меня идут после setcookie
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #34961742
van4ous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
угумс
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #34961751
Фотография Frenzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если так хочется чтобы были доступны сразу, то после своего сеткуки сделай еще и

Код: plaintext
1.
2.
3.
...
setcookie("user_name",$_POST["usname"],$y2k);
$_COOKIE['user_name'] = $_POST["usname"];
...

не используй автоматический register_globals -- когда тебе нужно пиши $_COOKIE['user_name'], а не $user_name

_______________________________________
2pro4U
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #34962724
DiMamont
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frenzy
не используй автоматический register_globals -- когда тебе нужно пиши $_COOKIE['user_name'], а не $user_name

_______________________________________
2pro4U
А почему?
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #34964662
van4ous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что не секурно это... и register_globals уже использовать нельзя.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #34964709
Алексей Тихоновский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, тут надо минять алгоритм работы. потому как куки нужны что бы получать некоторые значения В ПОСЛЕДУЮЩИХ обращениях клиента к серверу. если же они край нужны для ТЕКУЩЕГО (то есть первого) - что то тут не так...
---------------------------------------------------
Я не волшебник, я только учусь....
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Cookie устанавливаются только после перезагрузки.
    #39437638
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! У меня наверное такая же проблема.

Не буду много расписывать код, так расскажу:
1. В коде JS через AJAX отправляю запрос к файлу 1.php, который устанавливает переменную сессии $_SESSION['name'] = 1234.
2. В этом же коде JS через AJAX отправляю запрос файлу 2.php, которые читает переменную сессии $_SESSION['name'].

В результате получаю:
Переменную $_SESSION['name'] файл 2.php может прочитать только после F5 в браузере (перезапуска страницы). Настройки никакие не менял. Они стандартные в LAMP. Т.к. переменная со второго раза все же читается, то делаю вывод, что сессии и куки все же работают. Не могу понять почему со второго раза?
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39437674
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сессию во всех трех файлах стартуете?
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39437786
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

HettСессию во всех трех файлах стартуете?

Сессии конечно стартую. Прочитал в интернете, что запись в куки должны производиться до вывода любой информации в браузер. У меня конечно же информация в браузер выводится до запуска файла 1.php.
Но я через JS определяю временную зону ZimeZone браузера, чтобы сохранить её как раз в сессии. И без запуска JS определить временную зону, насколько я знаю, средствами PHP невозможно.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39438121
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приведите фрагмент кода где вы посредством ajax делаете обращение к обоим файлам.
Скорей всего вы не учитываете асинхронность, т.е. не можете гарантировать что одно обращение точно сработает после другого.
Включите вывод всех сообщений об ошибках и убедитесь, например, в отладчике браузера, что ошибок действительно нет, и нет вывода другой информации, кроме той что ожидаете.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39438394
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sxqприведите фрагмент кода где вы посредством ajax делаете обращение к обоим файлам.
Скорей всего вы не учитываете асинхронность, т.е. не можете гарантировать что одно обращение точно сработает после другого.
Включите вывод всех сообщений об ошибках и убедитесь, например, в отладчике браузера, что ошибок действительно нет, и нет вывода другой информации, кроме той что ожидаете.

Вывод ошибок включен.

Файл PHP первый. Реальное имя у него 'timezone.php':

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<?php

// ФАЙЛ PHP: установка временной зоны

// старт сессии
session_start();

// определение идентификатора сессии
$strSessID = session_id();

// определение идентификатора временной зоны
$strTimeZone = timezone_name_from_abbr('', $_POST['offset'] * 60, 0);

// запись идентификатора временной зоны в переменную сессии
$_SESSION['TIME_ZONE'] = $strTimeZone;

// возвращает признак положительного результата
echo('OK');

?>



Файл PHP второй. Реальное имя у него 'ini.php':

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?php

// ФАЙЛ PHP: инициализация

// запуск сессий
session_start();

// установка временной зоны
date_default_timezone_set($_SESSION['TIME_ZONE');

?>



Файл JS, который последовательно вызывает оба файла PHP:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
// ФУНКЦИЯ: инициализация
function prog_ini() {
	// установка временной зоны
	set_time_zone_php(php_ini);
}

// ФУНКЦИЯ: установка временной зоны для PHP
// 	funComplete - функция, которая вызывается в случае успешной установки
function set_time_zone_php(funComplete) {
	// определение имени файла PHP
	var strFile = 'timezone.php';
	// определение смещения для временной зоны в минутах
	var intOffset = new Date().getTimezoneOffset();
	// подготовка строки параметров
	var strPost = 'offset=' + intOffset;
	// отправка запроса
	if (SendRequest('post', strFile, strPost, function(objReturn) {
		// получение текста
		var strText = objReturn.responseText;
		// сообщение в случае ошибки и выход
		if (strText != 'OK') {
			// сообщение
			document.write('Ошибка сохранения временной зоны');
			// выход
			return;
		}
		// вызов функции
		funComplete();
	}) != 200) {
		// сообщение об ошибке
		document.write('Не найден файл timezone.php');
	}		
}

// ФУНКЦИЯ: инициализация PHP
function php_ini() {
	// определение имени файла PHP
	var strFile = 'ini.php';
	// отправка запроса
	if (SendRequest('post', strFile, '', function(objReturn) {
		// получение текста
		var strText = objReturn.responseText;
		// сообщение в случае ошибки и выход
		if (strText != 'OK') {
			// сообщение
			document.write('Ошибка иниализации параметров PHP');
			// выход
			return;
		}
		// вызов функции
		funComplete();
	}) != 200) {
		// сообщение об ошибке
		document.write('Не найден файл ini.php');
	}			
}



Код библиотеки AJAX, запросы всегда синхронные!:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
// ФУНКЦИИ: работа с AJAX

// ФУНКЦИЯ: создание объекта
function CreateRequest() {
    var Request = false;
	if (window.XMLHttpRequest) {
		Request = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
	// Internet Explorer
	try {
		Request = new ActiveXObject("Microsoft.XMLHTTP");
	} catch (CatchException) {
		Request = new ActiveXObject("Msxml2.XMLHTTP");
		}
	}
    if (!Request) alert("Can't create XMLHttpRequest");
    return Request;
} 

// ФУНКЦИЯ: выполнение запроса к файлу на сервере
//	r_method  - тип запроса: 'get' или 'post'
//	r_path    - путь к файлу
//	r_args    - аргументы вида a=1&b=2&c=3...
//	r_handler - функция-обработчик ответа от сервера
// Возвращает статус результата
function SendRequest(r_method, r_path, r_args, r_handler) {
	// определение адреса до якоря
	if (r_path.search('#')) var r_path = r_path.split('#')[0];
    // создание объекта запроса
    var Request = CreateRequest();
    // выход, если объект не создан
    if (!Request) return '';
    // назначение пользовательской функции
    Request.onreadystatechange = function() {
        // выход, если состояние не 4
        if (Request.readyState != 4) return;
		// выход в случае ошибки
		if (/<title>.*?404.*?<\/title>/.test(Request.responseText)) return;			
		// передача управления обработчику
		r_handler(Request);
	}
    // проверка, если требуется сделать GET-запрос
    if (r_method.toLowerCase() == "get" && r_args.length > 0) r_path += "?" + r_args;
    // инициализация соединения
    try { Request.open(r_method, r_path, false); } catch (objErr) { return ''; }
    // выполнение запроса
    if (r_method.toLowerCase() == "post") { // если POST-запрос
        // установка заголовка
        Request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
        // отправка запроса
		try { Request.send(r_args); } catch (objErr) { }
    } else { 
		// отправка запроса без POST-аргументов
		Request.send(null);
    }
	// определение результата
	return Request.status;
} 
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39438410
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, что я заменил использование $_SESSION, на просто запись в файл на сервере через file_put_contents() и file_get_contents().
Результат тот же. Читает файл только при повторном запуске браузера. При первом проходе выдает ошибку, что файла нет. Хотя он есть и создается нормально после первого запуска страницы. Может проблема в самой операционке Windows... опять кэрование какое-нибудь, отложенная запись на диск...
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39438416
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос поди кэшируется браузером?
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39438417
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно у вас просто опечатка при копировании сюда кода
date_default_timezone_set($_SESSION['TIME_ZONE');
для чистоты эксперимента во втором файле php сделайте просто вывод print_r($_SESSION);
и выводите все это в результате ajax в браузере, или в отладчике браузера
В отладчике так же посмотрите один и тот же идентификатор сессии передается в заголовках запроса или нет, или просто сделайте вывод в обоих файлах session_id() что бы понять на какой стадии у вас не работает
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39438429
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sxqвозможно у вас просто опечатка при копировании сюда кода
date_default_timezone_set($_SESSION['TIME_ZONE');
для чистоты эксперимента во втором файле php сделайте просто вывод print_r($_SESSION);
и выводите все это в результате ajax в браузере, или в отладчике браузера
В отладчике так же посмотрите один и тот же идентификатор сессии передается в заголовках запроса или нет, или просто сделайте вывод в обоих файлах session_id() что бы понять на какой стадии у вас не работает

Это все делал конечно же:
1) идентификатор сессии тот же.
2) print_r($_SESSION) при первом запуске пишет что такой переменной нет, при втором - выводит все нормально.

Я пробовал даже сессии заменить просто на запись в файл на стороне сервера. Первый файл php записывает значение в текстовый файл, следом второй файл php читает. При первом запуске браузера пишет, что такого файла вообще не существует. После перезапуска страницы текстовый файл видит и нормально читает.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39438431
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sxqвозможно у вас просто опечатка при копировании сюда кода
date_default_timezone_set($_SESSION['TIME_ZONE');

Опечатка только на форуме. Просто код воспроизводил по памяти, опечатался.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39438432
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettЗапрос поди кэшируется браузером?

Предлагаете якорь добавить к имени файла?
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39438434
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей СмирновHettЗапрос поди кэшируется браузером?

Предлагаете якорь добавить к имени файла?

Я подумал. Нет. Файлы php не кэшируются.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39438435
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что бы не гадать на кофейной гуще, откройте отладчик браузера и убедитесь что запросы верно отправляются вместе с заголовками.
Там же будет видно, что кешируется что нет.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39439061
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sxqчто бы не гадать на кофейной гуще, откройте отладчик браузера и убедитесь что запросы верно отправляются вместе с заголовками.
Там же будет видно, что кешируется что нет.

Я запустил отладчик в Mozilla. Сделал точки останова (см. вложение). А где можно посмотреть заголовки?
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39439161
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
весь обмен с серверной частью в разделе "сеть", там и заголовки, и тело запросов и удобоваримый вид передаваемых данных.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39441350
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем я разобрался. Увидел чисто случайно. У меня была ошибка в коде JS и функция передавалась не как функция, а исполнялась сразу, т.к. я ей написал скобки (надо было без скобок).
Из-за этого файл 2.php вызывался раньше, чем 1.php.
Сессии и куки в итоге нормально передаются через AJAX даже без перезагрузки браузера.
Все произошло конечно из-за этих обратных вызовов. Получается, что я не могу пошагово выполнить нужные мне действия, а должен их плести в паутину. Код получается вообще нечитаемым. Естественно - отсюда ошибки, которые трудно увидеть невооруженным глазом.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39441354
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо было в откладчике открыть вкладку "Сеть", как посоветовали выше, и сразу бы это увидели.
...
Рейтинг: 0 / 0
Cookie устанавливаются только после перезагрузки.
    #39441378
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettНадо было в откладчике открыть вкладку "Сеть", как посоветовали выше, и сразу бы это увидели.

Ну я открывал сеть. Да там последовательно было показано, что в какой последовательности вызывается. Но почему-то не обратил внимание на порядок вызывов PHP.

Сейчас думаю все-таки поискать решения линейного программирования на JS, может есть что-то стоящее...
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Cookie устанавливаются только после перезагрузки.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]