online/offline статус на потребител
Здравейте, туристи! Днес ще се опитам да ви обясня една не толкова трудна функция за определяне online/offline статуса на определен потребител. Тази функция представлява като по сайтовете за запознанства.

Първо нека да направим нужната таблица в базата данни

table.sql

CREATE TABLE `status` (
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`username` varchar(32) NOT NULL,
`timestamp` varchar(255) NOT NULL
);


Така това ни е таблицата, в която ще се записват username и timestamp за сравнение.

Сега постепенно ще ви показвам функцията и ще обяснявам коя част за какво служи. Надявам се обясненията, които ще дам да ги разберете.

Нека в урока сложим функцията в отделен файл, за да може да я викаме от където искаме да ни отчита, че сме онлайн.
Като за пример ще задам име на файла - userstatus.php

userstatus.php

function showUserStatus($logged_user, $name, $timestamp, $timelast, $session = 0)
{

}


Така ето го и задаването на функцията с име showUserStatus, която трябва да приеме 5 параметара. Петия параметър по дефалт си е 0. Защо е 0 ще обясня по-надолу в урока.

Сега нека да обясня и какви стойности приемат:
$logged_user - за стойност приема потребителското име, с което сме се логнали в сайта. За по-удобно аз използвам сесии. Ще видите долу...

$name - приема стойност, или от $_GET, ако се разглежда профила на друг потребител, или същата стойност, която приема $logged_user, ако разглеждате вашия профил.

$timestamp - за стойност приема сегашното време time(), което се взима от index.php(в урока така ще го покажа) при isset($_SESSION['user_logged']). Т.е. ако тази сесия е сетната ще покаже, че сме в акаунта си и така ще получим $timestamp.

$timelast - стойноста на този параметър е сегашното време минус определен период от време, с което по-надолу изчисляваме дали потребителя е онлайн или офлайн. (time()-XX)

$session = 0 - тази стойност по дефалт съм и задал 0, за да може функцията да определи на кой потребител да изчисли статуса. Ако е 0 то ще подразбира, че определен потребител се разглежда от човек, който не е влязъл в акаунта си(на кратко - ГОСТ). Този параметър приема 1 само тогава, когато isset($_SESSION['user_logged']) т.е. приема параметъра, когато потребителя е логнат.

Така това беше за параметрите на функцията сега да пообясним и вътрешностите и :)


$select_time = mysql_query("SELECT * FROM status WHERE username = '".$name."'");
$select = mysql_fetch_array($select_time);


Във функцията правим първо една заявка към сървъра, но нея ще я ползваме по-късно и ще я обясня, когато и дойде времето.

Продължаваме напред...


if($session == 1 && $logged_user == $name)
{ }


След горната заявка идва ред на първото условие, което трябва да създадем. В това условие е казано АКО $session е равно на 1 и $logged_user е равно на $name, то да се случи еди какво си(това еди какво си ще го обясня след това). Както виждате тука се правят проверки с 3 от параметрите на функцията.
Ако $session = 1, това значи, че потребителя е логнат. Ако $logged_user = $name, то значи логнатия потребител разглежда своя профил. Тази проверка е направена, за да неможе като логнатия потребител разгледа на някой потребител, който е офлайн профила да смени статуса му на онлайн.
Ето какво се случва, когато условиете върне TRUE


$select_timestamp = mysql_query("SELECT * FROM status WHERE username = '".$logged_user."'");
if(mysql_num_rows($select_timestamp) == 0)
{
$insert_time = mysql_query("INSERT INTO status(id, username, timestamp) VALUES('', '".$logged_user."', '".$timestamp."')");
}
else
{
$update_time = mysql_query("UPDATE status SET username = '".$logged_user."', timestamp = '".$timestamp."' WHERE username = '".$logged_user."'");
}

$select_time = mysql_query("SELECT * FROM status WHERE username = '".$logged_user."'");
$select = mysql_fetch_array($select_time);

if($select['timestamp'] > $timelast)
{
$status = "Онлайн";
}
else
{
$status = "Офлайн";
$delete_time = mysql_query("DELETE FROM status WHERE timestamp < '".$timelast."' AND username = '".$logged_user."'");
}


