|
|
|
| Можно ли как нибудь сделать так, чтобы на странице находилось ровно 2 человека или меньше, если на страницу пытается попасть третий, его автоматически переносит на другую. | |
|
|
|
|
|
|
|
для: itica
(24.02.2006 в 22:32)
| | Можно, для этого необходимо использовать сессии, а на странице фиксировать сессии, если их будет больше двух выводить редирект. | |
|
|
|
|
|
|
|
для: cheops
(25.02.2006 в 13:37)
| | Это то, что лежит на поверхности, а в реальности, после того как на сайте появляется третья сессия, на первую страницу попасть не может никто! Так что тут надо действовать хитрее - например, фиксировать номера сессии первых двух. | |
|
|
|
|
|
|
|
для: Loki
(25.02.2006 в 15:07)
| | А как это сделать? Если нетрудно дай пример. | |
|
|
|
|
|
|
|
для: itica
(25.02.2006 в 18:07)
| | Ну надо где-то сохранить (в базе или файле) номер сессии и дату последнего входа первого и второго посетителя и проверять тот это посетитель или нет. В этом ничего сложного. Так же проверять возраст этих записей. если им больше, например, 5 мин, то удалять. | |
|
|
|
|
|
|
|
для: Loki
(25.02.2006 в 18:39)
| | Я навичок, если нетрудно напиши код! | |
|
|
|
|
|
|
|
для: itica
(25.02.2006 в 20:13)
| | В первую очередь необходимо реализовать систему OnLine, о том как это сделать можно почитать в ссылках, приведённых в теме http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=10519. | |
|
|
|
|
|
|
|
для: cheops
(25.02.2006 в 20:50)
| | Изучил, но там пользователь считается неактивным по истечении какого либо времени, но нельзя ли как нибудь сделать, чтобы пользователь считался ушедшим, сразу как он закрыл окно. Например когда он нажимает крестик или кнопку закрыть включается какая нибудь функция и удалеят этого пользователя. | |
|
|
|
|
|
|
|
для: itica
(25.02.2006 в 21:40)
| | Нет нельзя ... грамотно объяснить почему не могу :)) но точно нельзя (там что то типо с протоколом связано) | |
|
|
|
|
|
|
|
для: Oligarx
(25.02.2006 в 23:48)
| | А как организлвать приват в чате, там должен быть такой же механизм. | |
|
|
|
|
|
|
|
для: cheops
(25.02.2006 в 13:37)
| | Подскажите как можно создать такие сессии. | |
|
|
|
|
|
|
|
для: 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(). | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: itica
(02.03.2006 в 21:22)
| | перед вызовом сессии не должно быть никакого вывода с браузер.
///======= залезла на трибуну =======/////
интересно, создатели РНР когда-нибудь сподобятся убрать это ограничение? это так бесит.
ну, или хотя бы ошибку написать человеческим языком - типа "убери все пробелы перед вызовом сессии!". столько места на форумах сохранили бы :)
///======= слезла с трибуны =======///// | |
|
|
|
|
|
|
|
для: elenaki
(02.03.2006 в 21:30)
| | убрать его можно лишь очень дорогой ценой. Начав буферизировать (накапливать в памяти) весь вывод http-ответа. А если он длинный?
Между прочим, если программист согласен с такими расценками, вызвать ob_start() ему никто не мешает.
Ну а диагностика... А как сформулировать-то? У одного echo перед session_start, у другого <html> перед <?php>. А у меня пустая строка вчера во include-файле закралась. И что - каждую ситуацию перечислять?
Кстати, по-моему от лидирующего <html> никакая буферизация не спасет. Апач-то своё уже отправил... | |
|
|
|
|
|
|
|
для: elenaki
(02.03.2006 в 21:30)
| | А они сделали это... только по умолчанию директива output_buffering отключена, если её включить - всё пропадёт, только вот код будет не переносимым
Кроме того, буферизовать можно при помощи функций управления выводом http://www.softtime.ru/group/id_group=12 - такое решение будет переносимым, хоть и громоздким. | |
|
|
|
|
|
|
|
для: elenaki
(02.03.2006 в 21:30)
| | Спасибо, ответ оказался очень простым ;) А я ломал себе голову над этим почти трое суток :(
А как фиксировать эти сессии, чтобы было только 2 человека? Ведь тема то как раз про это ограничение :) | |
|
|
|
|
|
|
|
для: elenaki
(02.03.2006 в 21:30)
| | Спасибо, ответ оказался очень простым ;) А я ломал себе голову над этим почти трое суток :(
А как фиксировать эти сессии, чтобы было только 2 человека? Ведь тема то как раз про это ограничение :). | |
|
|
|
|
|
|
|
для: 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
| |
|
|
|
|
|
|
|
для: cheops
(02.03.2006 в 22:32)
| | С сессиями всё более менее ясно, а как всё таки фиксировать пользователей? | |
|
|
|
|
|
|
|
для: itica
(02.03.2006 в 23:42)
| | Теперь необходимо сохранять IP-адрес пользователя, его уникальный идентификатор и время обращения к странице в с файл или базу данных. Этот процесс я и назвал (не удачно) "фиксацией". | |
|
|
|
|
|
|
|
для: cheops
(03.03.2006 в 14:12)
| | Именно как это сделать я и хочу узнать, почти с самого начала темы. | |
|
|
|
|
|
|
|
для: itica
(03.03.2006 в 18:09)
| | Точнее куда и как записывать эти данные? | |
|
|
|
|
|
|
|
для: itica
(03.03.2006 в 20:31)
| | Помогите новичку! | |
|
|
|
|
|
|
|
для: itica
(03.03.2006 в 18:09)
| | А с чем работать будем с базой данных или файлом? | |
|
|
|
|
|
|
|
для: cheops
(04.03.2006 в 20:01)
| | С базой данных. | |
|
|
|
|
|
|
|
для: 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']."'))";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(05.03.2006 в 13:49)
| | Простите за назойливость, но подскажите ещё как присвоить переменной определённое значение, если появилось более 2 различых сессий, (а уже в зависимости от переменной будет загружается нужная страница). | |
|
|
|
|
|
|
|
для: 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");
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(05.03.2006 в 21:24)
| | В таком случае на страницу можно попасть только два раза, даже если один посетитель уйдёт, то на страницу всё равно нельзя будет попасть, а мне надо чтобы было можно. | |
|
|
|
|
|
|
|
для: 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");
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(05.03.2006 в 21:47)
| | Простите, но тут навязался такой вопрос: Как сделать так, чтобы админ мог запретить доступ к странице одним нажатием кнопки. | |
|
|
|
|
|
|
|
для: itica
(06.03.2006 в 18:32)
| | А запретить кому - всем или какому-то определённому пользователю?
PS Под новые вопросы лучше заводить новые темы. | |
|
|
|
|
|
|
|
для: cheops
(07.03.2006 в 00:53)
| | Всем! | |
|
|
|
|
|
|
|
для: itica
(07.03.2006 в 09:48)
| | Поместить в базу или файл какой-нибудь булевый флаг - если он установлен запрещать доступ при помощи кода
<?php
if(флаг) exit("Доступ к странице закрыт");
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(07.03.2006 в 13:45)
| | Пытался, но что то не получилось, может я делаю не так, если не затруднит дайте фрагмент кода. Или может я вообще неправильно понял :( | |
|
|
|
|
|
|
|
для: itica
(07.03.2006 в 17:42)
| |
if file_exists("warning.txt")
die file_get_contents("warning.txt");
|
В файл warning.txt вписываете текст "Доступ к странице закрыт!" , или любой другой, который будет отражать смысл отлупа. Когда страницу нужно будет отпереть, файл warning.txt просто стираете. | |
|
|
|
|
|
|
|
для: Trianon
(07.03.2006 в 18:47)
| | По мойму этот способ не очень удбен, так как приходится то создавать то удалять файл, чтобы открыть или закрыть доступ. Cheops, Вы предложили использовать некий "булевой" флаг, расскажите пожалуйста о нём по подробнее! | |
|
|
|
|
|
|
|
для: 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 "Доспуп к сайту открыт.";
?>
|
В данном случае этот самый файл (точнее факт его наличия) и является "неким булевым флагом". | |
|
|
|
|
|
|
|
для: itica
(07.03.2006 в 09:48)
| | Кнопкой "Power Off".
:-) | |
|
|
|