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

Форум PHP

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

 

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

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

тема: Как реализовать механизм: не более двух человек на странице
 
 автор: itica   (24.02.2006 в 22:32)   письмо автору
 
 

Можно ли как нибудь сделать так, чтобы на странице находилось ровно 2 человека или меньше, если на страницу пытается попасть третий, его автоматически переносит на другую.

   
 
 автор: cheops   (25.02.2006 в 13:37)   письмо автору
 
   для: itica   (24.02.2006 в 22:32)
 

Можно, для этого необходимо использовать сессии, а на странице фиксировать сессии, если их будет больше двух выводить редирект.

   
 
 автор: Loki   (25.02.2006 в 15:07)   письмо автору
 
   для: cheops   (25.02.2006 в 13:37)
 

Это то, что лежит на поверхности, а в реальности, после того как на сайте появляется третья сессия, на первую страницу попасть не может никто! Так что тут надо действовать хитрее - например, фиксировать номера сессии первых двух.

   
 
 автор: itica   (25.02.2006 в 18:07)   письмо автору
 
   для: Loki   (25.02.2006 в 15:07)
 

А как это сделать? Если нетрудно дай пример.

   
 
 автор: Loki   (25.02.2006 в 18:39)   письмо автору
 
   для: itica   (25.02.2006 в 18:07)
 

Ну надо где-то сохранить (в базе или файле) номер сессии и дату последнего входа первого и второго посетителя и проверять тот это посетитель или нет. В этом ничего сложного. Так же проверять возраст этих записей. если им больше, например, 5 мин, то удалять.

   
 
 автор: itica   (25.02.2006 в 20:13)   письмо автору
 
   для: Loki   (25.02.2006 в 18:39)
 

Я навичок, если нетрудно напиши код!

   
 
 автор: cheops   (25.02.2006 в 20:50)   письмо автору
 
   для: itica   (25.02.2006 в 20:13)
 

В первую очередь необходимо реализовать систему OnLine, о том как это сделать можно почитать в ссылках, приведённых в теме http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=10519.

   
 
 автор: itica   (25.02.2006 в 21:40)   письмо автору
 
   для: cheops   (25.02.2006 в 20:50)
 

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

   
 
 автор: Oligarx   (25.02.2006 в 23:48)   письмо автору
 
   для: itica   (25.02.2006 в 21:40)
 

Нет нельзя ... грамотно объяснить почему не могу :)) но точно нельзя (там что то типо с протоколом связано)

   
 
 автор: itica   (26.02.2006 в 10:34)   письмо автору
 
   для: Oligarx   (25.02.2006 в 23:48)
 

А как организлвать приват в чате, там должен быть такой же механизм.

   
 
 автор: itica   (27.02.2006 в 20:54)   письмо автору
 
   для: cheops   (25.02.2006 в 13:37)
 

Подскажите как можно создать такие сессии.

   
 
 автор: cheops   (28.02.2006 в 00:12)   письмо автору
 
   для: itica   (27.02.2006 в 20:54)
 

Сессия создаётся автоматически, если в начало скрипта поместить вызов функции session_start()
<?php
  session_start
();
?>

С этого момента посетителю присваивается уникальный номер, получить который можно при помощи функции session_id()
<?php
  $id 
session_id();
?>

В сессию можно помещать данные
<?php
  $_SESSION
['test'] = 'hello';
?>

которые затем можно получить на другой странице
<?php
  
echo $_SESSION['test'];
?>

Везде, где используется суперглобальный массив $_SESSION необходимо в начале скрипта вызывать функцию session_start().

   
 
 автор: itica   (02.03.2006 в 21:22)   письмо автору
 
   для: cheops   (28.02.2006 в 00:12)
 

Добавил код

<?php
  session_start
();
?> 

на страницу, если я правильно понял, то скрипт должен будет присвоить посетителю уникальный номер, но вместо этого мне пишется:

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at d:\programic\apache\apache\htdocs\test\index.php:10) in d:\programic\apache\apache\htdocs\test\index.php on line 11

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at d:\programic\apache\apache\htdocs\test\index.php:10) in d:\programic\apache\apache\htdocs\test\index.php on line 11

   
 
 автор: elenaki   (02.03.2006 в 21:30)   письмо автору
 
   для: itica   (02.03.2006 в 21:22)
 

перед вызовом сессии не должно быть никакого вывода с браузер.

///======= залезла на трибуну =======/////
интересно, создатели РНР когда-нибудь сподобятся убрать это ограничение? это так бесит.
ну, или хотя бы ошибку написать человеческим языком - типа "убери все пробелы перед вызовом сессии!". столько места на форумах сохранили бы :)
///======= слезла с трибуны =======/////

   
 
 автор: Trianon   (02.03.2006 в 21:48)   письмо автору
 
   для: elenaki   (02.03.2006 в 21:30)
 

убрать его можно лишь очень дорогой ценой. Начав буферизировать (накапливать в памяти) весь вывод http-ответа. А если он длинный?
Между прочим, если программист согласен с такими расценками, вызвать ob_start() ему никто не мешает.
Ну а диагностика... А как сформулировать-то? У одного echo перед session_start, у другого <html> перед <?php>. А у меня пустая строка вчера во include-файле закралась. И что - каждую ситуацию перечислять?