Първо прави заявка към MySQL ОТ таблица `status` КЪДЕТO username = $logged_user. Т.е. с тази заявка ше определяме дали има записи за логнатия потребител. За да определим дали има записи ползваме mysql_num_rows(). Ако няма записи за този потребител прави друга заявка, с която вкарва нов ред в базата данни, като добавя потребителското име на логнатия потребител и сегашното време.
Ако има записи за този потребител, то при всяко действие, което направи в сайта ДОКАТО Е ЛОГНАТ ще му се ъпдейтва времето, и така постоянно ще се отчита като онлайн. Но това в следващото условие.
-------
След проверката на записите за логнатия потребител трябва да изкараме сегашното време, което записано към неговото потребителско име. Този път не проверяваме редове, а изчисляваме дали потребителя е онлайн.
Прави се проверка AKO записаното време е по-голямо от $timelast, то значи потребителя е онлайн. Обаче ако условието върне FALSE, т.е., записаното време е по-малко от $timelast то тогава ще изведе, че е офлайн. След дефинирането на статуса при FALSE правим друга заявка, с която трием реда там където timestamp < $timelast И username = $logged_user.

Това беше, ако потребителя разглежда собствения си профил. Сега да продължим надолу...


elseif($session == 1 && $logged_user != $name)
{ }


Ако горното условие е FALSE то тогава ще направи проверка с това условие. Това е, когато логнатия потребител разглежда друг профил, различен от собствения. Вътре в този условен оператор ще използваме първата заявката, която направихме в началото на функцията...


$select_time = mysql_query("SELECT * FROM status WHERE username = '".$name."'");
$select = mysql_fetch_array($select_time);


т.е. имам предвид за тази заявка. Тука вече нямаме нищо сложно, но този път взимаме времето на $name вместо на $logged_name. Демек, взимам времето на друг потребител, който съм избрал.


if($select['timestamp'] > $timelast)
{
$status = "Онлайн";
}
else
{
$status = "Офлайн";
$delete_time = mysql_query("DELETE FROM status WHERE timestamp < '".$timelast."' AND username = '".$name."'");
}


Този път правим проверка дали записаното време на избрания потребител е по-голямо от $timelast. Ако е по-голямо връща, че потребителя е online, ако е по-малко връща, че е offline, след, което трием реда КЪДЕТО timestamp < $timelast И username = $name.

Дойде ред и на последната проверка, която сама по себе си си задава условие.


else
{
if($select['timestamp'] > $timelast)
{
$status = "Онлайн";
}
else
{
$status = "Офлайн";
$delete_time = mysql_query("DELETE FROM status WHERE timestamp < '".$timelast."' AND username = '".$name."'");
}
}


Този else приема за условие $session == 0 или $session != 1. Това условие се включва само тогава, когато се разглежда профила на някой потребител от ГОСТ. Т.е. от потребител, който не си е влязъл в акаунта. Тука стойноста на $select['timestamp'] все взима отново от първата заявка, която направихме. Не мисля, че тука ви трябват обяснения случва се същото като при elseif.

Накрая трябва да върнем резултата с return


return $status;


Е това беше функцията. Сега ще се опитам да ви обясня как да я ползвате.

Така попринцип е хубаво функцията да я дефиниране още в главния файл(файла, в който ви препраща след логин). В случая аз ще ползвам index.php и за пример ще си дефинирам една сесия - $_SESSION['user_logged']. Тази сесия трябва да си я дефинирате при логин $_SESSION['user_logged'] = $_POST['username'].

Така ето го и файла...

index.php

<?php
session_start(); //стартираме сесия за да можете да приемете вашата, която се дефинира от логина
include("config.php"); //тука се предполага, че сте сложили кода за кънект към MySQL
include("userstatus.php"); //викаме си горе-обяснената функция

if(isset($_SESSION['user_logged'])) // правим проверка дали е зададена сесия
{
$timestamp = time();
$session = 1;
//ако е зададена както виждате взимаме $timestamp и $session - което е 1.
}
$timelast = time() - XX;
//извън условния оператор задаваме $timelast(горе съм обяснил за какво е). Тези XX са определен период
//от време за сравнение дали потребителя е online/offline. Извън таговете за код ще обясня по-подробно

