Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: изменение переменной-флага в PHP-сессии при выгрузке страницы
 
 автор: кен   (25.11.2004 в 21:28)
 
 

А как организовать сбрасывание сессионной переменной-флага при выгрузке страницы? Думаю, для этого нужно как-то использовать onUnload (JavaScript). Но а как именно?

   
 
 автор: cheops   (25.11.2004 в 21:37)   письмо автору
 
   для: кен   (25.11.2004 в 21:28)
 

Под выгрузкой понимается момент когда страница полностью загружена? Тогда это невозможно - переменные PHP и JavaScript никак не связаны, кроме того, что средствами PHP можно формировать JavaScript. Так как цикл жизни страницы такой:
1) Сервер - Формирование страницы за счёт выполнения PHP-скриптов
2) Отправка страницы клиенту
3) Клиент - Выполнение скриптов JavaScript
Так как HTTP не сохраняет состояние отследить средствами PHP что там у клиента творится на машине невозможно, если только клиент сам не отсчитается, а это возможно только посредством заголовков (например cookies).

http://www.softtime.ru/forum/read.php?id_forum=4&id_theme=847

   
 
 автор: кен   (25.11.2004 в 22:12)
 
   для: cheops   (25.11.2004 в 21:37)
 

Под выгрузкой понимается момент, когда в JavaScript генерируется событие "Unload", например, при переходе по ссылке перед загрузкой (Load) другой страницы.
Я имею в виду вот что:
Мне нужно недопустить повторную загрузку гостем страницы "x" в другом окне. То есть, нужно, чтобы в сессии было известно, загружена ли в данный момент страница "х". Для этого я хочу хранить в сессии переменную-флаг. При загрузке "x" этот флаг проверяется. Если сброшен - устанавливается. Если установлен - значит экземпляр страницы уже загружен и это попытка загрузить её второй экземпляр в другом окне. Тогда необходимо вместо вывода основного текста страницы сделать гостю alert "Низ-з-я-я..." и закрыть второе окно.
Чтобы это работало, нужно при выгрузке страницы передать весточку сеансу, чтобы там сбросился флаг.
Это мои попытки решить главный вопрос (в форуме чуть ниже по списку) "как запретить открытие страницы в нескольких окнах". Может, что другое посоветуете?

   
 
 автор: cheops   (25.11.2004 в 22:27)   письмо автору
 
   для: кен   (25.11.2004 в 22:12)
 

Это возможно отследить только для протоколов сохраняющих соединение - HTTP к ним не относится, сам HTTP даже не делает различий между обращениями посетителей - для него любое обращение эквивалентно новому посетителю, даже загружая картинки с одной страницы он считает, что каждую картинка отправляется независимому клиенту. Чтобы это предотвратить были введены сессии и кукисы - теперь клиентов можно различить, но заставить их работать с одним окном... не знаю вряд ли, может дизайнеры чего скажут - задача действительно для JavaScript.
Помоему следует честно написать, чтобы клиенты работали с одним окном - тщательно следить за вводом и как только он окажется не согласованным - прекращать обработку данных.
А вообще сгенирируйте уникальный номер (может даже номер сессии подойдёт) и поместите его в скрытое (hidden) поле, в другое поле введите число обращений (счётчик), которое так же храните в базе или файле на сервере - как только полчите от клиента с определённым уникальным номером счётчик не согласованный с базой данных - прекращайте обработку данных. Не очень вежливо по отношению к клиенту, но зато приучите их пользоваться одной формой.

   
 
 автор: кен   (25.11.2004 в 23:59)
 
   для: cheops   (25.11.2004 в 22:27)
 

Довольно хлопотно это, с уникальными номерами...
Вообще-то у меня есть своё решение, но на мой взгляд, тоже не сильно элегантное.
В странице делаю так:

<?
# ... - тут связь с сессией. Потом:
If ($is_loaded) { # если уже загружено - предупреждаем и выходим.
echo "<script type=text/JavaScript>alert('..тут пишем просьбу работать только с одним окном..'); close()</script>";
exit;}
else 
$is_loaded=1# если загрузка единственная - включаем флаг. ?>
<body onUnload="ifr.location=xxx.php'">
<iframe name=ifr style="visibility:hidden"></iframe>
... <!--основная часть страницы -->


А вот выключатель флага: xxx.php. Он вызывается при выгрузке страницы.

session_start();
$is_loaded=0; # сбрасываем флаг - страница выгружена.
.

Но опять эти скрытые iframe..., часто и скрытые формы... >:(
Ведь задача прозрачна и проста: в ответ на какое-то действие на странице обновить какую-то информацию на сервере!
И вообще, если посмотреть шире, то всплывают два общих вопроса:

1) можно ли на PHP написать сценарий, который просто выполняет действия на сервере и не пытается что-либо выводить в окно браузера (т.е. не требует для себя окна)? Обновил какую-нибудь сессионную переменную, вписал строчку в базу данных и всё!

2) как из страницы запускать такие утилитарные PHP-сценарии с помощью JavaScript без перезагрузки страницы, и без использования форм и скрытых фреймов?

   
 
 автор: cheops   (26.11.2004 в 00:32)   письмо автору
 
   для: кен   (25.11.2004 в 23:59)
 

Web - это клиент-серверное решение с тонким клиентом: преимущество которого заключается в универсальности, а недостаток в том, что приходится часто обмениваться информацией с сервером. Чтобы выполнить какое-то действие следует отправить запрос и не просто его отправить, но ещё и получить ответ - так требует протокол.
1) В Web под каждый запрос клиент получает ответ. Так например заполнив форму на данном форуме данные отправляются независимому скрипту addpost.php, который в принципе ничего не выводит, но чтобы посетитель не созерцал пустую страницу осуществляется редирект на тему в которой посетитель отвечает:
<?php
      
echo "<HTML><HEAD>
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=read.php'>
          </HEAD></HTML>"
;
?>

Не загружать ничего не получается, но можно загрузить два раза - сначала скрипт выполняющий некую полезную работу, а потом сразу же осуществить редирект на исходную страницу... Так принято, например, на этом форуме.
2) Опять же без перезагрузки не получится, но можно запустить можно воспользовавшись скриптом указанным выше или аналогом на JavaScript. Пожалуй ещё существует только один способ запускать скрипты на сервере без загрузки его в окне браузера - демон cron, запускающий скрипты в определённое время, но этот способ загрузки привязан ко времени, а не к событиям.

PS Вообще, возмущение понятно - HTTP (да и вообще протоколы лежащие в основе Internet) не совершенен и в настоящий момент ведутся работы под кодовым названием Internet2, который будет основываться на протоколах более подходящих для такой гиганской сети.

   
 
 автор: кен   (26.11.2004 в 00:51)
 
   для: cheops   (26.11.2004 в 00:32)
 

Спасибо за участие!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования