本文目录导读:

在 PHP 项目中查看两队的历史交锋记录,通常意味着你要从数据库中查询数据,并在前端(网页/API)展示,这取决于你的数据是如何存储的。
以下是完整的实现思路和代码示例,覆盖了数据库设计、PHP 查询、数据展示三个核心环节。
第一步:数据库设计(前提)
你需要一个存储比赛结果的数据表,假设有一张 matches 表:
-- 示例表结构
CREATE TABLE matches (
id INT AUTO_INCREMENT PRIMARY KEY,
home_team_id INT NOT NULL, -- 主队ID
away_team_id INT NOT NULL, -- 客队ID
home_score INT NOT NULL, -- 主队进球
away_score INT NOT NULL, -- 客队进球
match_date DATE NOT NULL, -- 比赛日期
competition VARCHAR(100) -- 赛事名称(英超、欧冠等)
);
你通常还会有一张 teams 表存储球队名称。
CREATE TABLE teams (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
第二步:PHP 查询逻辑(核心)
这里的难点在于:如何查出“A队 和 B队” 之间的所有比赛,无论 A 队是主场还是客场。
假设你在 URL 中传入了两个球队的 ID(?team1=1&team2=2),PHP 代码如下:
<?php
// 1. 获取参数(假设从 GET 请求获取)
$teamId1 = isset($_GET['team1']) ? (int)$_GET['team1'] : 0;
$teamId2 = isset($_GET['team2']) ? (int)$_GET['team2'] : 0;
if ($teamId1 <= 0 || $teamId2 <= 0) {
die('无效的球队ID');
}
// 2. 数据库连接(使用 PDO 示例)
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'root', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 3. 核心 SQL 查询
// 条件:两队在比赛中相遇(无论主客)
// 同时将球队ID映射为球队名称(使用 LEFT JOIN)
$sql = "
SELECT
m.id,
m.match_date,
m.home_score,
m.away_score,
m.competition,
ht.name AS home_team_name,
at.name AS away_team_name
FROM matches m
INNER JOIN teams ht ON m.home_team_id = ht.id
INNER JOIN teams at ON m.away_team_id = at.id
WHERE
(m.home_team_id = :team1 AND m.away_team_id = :team2)
OR
(m.home_team_id = :team2 AND m.away_team_id = :team1)
ORDER BY m.match_date DESC -- 按时间倒序,最新的在前面
";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':team1' => $teamId1,
':team2' => $teamId2
]);
$headToHeadMatches = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 4. 统计信息(胜负平)
$stats = [
'team1_wins' => 0, // 队1 胜
'draws' => 0, // 平局
'team2_wins' => 0, // 队2 胜
'total_goals' => 0, // 总进球
];
foreach ($headToHeadMatches as $match) {
// 判断哪边是队1,哪边是队2
$isTeam1Home = ($match['home_team_name'] == getTeamNameById($pdo, $teamId1)); // 简化判断,实际应用中最好用ID判断
// 更严谨的判断(根据返回的ID,但这里没查ID,可以调整SQL)
// 我们先简单通过名称判断,或者你在SQL里直接返回home_team_id
// ...
// 为简化,这里假设我们判断 $match['home_team_id'] == $teamId1 (需要SQL返回ID)
// 实际建议:将 m.home_team_id 和 m.away_team_id 也 SELECT 出来
}
更好的做法(推荐):上面的统计逻辑混乱,建议把 home_team_id 和 away_team_id 字段也查出来,这样统计非常清晰。
优化后的完整 PHP 代码(推荐)
<?php
// 前端传参示例: /history.php?team1=1&team2=2
$team1 = (int)($_GET['team1'] ?? 0);
$team2 = (int)($_GET['team2'] ?? 0);
if (!$team1 || !$team2) {
echo json_encode(['error' => '缺少参数']);
exit;
}
// 连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=football', 'root', 'password');
// ---------- 1. 获取球队名称(仅用于展示) ----------
$stmt = $pdo->prepare("SELECT id, name FROM teams WHERE id IN (?, ?)");
$stmt->execute([$team1, $team2]);
$teams = $stmt->fetchAll(PDO::FETCH_KEY_PAIR); // 结果为 [id => name]
// ---------- 2. 获取全部交锋记录(包含主客场ID,便于判断) ----------
$sql = "
SELECT
m.id,
m.match_date,
m.home_team_id,
m.away_team_id,
m.home_score,
m.away_score,
m.competition,
ht.name AS home_name,
at.name AS away_name
FROM matches m
INNER JOIN teams ht ON m.home_team_id = ht.id
INNER JOIN teams at ON m.away_team_id = at.id
WHERE
(m.home_team_id = ? AND m.away_team_id = ?)
OR
(m.home_team_id = ? AND m.away_team_id = ?)
ORDER BY m.match_date DESC
";
$stmt = $pdo->prepare($sql);
$stmt->execute([$team1, $team2, $team2, $team1]);
$records = $stmt->fetchAll(PDO::FETCH_ASSOC);
// ---------- 3. 统计数据 ----------
$stats = [
'team1' => ['id' => $team1, 'name' => $teams[$team1], 'wins' => 0, 'goals_for' => 0, 'goals_against' => 0],
'team2' => ['id' => $team2, 'name' => $teams[$team2], 'wins' => 0, 'goals_for' => 0, 'goals_against' => 0],
'draws' => 0,
'total_matches' => count($records)
];
foreach ($records as $match) {
$isTeam1Home = ($match['home_team_id'] == $team1);
// 确定Team1的进球和失球
if ($isTeam1Home) {
$team1_goals = $match['home_score'];
$team1_conceded = $match['away_score'];
} else {
$team1_goals = $match['away_score'];
$team1_conceded = $match['home_score'];
}
// 累加进球
$stats['team1']['goals_for'] += $team1_goals;
$stats['team1']['goals_against'] += $team1_conceded;
$stats['team2']['goals_for'] += $team1_conceded;
$stats['team2']['goals_against'] += $team1_goals;
// 判定胜负平
if ($team1_goals > $team1_conceded) {
$stats['team1']['wins']++;
} elseif ($team1_goals == $team1_conceded) {
$stats['draws']++;
} else {
$stats['team2']['wins']++;
}
}
// ---------- 4. 输出 JSON(前端可用 AJAX 传输) ----------
header('Content-Type: application/json');
echo json_encode([
'stats' => $stats,
'matches' => $records // 每条包含日期、比分、赛事等
]);
第三步:前端展示(HTML + 简单遍历)
如果你不用 API,直接渲染在 PHP 页面中:
<!DOCTYPE html>
<html>
<head><title>历史交锋</title></head>
<body>
<h2><?= htmlspecialchars($teams[$team1]) ?> vs <?= htmlspecialchars($teams[$team2]) ?></h2>
<!-- 统计概览 -->
<div>
<h3>交锋统计</h3>
<p><?= $stats['team1']['name'] ?> 胜: <strong><?= $stats['team1']['wins'] ?></strong></p>
<p>平局: <strong><?= $stats['draws'] ?></strong></p>
<p><?= $stats['team2']['name'] ?> 胜: <strong><?= $stats['team2']['wins'] ?></strong></p>
<p>总进球: <?= $stats['team1']['goals_for'] + $stats['team2']['goals_for'] ?></p>
</div>
<!-- 历史比赛列表 -->
<h3>历史比赛</h3>
<table border="1">
<tr>
<th>日期</th>
<th>主队</th>
<th>比分</th>
<th>客队</th>
<th>赛事</th>
</tr>
<?php foreach ($records as $match): ?>
<tr>
<td><?= $match['match_date'] ?></td>
<td><?= htmlspecialchars($match['home_name']) ?></td>
<td><?= $match['home_score'] ?> - <?= $match['away_score'] ?></td>
<td><?= htmlspecialchars($match['away_name']) ?></td>
<td><?= htmlspecialchars($match['competition']) ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
- 查询条件:一定要用
(home, away) OR (away, home)这种条件,才能涵盖所有交锋。 - 统计逻辑:根据
home_team_id判断谁是主队,从而计算某队的进球和胜负。 - 性能优化:如果数据量很大,可以给
matches表的(home_team_id, away_team_id)加复合索引。 - API 化:现代项目通常用
fetch()调用 PHP 返回 JSON,前端框架(Vue/React)再渲染。
如果你没有现成的 teams 表,可以直接在 matches 表中存球队名称字符串,SQL 里的 JOIN 可以去掉,直接查 home_team_name 和 away_team_name 即可。