本文目录导读:

我来帮你创建一个统计脚后跟传球成功的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统计分析功能,包括:
- 基础统计:单球员、单场次的脚后跟传球次数统计
- 团队统计:球队级别的统计与排名
- 实时统计:比赛进行中的实时数据
- 数据导出:详细的传球数据导出
- 灵活查询:支持按时间、球员、球队等条件筛选
你可以根据具体需求调整统计维度,比如增加传球距离分层、比赛场景等更细致的统计指标。