showUserStatus($_SESSION['user_logged'], $_SESSION['user_logged'], $timestamp, $timelast, $session);
/*Както виждате тука само дефинираме стойности на функцията, но не я извеждаме. Това се прави там, от където искате да Ви отчете като онлайн. Ако го сложите в друг файл, чак като го отворите, чак тогава ще ви отчете като онлайн. За това и по-горе съм писал, че е най-добре в главния файл да се дефинира функцията*/

//сега за пример ще задам и друг файл - profile.php за ви покажа за какво става въпрос
?>
<a href="?p=profile&u=<?php echo $_SESSION['user_logged']; ?>">Профил</a>
<div>
<?php
switch($_GET['p'])
{
case "profile":
include("profile.php");
break;

//тука можете да добавите още линкове. Обаче ако не правите отварянето на страниците по този начин
//тогава във всеки файл ще трябва да дефинирате функцията
}
?>
</div>


Така този линк, който направих ще отвори вашия профил. Ще отвори файла в дива под него.

Сега да обясня и за $timelast по-подробно, след, което ще покажа един кратък пример за profile.php.
$timelast както съм казал и по-нагоре приема сегашното време минус определн период от време. Примерно сте задали 60*30 за перион. Това е 30 минути. Ако потребителя през тези 30 минути не прави действия в сайта ДОКАТО Е НА ЛИНИЯ то след изтичането им ще отчете потребителя като офлайн. Докато прави действия(отваря страници в сайта) то тогава времето в базата данни постоянно се променя и така ще го отчита винаги онлайн.

Ето ви сега и краткия пример за profile.php

profile.php

<?php
session_start(); // стартираме сесия за можем да вземем сесията на потребителя

$u = $_GET['u']; //ако забелязахте в index.php на линка съм задал &u=USERNAME

//ето го и реда за извеждане на статуса
echo showUserStatus($_SESSION['user_logged'], $u, $timestamp, $timelast, $session);
?>


Така правите ако в index.php линковете ви се отварят както съм показал. Ако се отварят по-отделен файл то ще стане така... В index.php си го оставяте така както само си променяте линковете на пълен адрес(Пример: profile.php?u=$_SESSION['user_logged'])

Примерен файл - file.php

<?php
session_start();
include("config.php");
include("userstatus.php");

if(isset($_SESSION['user_logged']))
{
$timestamp = time();
$session = 1;
}
$timelast = time() - XX;
showUserStatus($_SESSION['user_logged'], $_SESSION['user_logged'], $timestamp, $timelast, $session);
//и тука вашия код

?>


Това трябва да съдържа всеки файл за да ви отчита постоянно онлайн.



Урока е авторски и забранявам преписването му в други сайтове!

Урока е писан специално за web-tourist.

Надявам се да харесате урока, и разберете това, което съм писал.
Също се надявам да оцените това, че се постарах да напиша отново урока, понеже първия път се бъгна сайта.

Демо немога да дам защото няма как да симулирам потребители.
А за по-мързеливите, които ги мързи да копират 5 реда код - КЛИК





/ Трябва да сте регистриран за да напишете коментар /
От: sekul79
21:25 02-11-2009
БРАВО за всеки по нещо 10х
От: zSix
11:24 09-11-2009
Работи идеално... благодаря ти много за урока. Имам само е въпрос:

Примерно как мога да изведа преди колко време е изтекла сесията на даден потребител. В смисъл да показва преди колко време е бил онлайн.

Поздрави.
От: relax15pyt
22:12 05-06-2010
@zSix за целта ще трябва да се променят някои работи. За да искараш от колко време е офлайн потребителя ще трябва да се махнат редовете, където се трие реда и вместо това трябва да се направи следното

$select['timestamp'] - $timelast

за да ти покаже от колко време потребителя е извън линия. И примерно си го правиш на променлива

$sessionTime = $select['timestamp'] - $timelast;
От: relax15pyt
22:13 05-06-2010
ам имам предвид да се изтрие реда, където е заявката за триене на реда от базата данни.
От: botevis2
20:15 03-01-2013
По кратък вариянт няма ли
1