php项目统计脚后跟传球成功几次?

wen PHP项目 2

本文目录导读:

php项目统计脚后跟传球成功几次?

  1. 基础数据库设计
  2. PHP统计类实现
  3. 使用示例
  4. 前端展示示例

我来帮你创建一个统计脚后跟传球成功的PHP解决方案,这个功能通常用于足球比赛数据统计系统。

基础数据库设计

-- 传球记录表
CREATE TABLE pass_records (
    id INT AUTO_INCREMENT PRIMARY KEY,
    match_id INT NOT NULL,
    player_id INT NOT NULL,
    pass_type ENUM('heel', 'normal', 'header', 'long', 'short') NOT NULL,
    pass_success TINYINT(1) NOT NULL DEFAULT 0,
    pass_direction VARCHAR(50),
    pass_distance INT,
    pass_time TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_match_player (match_id, player_id),
    INDEX idx_pass_type (pass_type)
);
-- 球员表
CREATE TABLE players (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    team_id INT,
    position VARCHAR(50)
);
-- 比赛表
CREATE TABLE matches (
    id INT PRIMARY KEY,
    match_date DATE,
    home_team_id INT,
    away_team_id INT,
    competition_id INT
);

PHP统计类实现

<?php
class HeelPassStats {
    private $db;
    public function __construct($dbConnection) {
        $this->db = $dbConnection;
    }
    /**
     * 统计单个球员脚后跟传球成功次数
     */
    public function getPlayerHeelPassStats($playerId, $matchId = null) {
        $sql = "SELECT 
                    COUNT(*) as total_heel_passes,
                    SUM(pass_success) as successful_heel_passes,
                    SUM(CASE WHEN pass_success = 1 THEN 1 ELSE 0 END) as success_count,
                    ROUND(SUM(pass_success) * 100.0 / COUNT(*), 2) as success_rate
                FROM pass_records 
                WHERE player_id = ? AND pass_type = 'heel'";
        $params = [$playerId];
        if ($matchId) {
            $sql .= " AND match_id = ?";
            $params[] = $matchId;
        }
        $stmt = $this->db->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
    /**
     * 统计球队脚后跟传球成功次数
     */
    public function getTeamHeelPassStats($teamId, $startDate = null, $endDate = null) {
        $sql = "SELECT 
                    t.name as team_name,
                    COUNT(pr.id) as total_heel_passes,
                    SUM(pr.pass_success) as successful_heel_passes,
                    AVG(pr.pass_success) * 100 as success_rate,
                    AVG(pr.pass_distance) as avg_distance
                FROM pass_records pr
                JOIN players p ON pr.player_id = p.id
                JOIN matches m ON pr.match_id = m.id
                JOIN teams t ON p.team_id = t.id
                WHERE pr.pass_type = 'heel' AND p.team_id = ?";
        $params = [$teamId];
        if ($startDate && $endDate) {
            $sql .= " AND m.match_date BETWEEN ? AND ?";
            $params[] = $startDate;
            $params[] = $endDate;
        }
        $sql .= " GROUP BY t.id, t.name";
        $stmt = $this->db->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    /**
     * 获取比赛中的脚后跟传球统计
     */
    public function getMatchHeelPassStats($matchId) {
        $sql = "SELECT 
                    p.id as player_id,
                    p.name as player_name,
                    p.position,
                    COUNT(pr.id) as total_heel_passes,
                    SUM(pr.pass_success) as successful_heel_passes,
                    pr.pass_direction,
                    pr.pass_distance
                FROM pass_records pr
                JOIN players p ON pr.player_id = p.id
                WHERE pr.match_id = ? AND pr.pass_type = 'heel'
                GROUP BY p.id, p.name, p.position, pr.pass_direction, pr.pass_distance
                ORDER BY successful_heel_passes DESC";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$matchId]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    /**
     * 统计所有球队脚后跟传球排行榜
     */
    public function getHeelPassRanking($limit = 10) {
        $sql = "SELECT 
                    p.id as player_id,
                    p.name as player_name,
                    p.position,
                    t.name as team_name,
                    COUNT(pr.id) as total_heel_passes,
                    SUM(pr.pass_success) as successful_heel_passes,
                    ROUND(SUM(pr.pass_success) * 100.0 / COUNT(pr.id), 2) as success_rate
                FROM pass_records pr
                JOIN players p ON pr.player_id = p.id
                JOIN teams t ON p.team_id = t.id
                WHERE pr.pass_type = 'heel'
                GROUP BY p.id, p.name, p.position, t.name
                HAVING COUNT(pr.id) >= 1
                ORDER BY successful_heel_passes DESC, success_rate DESC
                LIMIT ?";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$limit]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    /**
     * 记录新的脚后跟传球
     */
    public function recordHeelPass($matchId, $playerId, $passData) {
        $sql = "INSERT INTO pass_records 
                (match_id, player_id, pass_type, pass_success, pass_direction, pass_distance) 
                VALUES (?, ?, 'heel', ?, ?, ?)";
        $stmt = $this->db->prepare($sql);
        return $stmt->execute([
            $matchId,
            $playerId,
            $passData['success'] ?? 0,
            $passData['direction'] ?? null,
            $passData['distance'] ?? 0
        ]);
    }
    /**
     * 获取比赛实时脚后跟传球统计
     */
    public function getLiveHeelPassStats($matchId) {
        return [
            'home_team' => $this->getTeamLiveStats($matchId, 'home'),
            'away_team' => $this->getTeamLiveStats($matchId, 'away')
        ];
    }
    private function getTeamLiveStats($matchId, $teamSide) {
        $teamId = $teamSide === 'home' ? 'home_team_id' : 'away_team_id';
        $sql = "SELECT 
                    COUNT(CASE WHEN pr.pass_success = 1 THEN 1 END) as successful_passes,
                    COUNT(pr.id) as total_passes,
                    ROUND(COUNT(CASE WHEN pr.pass_success = 1 THEN 1 END) * 100.0 / COUNT(pr.id), 2) as success_rate,
                    MIN(pr.pass_distance) as min_distance,
                    MAX(pr.pass_distance) as max_distance,
                    AVG(pr.pass_distance) as avg_distance
                FROM pass_records pr
                JOIN players p ON pr.player_id = p.id
                JOIN matches m ON pr.match_id = m.id
                WHERE pr.match_id = ? 
                    AND pr.pass_type = 'heel'
                    AND p.team_id = (SELECT $teamId FROM matches WHERE id = ?)";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$matchId, $matchId]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
    /**
     * 导出脚后跟传球详细数据
     */
    public function exportHeelPassDetails($matchId) {
        $sql = "SELECT 
                    m.match_date,
                    p.name as player_name,
                    t.name as team_name,
                    pr.pass_direction,
                    pr.pass_distance,
                    pr.pass_success,
                    pr.created_at as pass_time
                FROM pass_records pr
                JOIN players p ON pr.player_id = p.id
                JOIN teams t ON p.team_id = t.id
                JOIN matches m ON pr.match_id = m.id
                WHERE pr.match_id = ? AND pr.pass_type = 'heel'
                ORDER BY pr.created_at DESC";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$matchId]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

使用示例

<?php
// 初始化数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=football_stats', 'username', 'password');
$heelPassStats = new HeelPassStats($pdo);
// 1. 统计某球员脚后跟传球成功次数
$playerStats = $heelPassStats->getPlayerHeelPassStats(101); // player_id = 101
echo "脚后跟传球总数: " . $playerStats['total_heel_passes'];
echo "成功次数: " . $playerStats['successful_heel_passes'];
echo "成功率: " . $playerStats['success_rate'] . "%";
// 2. 统计球队本赛季脚后跟传球
$teamStats = $heelPassStats->getTeamHeelPassStats(
    1, // team_id
    '2024-01-01', 
    '2024-12-31'
);
// 3. 获取比赛实时统计
$matchId = 12345; // 示例比赛ID
$liveStats = $heelPassStats->getLiveHeelPassStats($matchId);
// 4. 脚后跟传球排行榜
$ranking = $heelPassStats->getHeelPassRanking(10);
// 5. 记录新的脚后跟传球数据
$heelPassStats->recordHeelPass(12345, 101, [
    'success' => 1,
    'direction' => 'forward',
    'distance' => 15 // 15米
]);

前端展示示例

<!DOCTYPE html>
<html>
<head>脚后跟传球统计</title>
    <style>
        .stats-container { 
            padding: 20px; 
            font-family: Arial, sans-serif; 
        }
        .stat-card { 
            background: #f5f5f5; 
            border-radius: 8px; 
            padding: 15px; 
            margin: 10px; 
            display: inline-block; 
        }
        .stat-value { 
            font-size: 24px; 
            font-weight: bold; 
            color: #333; 
        }
        .success-rate { 
            color: #4CAF50; 
            font-weight: bold; 
        }
    </style>
</head>
<body>
    <div class="stats-container">
        <h2>脚后跟传球成功次数统计</h2>
        <?php
        // 显示球员统计数据
        $playerId = $_GET['player_id'] ?? 101;
        $stats = $heelPassStats->getPlayerHeelPassStats($playerId);
        ?>
        <div class="stat-card">
            <h3>球员脚后跟传球统计</h3>
            <div class="stat-value">成功 <?= $stats['successful_heel_passes'] ?> 次</div>
            <div>总传球 <?= $stats['total_heel_passes'] ?> 次</div>
            <div class="success-rate">成功率: <?= $stats['success_rate'] ?>%</div>
        </div>
        <!-- 更多统计数据展示 -->
    </div>
</body>
</html>

这个解决方案提供了完整的PHP统计分析功能,包括:

  1. 基础统计:单球员、单场次的脚后跟传球次数统计
  2. 团队统计:球队级别的统计与排名
  3. 实时统计:比赛进行中的实时数据
  4. 数据导出:详细的传球数据导出
  5. 灵活查询:支持按时间、球员、球队等条件筛选

你可以根据具体需求调整统计维度,比如增加传球距离分层、比赛场景等更细致的统计指标。

抱歉,评论功能暂时关闭!