Кстати, по-моему от лидирующего <html> никакая буферизация не спасет. Апач-то своё уже отправил...

   
 
 автор: cheops   (02.03.2006 в 22:28)   письмо автору
 
   для: elenaki   (02.03.2006 в 21:30)
 

А они сделали это... только по умолчанию директива output_buffering отключена, если её включить - всё пропадёт, только вот код будет не переносимым
output_buffering = On

Кроме того, буферизовать можно при помощи функций управления выводом http://www.softtime.ru/group/id_group=12 - такое решение будет переносимым, хоть и громоздким.

   
 
 автор: itica   (02.03.2006 в 22:31)   письмо автору
 
   для: elenaki   (02.03.2006 в 21:30)
 

Спасибо, ответ оказался очень простым ;) А я ломал себе голову над этим почти трое суток :(
А как фиксировать эти сессии, чтобы было только 2 человека? Ведь тема то как раз про это ограничение :)

   
 
 автор: itica   (02.03.2006 в 22:31)   письмо автору
 
   для: elenaki   (02.03.2006 в 21:30)
 

Спасибо, ответ оказался очень простым ;) А я ломал себе голову над этим почти трое суток :(
А как фиксировать эти сессии, чтобы было только 2 человека? Ведь тема то как раз про это ограничение :).

   
 
 автор: cheops   (02.03.2006 в 22:32)   письмо автору
 
   для: itica   (02.03.2006 в 21:22)
 

Куки, сессии, отправка заголовков должны происходить до отправки любой информации в окно браузера, т.е. до любого вывода echo, print или непосредственного вывода вне тэгов <?php и ?>. Это связано с тем, что HTTP-заголовки передаются перед всеми данными и когда происходит вывод в окно браузера PHP вынужден их пред этим отослать клиенту. Поэтому повторно, после вывода информации в браузер он не может работать с куками, сессиями и отправлять заголовки.
Если вывод текста до отправки заголовков необходим следует воспользоваться функциями управления вывода, позволяющих задерживать вывод информации в браузер.
http://www.softtime.ru/group/id_group=12
http://www.softtime.ru/forum/ead.php?id_forum=1&id_theme=147
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=148
Вы можете также включить буфферизацию, если имеете доступ к конфигурационному файлу php.ini
output_buffering = On

   
 
 автор: itica   (02.03.2006 в 23:42)   письмо автору
 
   для: cheops   (02.03.2006 в 22:32)
 

С сессиями всё более менее ясно, а как всё таки фиксировать пользователей?

   
 
 автор: cheops   (03.03.2006 в 14:12)   письмо автору
 
   для: itica   (02.03.2006 в 23:42)
 

Теперь необходимо сохранять IP-адрес пользователя, его уникальный идентификатор и время обращения к странице в с файл или базу данных. Этот процесс я и назвал (не удачно) "фиксацией".

   
 
 автор: itica   (03.03.2006 в 18:09)   письмо автору
 
   для: cheops   (03.03.2006 в 14:12)
 

Именно как это сделать я и хочу узнать, почти с самого начала темы.

   
 
 автор: itica   (03.03.2006 в 20:31)   письмо автору
 
   для: itica   (03.03.2006 в 18:09)
 

Точнее куда и как записывать эти данные?

   
 
 автор: itica   (04.03.2006 в 17:24)   письмо автору
 
   для: itica   (03.03.2006 в 20:31)
 

Помогите новичку!

   
 
 автор: cheops   (04.03.2006 в 20:01)   письмо автору
 
   для: itica   (03.03.2006 в 18:09)
 

А с чем работать будем с базой данных или файлом?

   
 
 автор: itica   (04.03.2006 в 20:14)   письмо автору
 
   для: cheops   (04.03.2006 в 20:01)
 

С базой данных.

   
 
 автор: cheops   (05.03.2006 в 13:49)   письмо автору
 
   для: itica   (04.03.2006 в 20:14)
 

Нужно создать таблицу
CREATE TABLE sess (
  id_session int(11) NOT NULL auto_increment,
  session tinytext NOT NULL,
  putdate datetime NOT NULL default '0000-00-00 00:00:00',
  ip bigint(20) NOT NULL default '0',
  PRIMARY KEY  (id_session)
) TYPE=MyISAM;

и помещать в неё данные следующим образом
<?php
  $query 
"INSERT INTO sess VALUES(NULL, '".session_id()."', NOW(), INET_ATON('".$_SERVER['REMOTE_ADDR']."'))";
?>

   
 
 автор: itica   (05.03.2006 в 15:47)   письмо автору
 
   для: cheops   (05.03.2006 в 13:49)
 

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

   
 
 автор: cheops   (05.03.2006 в 21:24)   письмо автору
 
   для: itica   (05.03.2006 в 15:47)
 

В этом случае перед выполнением оператора INSERT (чтобы ещё и третий не добавился) необходимо выполнить такой блок
<?php 
  
