0

だから、私はこのクエリを持っています:

$alt_user_result = execute_pdo_query("SELECT U.username, U.user_id, T.last_activity_time
FROM user_skills S, users U
LEFT JOIN user_status T ON U.user_id=T.user_id
WHERE S.user_id=U.user_id and S.task_type_id=? and S.permission='Yes';",
array($tablerow['task_type_id']));

そして、ステータスを表示するために次のようなことをしています:

foreach($alt_user_result as $cur_user) {

 if($cur_user['user_id'] != 1){

   if( (time(date('Y-m-d H:i:s')) - time($cur_user['last_activity_time'])) < 300 ){
    echo "<option value='$cur_user[user_id]'>$cur_user[username] | online</option>";
   }
   else if( (time(date('Y-m-d H:i:s')) - time($cur_user['last_activity_time'])) >300){
    if( (time(date('Y-m-d H:i:s')) - time($cur_user['last_activity_time']))<1800 ) {
     echo "<option value='$cur_user[user_id]'>$cur_user[username] | idle</option>";
    }
   }
   else if( (time(date('Y-m-d H:i:s')) - time($cur_user['last_activity_time']))>1800 ){
     echo "<option value='$cur_user[user_id]'>$cur_user[username] | offline</option>";
   }
  }
  var_dump((time(date('Y-m-d H:i:s')) - time($cur_user['last_activity_time'])));
 }
 echo "<input type='submit' name='reassign' value='Reassign'/></select></form>";
}

私のlast_activity_time表の は :datetimeです。

テーブルからのvar_dump結果はゼロであり、正しくありません。削除するtime()と、時間の違いが表示されますが、time()壊れています。

最後のアクティビティが <= 5 分 => ステータスの場合:オンライン

> 5 分かつ <= 30 ミスの場合 => ステータス: アイドル

> 30 分 => ステータス : オフラインの場合。

私が間違っているのは何ですか?何か案は?

4

4 に答える 4

2

MySQL TIMESTAMPDIFF()CASE関数で解決できます

SELECT * , TIMESTAMPDIFF( 
MINUTE , last_active, NOW( ) ) AS minuteDiff, 
CASE  
WHEN TIMESTAMPDIFF( MINUTE , last_active, NOW( ) ) >30 THEN  'Offline'
WHEN TIMESTAMPDIFF( MINUTE , last_active, NOW( ) ) > 4 THEN  'Idle'
WHEN TIMESTAMPDIFF( MINUTE , last_active, NOW( ) ) THEN  'Online'    
END AS userStatus
FROM tbl_time

userStatus列の状態を確認する

アップデート

注 :画像など、必要なものは何でも使用できます。

上記のクエリの後、以下の方法でphpに表示できます

<select name ="selectName" id ="selectID" > 
foreach($alt_user_result as $cu)
{

    switch($cu['userStatus'])
    {
        case 'Online' :
                        $txt = 'Online';
                        $img = 'images/online.png';
                        break;
        case 'Idle' :
                    $txt = 'Idle';
                    $img = 'images/idle.png';
                    break;
        case 'Offline' :
                    $txt = 'Offline';
                    $img = 'images/offline.png';
                    break;
        default : 
                // here you can set default value
    }

    if($cu['user_id'] != 1) {
      echo "<option value='$cu[user_id]'> $cu['username'] | $txt 
                /*  or you can show respective image */
                | <img src ='$img' alt='$txt' title='$txt'/>
            </option> ";
    } // end of if
} // end of foreach
</select>   
于 2012-08-09T13:24:13.333 に答える
1

2つの日付の違いを取得したい場合は、phpのdateTimeを使用してください。この関数は、結果が正か負かに関係なく、常に差を返すだけで、2つの日付の差を返します。その後、任意の形式で出力できます。

function date_diff($date1,$date2){
    try {
        $d1Object = new DateTime($date1);
        $d2Object = new DateTime($date2);

        $diff = $d1Object->diff($d2Object);
    }

    catch (Exception $e) {
        echo '';
    }
    //this returns the difference in years, e.g.
    //for more info, see php.net dateTime
    return $diff->y;
}
于 2012-08-09T21:18:54.523 に答える
1

ユーザーステータスのSQLクエリを実行しました。その列をループで直接使用できます。if条件は必要ありません。

$alt_user_result = execute_pdo_query("
SELECT U.username, U.user_id, T.last_activity_time,
case 
WHEN TIMESTAMPDIFF( MINUTE, T.last_activity_time ,NOW() ) <= 5 THEN 'online'
WHEN ( TIMESTAMPDIFF( MINUTE, T.last_activity_time ,NOW() ) > 5 AND 
   TIMESTAMPDIFF( MINUTE, T.last_activity_time ,NOW() ) <=30 ) THEN 'idle'
ELSE 'offline' END as user_status   
FROM user_skills S, users U
LEFT JOIN user_status T ON U.user_id=T.user_id
WHERE S.user_id=U.user_id and S.task_type_id=? and S.permission='Yes';",
array($tablerow['task_type_id']));

すなわち

echo "<option value='$cur_user[user_id]'>$cur_user[username] | $cur_user[user_status]</option>";

状態を管理できる画像に変更したい場合。

echo "<option value='$cur_user[user_id]'>$cur_user[username] | ";

if( $cur_user[user_status]=='online') echo "<img src='online.jpg'/>";
else if( $cur_user[user_status]=='idle') echo"<img src='idle.jpg'/>";
else if( $cur_user[user_status]=='offline') echo "<img src='offline.jpg'/>";

echo "</option>";
于 2012-08-09T13:22:38.820 に答える
-1

I don't write PHP, but something along these lines should get you started:

    foreach($alt_user_result as $cur_user) 
    {
        if($cur_user['user_id'] != 1)
        {
            $interval = time(date('Y-m-d H:i:s'))->diff(time($cur_user['last_activity_time']));

            $numSeconds = $interval->s + $interval->m * 60 + $interval->h * 60 * 60 + $interval->d * 60 * 60 * 24;

            $status = "offline";

            if ($numSeconds < 300)
            {
                $status="online";
            }
            else if ($numSeconds < 1800)
            {
                $status="idle";
            }

            echo "<option value='$cur_user[user_id]'>$cur_user[username] | ".$status."</option>";
        }
    }
于 2012-08-09T12:59:45.480 に答える