Извеждане на IP и Хост на хората намиращи се на страницата

Ааа, може със сесия - да. То дори може да и зададеш и време в което да е валидна.

Е няма нищо и с coockie става тази работа.
 
То няма много голяма разлик дали ще е с coockie или сесия. Просто за момента бях изключил за сесии-те и съм го направил с бисквитка.

Иначе да може да проверяваш сесията, вместо бисквитката. Същата работа.
 
Е, не си бил изключил за сесиите, защото в предни коментари ги спомена. А при бисквитките има лек недостатък. Представи си, че някой е решил да си спре запазването на бисквитките, какво правим тогава? Информацията май тогава няма да е много точна.
 
Варянта със сесията:

PHP:
<?php
session_start();

mysql_connect('localhost', 'ИМЕ КЪМ БАЗА ДАННИ', 'ПАРОЛА КЪМ БАЗА ДАННИ');
mysql_select_db('cu');


$time=time();

if($_SESSION['sesscheck_t']!=true) {

$_SESSION['sesscheck']=time();

$_SESSION['sesscheck_t']=true;

$ip=htmlspecialchars(addslashes($_SERVER['REMOTE_ADDR']));
$hostname=htmlspecialchars(addslashes(gethostname()));

mysql_query("INSERT INTO `cu`(`ip`,`hostname`,`vreme`) VALUES ('$ip','$hostname', '$time')");



}

if (time() - $_SESSION['sesscheck'] > 300) {
    
    $_SESSION['sesscheck_t']=false;
    
}

$time_check=$time-300; //Трябва да е равно на времето зададено на сесията
mysql_query("DELETE FROM `cu` WHERE vreme<$time_check");


?>




<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body>


<?php
//Да приемем, че това е админ панела.

$online_row=mysql_query("SELECT * FROM `cu` ");

$online_obshto=mysql_num_rows($online_row);
echo "В момента има: ".$online_obshto." гост в сайта<br><br><br>";

while($online=mysql_fetch_assoc($online_row)){

echo "<table border='1'>";
echo "<tr><td>".$online['ip']."</td>";
echo "<td>".stripslashes($online['hostname'])."</td>";
echo "</tr></table>";

}
?>

</body>
</html>
 
Няма нужда от htmlspecialchars и addslashes. А gethostname() го замени с php_uname("n"), за да му работи на неговата версия на PHP.

Проверката на сесията можеш да я правиш и само по така

PHP:
isset($_SESSION['sess_check'])

а при изтриване, не и задавай false, а директно я трий.

PHP:
unset($_SESSION['sess_check']);


Също, няма да е зле, да кажеш на автора да раздели двата кода, защото няма да е приятно всички да виждат "админ мониторинга".


В момента ми се спи и не виждам повече неща, с които да те хвана :D
 
Хах, аз съм вмъкнал едно коментарче за админ панела.

Иначе трябва да се създадът 2 сесии.

Едната приема unixtimestamp където се извършва проверката дали сесията ще е true или false.

Без тази проверка след изтриване на записи от базата данни, сесията ще продължава да е true, ама записи нчма. Следователно отново няма да е точен брояча.
 
Аз съм прочел грешно миналия ти пост. За съвсем друго нещо ти обяснявах... :shock:


Иначе и така може да се проверява прав си. Но аз си проверявам с true и false.

Ами okay, хайде лека нощ.
 
Ето моя вариант, без сесии, без нищо. Чиста база данни

Това е за потребителските страници
PHP:
<?php
header("Content-Type: text/html; charset=UTF-8");

$link = mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db('test', $link) or die(mysql_error());


if(isset($_SERVER['REMOTE_ADDR'])){
	$hostname = php_uname('n');
	$time_diff = time() - 30;
	$check = mysql_query("SELECT * FROM `status` WHERE `user_ip` = '{$_SERVER['REMOTE_ADDR']}'") or die(mysql_error());
	
	if(mysql_num_rows($check) > 0){
		if($row = mysql_fetch_assoc($check)){
			if($row['timestamp'] > $time_diff){
				mysql_query("UPDATE `status` SET `timestamp` = UNIX_TIMESTAMP() WHERE `user_ip` = '{$_SERVER['REMOTE_ADDR']}'") or die(mysql_error());
			}
			else{
				mysql_query("DELETE FROM `status` WHERE `user_ip` = '{$_SERVER['REMOTE_ADDR']}'") or die(mysql_error());
			}
		}
	}
	else{
		mysql_query("INSERT INTO `status`(`id`, `user_ip`, `hostname`, `timestamp`) VALUES ('', '{$_SERVER['REMOTE_ADDR']}', '{$hostname}', UNIX_TIMESTAMP())") or die(mysql_error());
	}
}

?>

А това ти е мониторинга, само си го стилизирай:

PHP:
<?php
header("Content-Type: text/html; charset=UTF-8");

$link = mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db('test', $link) or die(mysql_error());

mysql_query("DELETE FROM `status` WHERE `timestamp` < (UNIX_TIMESTAMP() - 30)") or die(mysql_error());
$query = mysql_query("SELECT * FROM `status`") or die(mysql_error());

if(mysql_num_rows($query) > 0){
	while($row = mysql_fetch_assoc($query)){
		echo "ID: {$row['id']} ---- IP: {$row['user_ip']} ---- HOSTNAME: {$row['hostname']} ---- TIMESTAMP: {$row['timestamp']}<br />";
	}
}
else{
	echo "Няма записи!";
}

?>


В момента е направен да отчита на 30 секунди. В двата кода, там където пише 30 го замени със секундите, които ти е желаеш. 300 секунди са 5 минути, но според мен са много.

Ето ти и таблицата:

[sql]
CREATE TABLE IF NOT EXISTS `status` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_ip` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
`hostname` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`timestamp` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
[/sql]
 
Добре де, voodo не разбрах на моя какво не му работи :idea:

На relaxho кода иам 4 заявки за броене на хората влезнали в сайта.
Представи си 300 човека едновремено са в сайта:
1200 заявки за 30 секунди (тъй като е по ИП и няма друг избор за броене, освен малкото време което трябва да зададе).


Докато при мен има 2 заявки - по оптимизирана и по-точна информация получаваш.
300 човека x 2 =
600 Заявки за 5 минути. (тъй като не се влиаеш от ИП-та и тем подобни)
 

Back
Горе