// Удаляем старые записи
  
$query "DELETE FROM sess WHERE NOW() - putdate > 20*60"
  
mysql_query($query);
  
// Смотрим сколько посетителей на странице
  
$query "SELECT COUNT(*) FROM sess GROUP BY session"
  
$ses mysql_query($query);
  if(!
$ses) exit(mysql_error());
  
$count mysql_result($ses,0);
  if(
$count 1)
  {
    
// Здесь уже двое - осуществляем переход на другую страницу
    
header("Location: other.php");
  }
?>

   
 
 автор: itica   (05.03.2006 в 21:40)   письмо автору
 
   для: cheops   (05.03.2006 в 21:24)
 

В таком случае на страницу можно попасть только два раза, даже если один посетитель уйдёт, то на страницу всё равно нельзя будет попасть, а мне надо чтобы было можно.

   
 
 автор: cheops   (05.03.2006 в 21:47)   письмо автору
 
   для: itica   (05.03.2006 в 21:40)
 

Если один посетитель уйдёт - он будет удалён из таблицы при помощи оператора DELETE, конструкция GROUP BY гарантирует... хотя погодите... у нас же COUNT(), агрегатная функция... тогда давайте вот так переделаем
<?php 
  
// Удаляем старые записи 
  
$query "DELETE FROM sess WHERE NOW() - putdate > 20*60"
  
mysql_query($query); 
  
// Смотрим сколько посетителей на странице 
  
$query "SELECT * FROM sess GROUP BY session"
  
$ses mysql_query($query); 
  if(!
$ses) exit(mysql_error()); 
  
$count mysql_num_rows($ses); 
  if(
$count 1
  { 
    
// Здесь уже двое - осуществляем переход на другую страницу 
    
header("Location: other.php"); 
  } 
?>

   
 
 автор: itica   (06.03.2006 в 18:32)   письмо автору
 
   для: cheops   (05.03.2006 в 21:47)
 

Простите, но тут навязался такой вопрос: Как сделать так, чтобы админ мог запретить доступ к странице одним нажатием кнопки.

   
 
 автор: cheops   (07.03.2006 в 00:53)   письмо автору
 
   для: itica   (06.03.2006 в 18:32)
 

А запретить кому - всем или какому-то определённому пользователю?

PS Под новые вопросы лучше заводить новые темы.

   
 
 автор: itica   (07.03.2006 в 09:48)   письмо автору
 
   для: cheops   (07.03.2006 в 00:53)
 

Всем!

   
 
 автор: cheops   (07.03.2006 в 13:45)   письмо автору
 
   для: itica   (07.03.2006 в 09:48)
 

Поместить в базу или файл какой-нибудь булевый флаг - если он установлен запрещать доступ при помощи кода
<?php
  
if(флаг) exit("Доступ к странице закрыт");
?>

   
 
 автор: itica   (07.03.2006 в 17:42)   письмо автору
 
   для: cheops   (07.03.2006 в 13:45)
 

Пытался, но что то не получилось, может я делаю не так, если не затруднит дайте фрагмент кода. Или может я вообще неправильно понял :(

   
 
 автор: Trianon   (07.03.2006 в 18:47)   письмо автору
 
   для: itica   (07.03.2006 в 17:42)
 

if file_exists("warning.txt") 
    die file_get_contents("warning.txt");


В файл warning.txt вписываете текст "Доступ к странице закрыт!" , или любой другой, который будет отражать смысл отлупа. Когда страницу нужно будет отпереть, файл warning.txt просто стираете.

   
 
 автор: itica   (07.03.2006 в 19:50)   письмо автору
 
   для: Trianon   (07.03.2006 в 18:47)
 

По мойму этот способ не очень удбен, так как приходится то создавать то удалять файл, чтобы открыть или закрыть доступ. Cheops, Вы предложили использовать некий "булевой" флаг, расскажите пожалуйста о нём по подробнее!

   
 
 автор: Trianon   (07.03.2006 в 20:19)   письмо автору
 
   для: itica   (07.03.2006 в 19:50)
 

Код, который вставлять перед закрываемой страницей:
<?php
  
if(file_exists("warning.txt"))
    die(
file_get_contents("warning.txt"));

  echo 
"----------------текст страницы-------------------"
?>


Код, запирающий сайт:
<?php
  
if(!file_exists("warning.txt"))
  {
    
$f fopen("warning.txt""w");
    
fputs($f"<h1>Доспуп к сайту закрыт!</h1>");
    
fclose($f);
  }
  echo 
"Доспуп к сайту закрыт.";
?>


Код, отпирающий сайт:
<?php
  
if(file_exists("warning.txt"))
     
unlink("warning.txt");
    echo 
"Доспуп к сайту открыт.";
?>

В данном случае этот самый файл (точнее факт его наличия) и является "неким булевым флагом".

   
 
 автор: Trianon   (07.03.2006 в 15:28)   письмо автору
 
   для: itica   (07.03.2006 в 09:48)
 

Кнопкой "Power Off".

:-)

   
Rambler's Top100
вверх

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