メモブログ

やったことを少しでも残すブログです

NFLの試合結果を記録するページと結果を表示するページを作成した

NFLの試合結果を記録するページと結果を表示するページを作成した。2023年のNFLも全力で楽しむために!
(Week 1 が終わったが・・・ロジャースさん。。。マジかよ。。。推しチームの危機っす。。。早くも。。。)

NFLのファンである私は、同一週に複数の試合を見て楽しんでいる。
好きなチームの試合も観るが、勢いのあるチーム、連勝が続いているチームの試合を見たい。そのため、試合結果を確認する必要がある。
しかしながら、公式ページを見てしまうと、既に今週の試合結果も載ってしまっていることが多く、自分のペースで試合結果を記録したかった。
(迂闊にFacebookを開いたり、公式ページを開くと直ぐに結果が見れてしまうため、興ざめてしまう...)

NFLの試合結果を入力し、SQL文を生成するページを作成!

APIで結果を取得したかったが、公式の無料APIは無く、パートナー契約をする必要があったので断念。スクレイピングをやれば出来るじゃ?っとも思ったが、上手くいかず、時間もなかったので断念。
クラウド環境においてそのままDBに挿入させても良かったが、セキュリティをつける必要があり(一応)、時間的に余裕が無いのでローカルでSQL文を生成 -> コピペで挿入。っという方法を採用。


構成

工夫したところ

  • 32チームの結果を手動入力するため、入力ミスを出来るだけ減らしたかった。
  • そのため、選択したチームは値リストから減らし、HTMLの要素を再生成する方法を取った。

コーディング

  • Map を使ってリストを作成し、値リストを生成する
let teamList = new Map()
teamList.set("SF", "49ers");
teamList.set("CHI", "Bears");
teamList.set("CIN", "Bengals");
teamList.set("BUF", "Bills");
teamList.set("DEN", "Broncos");
teamList.set("CLE", "Browns");
teamList.set("TB", "Buccaneers");
teamList.set("ARI", "Cardinals");
  • 選択したチームをリストから削除し、selectの要素を再生成する
function recreateSelectValues(caller) {
    let winner = document.getElementById("winner");
    let loser = document.getElementById("loser");
    
    let draw1 =document.getElementById("draw1");
    let draw2 = document.getElementById("draw2");

    let byeWeek = document.getElementById("byeWeek");
    
    if (caller === "winORlose") {
        // remove win team and lose team from map
        teamList.delete(winner.value);
        teamList.delete(loser.value);
    } else if (caller === "byWeek") {
        // remove bye week from map
        teamList.delete(byeWeek.value);   
    } else if (caller === "draw") {
        // remove draw teams from map
        teamList.delete(draw1.value);
        teamList.delete(draw2.value); 
    }

    
    // 
    let currenWinterTean = winner.childElementCount;
    for (let i = 0; i < currenWinterTean; i++) {
        winner.children[0].remove();
        // console.log(i);
    }

    let currenLoserTean = loser.childElementCount;
    for (let i = 0; i < currenLoserTean; i++) {
        loser.children[0].remove();
    }

    let currenDraw1Tean = draw1.childElementCount;
    for (let i = 0; i < currenDraw1Tean; i++) {
        draw1.children[0].remove();
    }

    let currenDraw2Tean = draw2.childElementCount;
    for (let i = 0; i < currenDraw2Tean; i++) {
        draw2.children[0].remove();
    }


    let currenTean = byeWeek.childElementCount;
    for (let i = 0; i < currenTean; i++) {
        byeWeek.children[0].remove();
        // console.log(i);
    }

    // generate team values again.
    generateTeamsValues();
}

-- select 要素の子要素を再生成する
function generateTeamsValues() {
    teamList.forEach(function (value, key, teamList) {
        let op = document.createElement("option");
        op.value = key;  
        op.text =value;   
        op.className = "teamList";
        document.getElementById("winner").appendChild(op);
    })
.....

試合結果を各ディビジョン毎に表示させるページを作成!!

phpmySQL にアクセスして取得する。
もう少し、weekが進んだら画面ショットを張る予定。

開発環境

  • XAMMP.
  • Apacheのデフォルトの設定では、 xampp -> htdocs 以下にファイルを置く必要あったので、こちらにディレクトリを作成し、コーディングして行った。
  • エディタは、Visial Stadio Codeを採用。

本番環境

mySQLでは、SQL結果セットをクローズしないと、次のSQLを実行できないらしい(?)ので、その点を気を付けた。

PHP: mysqli::query - Manual

/* 注意: 全てのレコードが取得されるか、結果セットがクローズされるまで
サーバーとやりとりを行うあらゆる関数は実行できません。あらゆる呼び出しは
'out of sync' を返します */
mysqli_query($link, "SET @a:='this will not work'");

こんな感じ。

<?php
function generate_week_record($year, $mysqli){
    // Get Max Week Number
    $sql = "SELECT MAX(WEEK) FROM team_result where YEAR = ".$year;
    $result = $mysqli->query($sql);
    $NUMBER_OF_WEEK = 0;
    if ($result = $mysqli->query($sql)) {
        // Get results
        while ($row = $result->fetch_assoc()) {
            $NUMBER_OF_WEEK = $row["MAX(WEEK)"];
        }
        // Close results set
        $result->close();
    }
    $Header = null;
    for ($i = 1; $i <= $NUMBER_OF_WEEK; $i++) {
        $Header = $Header."<td>"."Week ".$i."</td>";
    }
    echo  "<tr>"."<td>Team</td>".$Header."</tr>"."\n";
}

学んだこと&感想

  • 自身としては初めてjavascriptを使った。javascriptの本は数冊読んだが、一からコーディングするのは初めて。慣れない所も多かったが楽しかった。
  • 特にHTMLは静的であるため、これを扱うことに苦労した。何で初期化されないの?ループさせているんだが、上手くいかないな・・・?っということがあった。
  • フロントエンドの開発も楽しい。
  • 今更ながらXAMMPの使い方が分かったw XAMMP素晴らしいっす。。。笑
  • サーバーサイドは、javaを使いたかったが、自身のLightsail環境は最安の環境であるため、メモリ不足の可能性があった。
  • javaでもアプリ作成を頑張りたいが、、、次は何を作ろうか。。。