Обновить данные при выходе (закрытии страницы)

Madzsar

Новичок
Обновить данные при выходе (закрытии страницы)

Добрый день.
Я у Вас новый.
Уважаемые Гуру, есть вопрос, над кот. бьюсь довольно долго.
Допустим юзер вошёл как гость кликнув на "вход в базу данных" (автоматически он вошёл под логином guest, паролем guest). Что-то изменял... когда закрывает окно мне нужно сделать update некоторые данные, кот он изменял, чтобы следующий guest всё видел бы как 'default', т.е по умолчанию мои настройки. Если юзер выходит нажав на "CLOSE" нет проблем, я могу всё обновить, но если он просто закрывает броузер... Как тогда????
Пробовал вариант открыть window при body OnUnload, но, сами понимаете- pop-up- это не серьёзно...
Пробовал с alert- не получилось...
Пробовал с flock()- тоже не получил результата.
Кто-нибудь может помочь?
Заранее благодарен.
 

basboy

Новичок
Madzsar
Есть такой не очень серьёзный вариат.
На OnUnload нужно сделать 2 штуки:
1 передать скрипту сообщ о закрытии
2 поставить таймер на несколько сек (2 хватит)

В скрипте делаешь нужные манипуляции. Но значения нужно передвать или в скрытом ифрэим, или вызовом <script src="script.php"></script>
А задержка нужна, чтоб скрипт успел выполниться.
Во время задержки стоит показать пользователю что-нить развлекательное, чтоб ему такие "глюки" с задержками не надоели.
 

Madzsar

Новичок
Hello, basboy!
Ты имеешь ввиду onunload вывод Поп-ап?
Не любой браузер выдаст это...
Вот если бы это связать как-то с ALERT....,
но как???
 

basboy

Новичок
Ладно, вот... Извините за кривость примера, но сють одна.
Вообще не дуцмаю, что я до этого первый додумался, наверное на форуме уже есть такое.

Вот простая траница:
PHP:
<HTML>
<HEAD>
<TITLE> Test</TITLE>
<SCRIPT>
function a()
{
		document.write('<SCRIPT src=\"\/php.php\"><\/SCRIPT>');
}
</SCRIPT>
</HEAD>
<BODY onUnload="a()">
</BODY>
</HTML>
А вот и код скрипта php.php, который, как очевидно может быть любой.
PHP:
<?
$fh=fopen('txt.txt', 'w');
fwrite($fh,'asdasdasdasd');
fclose($fh);
?>
Помещаешь два файла в одну папку.
Запускаешь страницу, закрываешь её, и в папке создаётся файл txt.txt

Я не знаю, какие могут быть проблемы с реализацией этого алгоритма, но я думаю, что лучьше, если скрипт php будет по-меньше...
 

Madzsar

