php项目怎么看两队的历史交锋记录?

wen PHP项目 2

本文目录导读:

php项目怎么看两队的历史交锋记录?

  1. 第一步:数据库设计(前提)
  2. 第二步:PHP 查询逻辑(核心)
  3. 第三步:前端展示(HTML + 简单遍历)

在 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_idaway_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>

  1. 查询条件:一定要用 (home, away) OR (away, home) 这种条件,才能涵盖所有交锋。
  2. 统计逻辑:根据 home_team_id 判断谁是主队,从而计算某队的进球和胜负。
  3. 性能优化:如果数据量很大,可以给 matches 表的 (home_team_id, away_team_id) 加复合索引。
  4. API 化:现代项目通常用 fetch() 调用 PHP 返回 JSON,前端框架(Vue/React)再渲染。

如果你没有现成的 teams 表,可以直接在 matches 表中存球队名称字符串,SQL 里的 JOIN 可以去掉,直接查 home_team_nameaway_team_name 即可。

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