「メニュー注文フォーム」を題材に、ブラウザとサーバーの役割を直感的かつ論理的に理解するための教材ページ
まずは、「誰が」「どこで」「何をしているのか」をざっくりイメージします。 メニュー注文ページを例に、4つの役者の役割を整理します。
← ユーザーが直接触っている場所
← 店員・システム側の仕事
あなたのメニュー画面では、次のような流れが起きています。 「JavaScript がやること」と「PHP がやること」を分けて見てみます。
menu.html を読み込み、
HTML と CSS で画面を描画し、JavaScript を読み込む。
keisan() が呼ばれ、合計金額を計算。
check.php に送信され、
PHP が注文内容を受け取り、処理・表示する。
tanka[] を持っているkingaku に表示$_POST["kazu1"] などで数量を受け取る$_POST["table_No"] でテーブル番号を受け取るあなたのコードの JavaScript 部分を、図解しながら読み解きます。 まずは元のコードを整理して載せます。
"use strict";
let tanka = [0, 400, 450, 700, 300, 350, 200, 1000, 800, 250];
function keisan() {
let goukei = 0;
for (let i = 1; i <= 9; i++) {
let kazu = Number(document.form1.elements["kazu" + i].value);
goukei += tanka[i] * kazu;
}
document.form1.elements["kingaku"].value = goukei;
}
// 単価を画面に表示
for (let i = 1; i <= 9; i++) {
document.getElementById("tanka" + i).textContent = tanka[i];
}
function resetForm() {
document.form1.reset();
document.form1.elements["kingaku"].value = "";
}
tanka = [0, 400, 450, ...] は、
「メニュー1〜9の単価」を番号で管理するための箱です。
tanka[1] → 1品目の単価tanka[2] → 2品目の単価for (let i = 1; i <= 9; i++) で 1〜9 品目を順番に処理"kazu" + i で kazu1〜kazu9 を順番に参照goukei に入れるkingaku の input に合計を代入kazu1 など)と
JavaScript の文字列結合("kazu" + i)を対応させている。
tanka1〜tanka9 という id を持つ span を取得textContent に単価を代入して表示document.form1.reset() でフォーム全体を初期状態に戻すkingaku だけ空文字にしておく※ ここまでが「ブラウザの中だけで完結する処理」。サーバーにはまだ何も送っていません。
次に、フォームの action="check.php" で呼ばれる PHP 側を、
シンプルなサンプルコードと図解でイメージしてみます。
<?php
// 1. フォームから送られてきた値を受け取る
$tableNo = $_POST["table_No"] ?? "";
$kingaku = $_POST["kingaku"] ?? "";
// メニューの数量を配列にまとめる
$kazu = [];
for ($i = 1; $i <= 9; $i++) {
$key = "kazu" . $i;
$kazu[$i] = isset($_POST[$key]) ? (int)$_POST[$key] : 0;
}
// 2. サーバー側でも合計金額を再計算(安全のため)
$tanka = [0, 400, 450, 700, 300, 350, 200, 1000, 800, 250];
$serverTotal = 0;
for ($i = 1; $i <= 9; $i++) {
$serverTotal += $tanka[$i] * $kazu[$i];
}
// 3. 結果を画面に表示(本番では DB 保存などもここで行う)
?>
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>注文内容の確認</title>
</head>
<body>
<h1>注文内容の確認</h1>
<p>テーブル番号:<?= htmlspecialchars($tableNo, ENT_QUOTES, "UTF-8") ?></p>
<p>合計金額(サーバー計算):<?= $serverTotal ?> 円</p>
</body>
</html>
$_POST["table_No"] → テーブル番号$_POST["kazu1"]〜$_POST["kazu9"] → 各メニューの数量$_POST["kingaku"] → ブラウザ側で計算した合計金額name 属性と同じ文字列で受け取る。
ここがズレると、PHP は値を受け取れない。
$tanka と $kazu から合計を出す※ 実際のシステムでは、このあとデータベースに保存したり、オーダー一覧画面(show.php)に渡したりします。
最後に、JavaScript と PHP の違いを、 「どこで」「いつ」「何のために」動くのかという視点で整理します。
ここまでの図解を、最初に提示してくれたメニュー画面に重ねると、 次のような「心の中の図」が描けるようになります。
tanka[] は「メニュー表の裏側の価格表」keisan() は「レジで合計を計算する人」check.php は「キッチンに伝票を渡す係」