PHP项目统计"假动作晃过防守"次数方案
你这个问题有点模糊——"假动作晃过防守"听起来像体育类项目(篮球/足球)的需求,但也可能是个比喻,我先按最可能的两种场景给你方案,你可以确认一下。

体育赛事/训练数据统计系统
如果是篮球/足球类项目,需要统计球员"假动作晃过防守"的次数:
数据库设计
-- 球员表
CREATE TABLE players (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
team_id INT
);
-- 比赛表
CREATE TABLE matches (
id INT PRIMARY KEY AUTO_INCREMENT,
match_date DATE,
home_team_id INT,
away_team_id INT
);
-- 动作记录表(核心)
CREATE TABLE action_records (
id INT PRIMARY KEY AUTO_INCREMENT,
match_id INT NOT NULL,
player_id INT NOT NULL,
action_type ENUM('fake_dribble','crossover','spin_move','step_back','fake_shot') NOT NULL,
is_successful TINYINT(1) DEFAULT 0 COMMENT '是否晃过防守',
defender_id INT COMMENT '被晃过的防守球员',
minute INT COMMENT '发生时间(分钟)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_player_action (player_id, action_type),
INDEX idx_match (match_id)
);
统计查询
-- 单个球员晃过防守总次数
SELECT
p.name,
COUNT(*) AS total_fake_moves,
SUM(a.is_successful) AS successful_beats,
ROUND(SUM(a.is_successful) / COUNT(*) * 100, 2) AS success_rate
FROM action_records a
JOIN players p ON a.player_id = p.id
WHERE a.action_type IN ('fake_dribble','crossover','spin_move','step_back','fake_shot')
GROUP BY a.player_id
ORDER BY successful_beats DESC;
-- 某场比赛某球员的详细统计
SELECT
action_type,
COUNT(*) AS attempts,
SUM(is_successful) AS success_count
FROM action_records
WHERE match_id = ? AND player_id = ?
GROUP BY action_type;
PHP 实现(PDO)
<?php
class FakeMoveStats {
private PDO $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
/** 记录一次假动作 */
public function record(int $matchId, int $playerId, string $type, bool $success, ?int $defenderId = null): void {
$stmt = $this->pdo->prepare(
"INSERT INTO action_records (match_id, player_id, action_type, is_successful, defender_id)
VALUES (?, ?, ?, ?, ?)"
);
$stmt->execute([$matchId, $playerId, $type, (int)$success, $defenderId]);
}
/** 统计球员晃过防守次数 */
public function getBeatCount(int $playerId): array {
$stmt = $this->pdo->prepare(
"SELECT
COUNT(*) AS attempts,
SUM(is_successful) AS beats,
ROUND(SUM(is_successful)/COUNT(*)*100, 2) AS rate
FROM action_records
WHERE player_id = ? AND is_successful = 1"
);
$stmt->execute([$playerId]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
/** 排行榜 */
public function leaderboard(int $limit = 10): array {
$stmt = $this->pdo->prepare(
"SELECT p.name, SUM(a.is_successful) AS beats
FROM action_records a JOIN players p ON a.player_id = p.id
GROUP BY a.player_id ORDER BY beats DESC LIMIT ?"
);
$stmt->bindValue(1, $limit, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
如果是"假动作"作为比喻(比如营销、游戏、测试中的"障眼法")
那我需要你补充:
- 这个"假动作"具体指什么业务动作?
- "防守"指什么?对手?风控?测试用例?
- "晃过"的判定标准是什么?
请确认
为了给你更精准的代码,请告诉我:
- [ ] 是体育类项目吗?具体篮球还是足球?
- [ ] 数据来源是人工录入、视频AI识别、还是传感器?
- [ ] 需要实时统计还是赛后报表?
- [ ] 有没有多维度需求(按比赛/赛季/对手/位置)?
告诉我这几点,我可以直接给你可运行的完整 PHP 模块。