-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathget_player_data.php
More file actions
341 lines (284 loc) · 12.7 KB
/
get_player_data.php
File metadata and controls
341 lines (284 loc) · 12.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
<?php
// 提供原始和聚合的player_history数据,供前端图表使用
// 检查是否已安装
if (!file_exists('installed.lock')) {
die(json_encode(array('success' => false, 'error' => '系统尚未安装,请先完成安装设置')));
}
require_once 'config.php';
// 数据库连接类
class Database {
private $conn;
// 构造函数 - 建立数据库连接
public function __construct() {
$this->conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
// 检查连接
if ($this->conn->connect_error) {
die(json_encode(array('success' => false, 'error' => '数据库连接失败: ' . $this->conn->connect_error)));
}
}
// 析构函数 - 关闭数据库连接
public function __destruct() {
if ($this->conn) {
$this->conn->close();
}
}
// 获取服务器的所有历史数据 - 只保留在线人数变化的时间点
public function getPlayerHistory($server_id) {
$sql = "SELECT DATE_FORMAT(record_time, '%Y-%m-%d %H:%i:%s') as time_label,
players_online
FROM player_history
WHERE server_id = ?
ORDER BY record_time ASC";
$stmt = $this->conn->prepare($sql);
if ($stmt === false) {
return array('success' => false, 'error' => '准备SQL语句失败: ' . $this->conn->error);
}
$stmt->bind_param("i", $server_id);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
$data = array();
$labels = array();
$values = array();
if ($result && $result->num_rows > 0) {
$prev_players = null; // 上一条记录的在线人数
$first_record = true; // 是否是第一条记录
$last_time_label = ''; // 最后一条记录的时间标签
$last_players = ''; // 最后一条记录的在线人数
$temp_rows = array(); // 临时存储所有记录
// 先将所有记录存储到临时数组
while ($row = $result->fetch_assoc()) {
$temp_rows[] = $row;
$last_time_label = $row['time_label'];
$last_players = $row['players_online'];
}
// 遍历临时数组,只保留在线人数变化的记录
foreach ($temp_rows as $index => $row) {
$current_players = $row['players_online'];
// 保留第一条记录
if ($first_record) {
$labels[] = $row['time_label'];
$values[] = $current_players;
$prev_players = $current_players;
$first_record = false;
continue;
}
// 如果在线人数发生变化,保留当前记录
if ($current_players != $prev_players) {
$labels[] = $row['time_label'];
$values[] = $current_players;
$prev_players = $current_players;
}
// 确保保留最后一条记录(即使和前一条相同)
else if ($index == count($temp_rows) - 1) {
$labels[] = $row['time_label'];
$values[] = $current_players;
}
}
}
$data['labels'] = $labels;
$data['values'] = $values;
return array('success' => true, 'data' => $data);
}
// 获取服务器的聚合历史数据(按指定时间间隔分组)
public function getAggregatedPlayerHistory($server_id, $interval = 'hour') {
// 根据间隔选择分组格式
switch($interval) {
case 'day':
$time_format = '%Y-%m-%d';
break;
case 'hour':
default:
$time_format = '%Y-%m-%d %H:00:00';
break;
}
$sql = "SELECT DATE_FORMAT(record_time, '$time_format') as time_label,
AVG(players_online) as avg_players
FROM player_history
WHERE server_id = ?
GROUP BY time_label
ORDER BY time_label ASC";
$stmt = $this->conn->prepare($sql);
if ($stmt === false) {
return array('success' => false, 'error' => '准备SQL语句失败: ' . $this->conn->error);
}
$stmt->bind_param("i", $server_id);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
$data = array();
$labels = array();
$values = array();
if ($result && $result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$labels[] = $row['time_label'];
$values[] = round($row['avg_players']);
}
}
$data['labels'] = $labels;
$data['values'] = $values;
return array('success' => true, 'data' => $data);
}
// 获取服务器指定日期的历史数据
public function getPlayerHistoryByDate($server_id, $date) {
// 确保日期格式正确(YYYY-MM-DD)
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) {
return array('success' => false, 'error' => '无效的日期格式,请使用YYYY-MM-DD格式');
}
// 构建SQL查询,筛选指定日期的数据,包含玩家列表
$sql = "SELECT DATE_FORMAT(record_time, '%H:%i:%s') as time_label,
players_online,
player_list_json
FROM player_history
WHERE server_id = ?
AND DATE(record_time) = ?
ORDER BY record_time ASC";
$stmt = $this->conn->prepare($sql);
if ($stmt === false) {
return array('success' => false, 'error' => '准备SQL语句失败: ' . $this->conn->error);
}
$stmt->bind_param("is", $server_id, $date);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
$data = array();
$labels = array();
$values = array();
$playerLists = array();
if ($result && $result->num_rows > 0) {
$prev_players = null; // 上一条记录的在线人数
$first_record = true; // 是否是第一条记录
$last_time_label = ''; // 最后一条记录的时间标签
$last_players = ''; // 最后一条记录的在线人数
$last_player_list = null; // 最后一条记录的玩家列表
$temp_rows = array(); // 临时存储所有记录
// 先将所有记录存储到临时数组
while ($row = $result->fetch_assoc()) {
$temp_rows[] = $row;
$last_time_label = $row['time_label'];
$last_players = $row['players_online'];
$last_player_list = $row['player_list_json'];
}
// 遍历临时数组,只保留在线人数变化的记录
foreach ($temp_rows as $index => $row) {
$current_players = $row['players_online'];
$current_player_list = $row['player_list_json'];
// 保留第一条记录
if ($first_record) {
$labels[] = $row['time_label'];
$values[] = $current_players;
$playerLists[] = $current_player_list;
$prev_players = $current_players;
$first_record = false;
continue;
}
// 如果在线人数发生变化,保留当前记录
if ($current_players != $prev_players) {
$labels[] = $row['time_label'];
$values[] = $current_players;
$playerLists[] = $current_player_list;
$prev_players = $current_players;
}
// 确保保留最后一条记录(即使和前一条相同)
else if ($index == count($temp_rows) - 1) {
$labels[] = $row['time_label'];
$values[] = $current_players;
$playerLists[] = $current_player_list;
}
}
}
$data['labels'] = $labels;
$data['values'] = $values;
$data['playerLists'] = $playerLists; // 添加玩家列表数据
return array('success' => true, 'data' => $data);
}
// 获取服务器的所有历史数据(包含玩家列表)
public function getPlayerHistoryWithPlayerLists($server_id) {
// 构建SQL查询,包含玩家列表
$sql = "SELECT DATE_FORMAT(record_time, '%Y-%m-%d %H:%i:%s') as time_label,
players_online,
player_list_json
FROM player_history
WHERE server_id = ?
ORDER BY record_time ASC";
$stmt = $this->conn->prepare($sql);
if ($stmt === false) {
return array('success' => false, 'error' => '准备SQL语句失败: ' . $this->conn->error);
}
$stmt->bind_param("i", $server_id);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
$data = array();
$labels = array();
$values = array();
$playerLists = array();
if ($result && $result->num_rows > 0) {
$prev_players = null; // 上一条记录的在线人数
$first_record = true; // 是否是第一条记录
$last_time_label = ''; // 最后一条记录的时间标签
$last_players = ''; // 最后一条记录的在线人数
$last_player_list = null; // 最后一条记录的玩家列表
$temp_rows = array(); // 临时存储所有记录
// 先将所有记录存储到临时数组
while ($row = $result->fetch_assoc()) {
$temp_rows[] = $row;
$last_time_label = $row['time_label'];
$last_players = $row['players_online'];
$last_player_list = $row['player_list_json'];
}
// 遍历临时数组,只保留在线人数变化的记录
foreach ($temp_rows as $index => $row) {
$current_players = $row['players_online'];
$current_player_list = $row['player_list_json'];
// 保留第一条记录
if ($first_record) {
$labels[] = $row['time_label'];
$values[] = $current_players;
$playerLists[] = $current_player_list;
$prev_players = $current_players;
$first_record = false;
continue;
}
// 如果在线人数发生变化,保留当前记录
if ($current_players != $prev_players) {
$labels[] = $row['time_label'];
$values[] = $current_players;
$playerLists[] = $current_player_list;
$prev_players = $current_players;
}
// 确保保留最后一条记录(即使和前一条相同)
else if ($index == count($temp_rows) - 1) {
$labels[] = $row['time_label'];
$values[] = $current_players;
$playerLists[] = $current_player_list;
}
}
}
$data['labels'] = $labels;
$data['values'] = $values;
$data['playerLists'] = $playerLists; // 添加玩家列表数据
return array('success' => true, 'data' => $data);
}
}
// 获取请求参数
$server_id = isset($_GET['server_id']) ? intval($_GET['server_id']) : 0;
$view_mode = isset($_GET['view_mode']) ? $_GET['view_mode'] : 'raw'; // 默认为raw
$date = isset($_GET['date']) ? $_GET['date'] : ''; // 日期参数
// 验证参数
if ($server_id <= 0) {
die(json_encode(array('success' => false, 'error' => '无效的服务器ID')));
}
// 创建数据库连接
$db = new Database();
// 根据视图模式获取数据
if ($view_mode === 'date' && !empty($date)) {
// 获取指定日期的数据(包含玩家列表)
$result = $db->getPlayerHistoryByDate($server_id, $date);
} else {
// 默认获取所有原始数据(包含玩家列表)
$result = $db->getPlayerHistoryWithPlayerLists($server_id);
}
// 输出JSON响应
die(json_encode($result));
?>