query("SELECT * FROM online_players ORDER BY login_time DESC")->fetchArray(SQLITE3_ASSOC); $onlinePlayers = []; while ($row = $db->query("SELECT * FROM online_players ORDER BY login_time DESC")->fetchArray(SQLITE3_ASSOC)) { $onlinePlayers[] = $row; } // 重新查询 $stmt = $db->query("SELECT * FROM online_players ORDER BY login_time DESC"); $onlinePlayers = []; while ($row = $stmt->fetchArray(SQLITE3_ASSOC)) { $onlinePlayers[] = $row; } $result['online_players'] = $onlinePlayers; $result['online_players_count'] = count($onlinePlayers); } catch (Exception $e) { $result['online_players_error'] = $e->getMessage(); } // 2. online_player_hb表(心跳) try { $stmt = $db->query("SELECT * FROM online_player_hb"); $hb = $stmt->fetchArray(SQLITE3_ASSOC); $result['heartbeat'] = $hb; if ($hb) { $result['heartbeat_ago'] = time() - (int)$hb['last_seen'] . '秒前'; } } catch (Exception $e) { $result['heartbeat_error'] = $e->getMessage(); } // 3. weblogin_tokens表 try { $stmt = $db->query("SELECT player_name, created_at, expire_seconds, datetime(created_at, 'unixepoch', 'localtime') as created_time FROM weblogin_tokens ORDER BY created_at DESC LIMIT 20"); $tokens = []; while ($row = $stmt->fetchArray(SQLITE3_ASSOC)) { $tokens[] = $row; } $result['weblogin_tokens'] = $tokens; } catch (Exception $e) { $result['tokens_error'] = $e->getMessage(); } // 4. web_session_log表 try { $stmt = $db->query("SELECT player_name, login_time, datetime(login_time, 'unixepoch', 'localtime') as login_time_str FROM web_session_log ORDER BY login_time DESC LIMIT 20"); $sessions = []; while ($row = $stmt->fetchArray(SQLITE3_ASSOC)) { $sessions[] = $row; } $result['web_session_log'] = $sessions; } catch (Exception $e) { $result['sessions_error'] = $e->getMessage(); } // 5. web_login_verified表 try { $stmt = $db->query("SELECT * FROM web_login_verified ORDER BY verified_at DESC LIMIT 20"); $verified = []; while ($row = $stmt->fetchArray(SQLITE3_ASSOC)) { $verified[] = $row; } $result['web_login_verified'] = $verified; } catch (Exception $e) { $result['verified_error'] = $e->getMessage(); } // 6. users表(部分) try { $stmt = $db->query("SELECT player_name, logged_in FROM users LIMIT 20"); $users = []; while ($row = $stmt->fetchArray(SQLITE3_ASSOC)) { $users[] = $row; } $result['users'] = $users; } catch (Exception $e) { $result['users_error'] = $e->getMessage(); } ?>
当前时间:
⚠️ 表为空!没有玩家被标记为游戏中已登录
| 玩家名 | 登录时间 | 时间戳 |
|---|---|---|
| = htmlspecialchars($p['player_name']) ?> | = date('Y-m-d H:i:s', (int)$p['login_time']) ?> | = $p['login_time'] ?> |
总数: = $result['online_players_count'] ?>
上次心跳: = date('Y-m-d H:i:s', (int)$result['heartbeat']['last_seen']) ?> (= $result['heartbeat_ago'] ?>)
120) echo '⚠️ 心跳超过120秒,下次同步时PHP会清空online_players表!
'; elseif ($ago > 60) echo '⚠️ 心跳超过60秒
'; else echo '✅ 心跳正常
'; ?>⚠️ 无心跳记录
⚠️ 无Token记录
| 玩家 | 创建时间 | 有效期(秒) |
|---|---|---|
| = htmlspecialchars($t['player_name']) ?> | = $t['created_time'] ?> | = $t['expire_seconds'] ?> |
⚠️ 无会话记录
| 玩家 | 登录时间 | 时间戳 |
|---|---|---|
| = htmlspecialchars($s['player_name']) ?> | = $s['login_time_str'] ?> | = $s['login_time'] ?> |
⚠️ 无验证记录
| 玩家 | 验证时间 |
|---|---|
| = htmlspecialchars($v['player_name']) ?> | = date('Y-m-d H:i:s', (int)$v['verified_at']) ?> |
⚠️ 无注册玩家
| 玩家名 | logged_in |
|---|---|
| = htmlspecialchars($u['player_name']) ?> | = $u['logged_in'] ? '✅ 已登录' : '❌ 未登录' ?> |
= json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) ?>