Проверьте, находится ли пользователь в сети на PHP: что я здесь делаю неправильно?

function checkUserStatus($uid) {
 $q = "select last_activity from signup_and_login_table where id='$uid' LIMIT 1";
 $link=mysql_connect("localhost","mydbusr","mydbpass");
 mysql_select_db("mymaindb",$link);
 $ros=mysql_query($q,$link);
 while($row=mysql_fetch_array($ros))
 {
 $last_activity = $row['last_activity'];
 if (strtotime(date('Y-m-d H:i:s')) > strtotime($last_activity) + 30 ) {
 return false;
 } else {
 return true;
 }
 }
}

Я обновляю значение last_activity на mysql каждый раз, когда пользователь обновляет страницу или выполняет другое действие.

Почему функция выше всегда возвращает true и никогда не возвращает false, даже если разница во времени между last_activity и now() превышает 30 секунд?

Время в mysql представлено в таком формате: 2014-05-02 07:44:55

Любые намеки будут высоко оценены

3 ответа

Если вы хотите использовать "while Loop", вы должны использовать функцию mysql_fetch_assoc() следующим образом:

function checkUserStatus($uid) {
 $q = "select last_activity from signup_and_login_table where id='$uid'";
 $link=mysql_connect("localhost","mydbusr","mydbpass");
 mysql_select_db("mymaindb",$link);
 $ros=mysql_query($q,$link);
 while($row=mysql_fetch_assoc($ros))
 {
 $last_activity = $row['last_activity'];
 if (strtotime(date('Y-m-d H:i:s')) > strtotime($last_activity) + 30 ) {
 return false;
 } else {
 return true;
 }
 }
}

ИЛИ вы можете попробовать без цикла:

function checkUserStatus($uid) {
 $q = "select last_activity from signup_and_login_table where id='$uid' LIMIT 1";
 $link=mysql_connect("localhost","mydbusr","mydbpass");
 mysql_select_db("mymaindb",$link);
 $ros=mysql_query($q,$link);
 $row = mysql_fetch_assoc($ros);
 $last_activity = $row['last_activity'];
 if (strtotime(date('Y-m-d H:i:s')) > strtotime($last_activity) + 30 ) {
 return false;
 } else {
 return true;
 }
}


Вы должны изменить его на:

function checkUserStatus($uid) {

$q = "select last_activity from signup_and_login_table where id='$uid' ORDER BY last_activity DESC LIMIT 1";
$link=mysql_connect("localhost","mydbusr","mydbpass");
 mysql_select_db("mymaindb",$link);
$ros=mysql_query($q,$link);
$row=mysql_fetch_array($ros);

 $last_activity = $row['last_activity'];
 if (strtotime(date('Y-m-d H:i:s')) > strtotime($last_activity) + 30 ) {
 return false;
 } else {
 return true;
 }

}

Вы можете выбрать только 1 запись, но заказать ее по last_activity DESC и просто сравнить ее с текущим временем


Гораздо лучше использовать функции mysqli_*.

function checkUserStatus($uid) {
 $q = "select last_activity from signup_and_login_table where id='$uid' LIMIT 1";
 $link = mysqli_connect("localhost","mydbusr","mydbpass");
 mysqli_select_db("mymaindb",$link);

 $res = mysqli_query($link, $q);
 $row = mysqli_fetch_num($res);//this function returns the result in a numeric array

 return time() > strtotime($row[0]) + 30;
}

licensed under cc by-sa 3.0 with attribution.