Новичок
Спасибо.
А я тут накрутил кое-что, вроде работает, но иногда глючит-
<?
switch ( $user_login )
{
case"guest":

$UPD=$db->query("UPDATE users_demo SET users_demo.user_name=MyName WHERE user_login=guest");

print" <HEAD>
<SCRIPT language=\"JavaScript\">

function UnLoad()
{

alert(\"$UPD\")
}
//-->
</SCRIPT>
</HEAD>
<BODY onUnLoad=\"UnLoad()\"> ";
break;
}
?>
Вопреки всей логике работает. в алерте почему-то всегда пишет "1"- не понятно.
any idea?

-~{}~ 30.09.05 12:28:

Hi, basboy
Я пробую твой вариант, но что-то не хочет реагировать. я сделал так-
document.write('<SCRIPT src=\"\/php.php?USER=guest&\"><\/SCRIPT>');

А сам php совсем небольшой- мне надо сделать апдейт всего нескольких полей-
<?
if(!isset($user_id))
{
$query = mysql_query("SELECT * FROM users_demo WHERE user_login = $USER");
while ($row = mysql_fetch_array($query))
{
$user_name=$row["user_name"];
}
}

$query="UPDATE users_demo SET users_demo.user_name=MyName WHERE user_login=\"$USER\"";
?>
В чём может быть подводный камень?
И ты упомянул, что эта тема уже обсуждалась. Я не нашёл, да и к тому же первый (надеюсь не последний ) раз на этом форуме.
Спасибо.
 

alexhemp

Новичок
basboy

Оптимальный вариант - не пытаться поймать момент некого "выхода" а писать лог времени последнего действия пользователя.
Периодически, раз в 5 минут "чистить" данный лог, если юзер кто давно ничего не делал - уничтожать его "сессию", выполняя необходимые действия.
 

Madzsar

Новичок
2 alexhemp

Спасибо.
Это тоже, возможно выход.
Подскажи, пожалуйста, как бы это сделал ты?
Мне знаком такой скрипт-

<script>
//change below target URL to your own
var targetURL="http://<?print"My.php?user_login=guest&";?>"
//change the second to start counting down from
var countdownfrom=600
var currentsecond=document.redirect.redirect2.value=countdownfrom+1
function countredirect(){
if (currentsecond!=1){
currentsecond-=1
document.redirect.redirect2.value=currentsecond
}
else{
window.location=targetURL
return
}
setTimeout("countredirect()",1000)
}
countredirect()
//-->
</script>
Может, как-то по другому???

-~{}~ 30.09.05 15:42:

2 alexhemp
Может, ты имеешь ввиду- каждый клик юзера, напр. делать update некой date_update, кот= Now() и если now() минус date_update>5мин тогда чистить???
 

alexhemp

Новичок
Я уже все объяснил.

"Клики" ты не записываешь - твои скрипты запускаются на сервере при обращении к ним. Записывай дату-время каждого обращения от конкретного юзера (как ты его будешь определять - дело твое, по ip, или сессию стартанешь или еще как).

Далее каждые N минут должен запускаться процесс который определит устаревшие пользовательские сесии (5 минут вообще то маловато, вдруг человек на звонок отвлекся или еще куда, минимум 15 минут тайм-аут). Частоту очистки сессий определи опытным путем в зависимости от длительности процесса (я бы сделал раз в 5 минут, и не редко и не часто).
 

Madzsar

Новичок
"Далее каждые N минут должен запускаться процесс который определит устаревшие пользовательские сесии "-
подскажи, каким образом?
типа expire?
 

alexhemp

Новичок
Madzsar

cron

Что значит "типа expire" не представляю.

Проверить - элементарно. Вычесть из текущего времени время последней операции, если разница больше наперед занного числа - значит сессия устарела. Удаляем запись в логе и выполняем действия по закрытию сессии.

А вообще - используйте поиск - такие вопросы возникают у новичков каждую неделю.
 

Madzsar

Новичок
2 alexhemp

спасибо за советы.
Всё ясно. Единственный вопрос- как получить "время последней операции". Дальше всё смогу сделать.
 

kruglov

Новичок
Madzsar
А почему б не сбрасывать базу на дефолтное состояние не при выходе, а при входе очередного guestа?
 

Madzsar

Новичок
2 kruglov
Эта идея уже была.
Проблема в том, что когда юзер вошёл нужно заблокировать страницу, чтобы исключить 2-х юзеров в одном РНР.
Т.е при выходе надо "освободить" для другого юзера.
 

alexhemp

Новичок
Madzsar

Элементарно. В КАЖДОМ скрипте последняя операция - обновление этого самого времени последнего действия.
Текущее время узнается ф-цией MySQL NOW()
(раз уж в форуме MySQL идет не относящееся к нему обсуждение.
 

Madzsar

Новичок
2 alexhemp
OK
Сайт состоит из N-го кол-ва РНР страниц.
Если юзер открывает N-ю стр в теч. 15-и мин. значит он не спит и что-то делает. Если я сделаю отдельный .рнр со скриптом update date и nclude в каждую стр.
Как считаешь?
Но возникает другой вопрос - как сделать блокировку стр-цы, чтобы запретить параллельно войти другому юзеру?
Знаю ком-ду flock(), но что-то не могу с ней подружиться.
Спасибо за помощь.
 

alexhemp

Новичок
Madzsar

Зачем тебе блокировать страницы. Ты похоже не знаешь, что тебе вообще нужно - в том смысле не КАК сделать, а ЧТО сделать.

Сайт - это система массового обслуживания. Блокировать имеет смысл для экономии ресурсов скажем, а просто так блокировать ничего не нужно.

Заведи в БАЗЕ ДАННЫХ ЛОГ куда пиши "пользователь, ip, действие такое-то, дата-время".

Изучай язык SQL и учись легко и просто делать такие выборки какие тебе нужны.
 

Madzsar

Новичок
2 alexhemp

Вроде получается....
Спасибо за ответы.
Я действительно завёл лог и открываю .рнр обновления в другом фрейме. 15 мин- обновление лога. И как ты посоветовал если время < now() на 15мин.- обновить.
Оказалось не так уж и страшно.....
ещё раз спасибо.
 
Сверху