例3b

入力欄がたくさんあるフォームでは,途中で厭きて閉じられるかもしれません。 そんなとき,入力されたフォームの内容だけでもサーバにこっそり送れるとおもしろいかもしれません。^^;

やってみましょう。まず アンケート に答えてください。

アンケートのページで[送信]を押さずに,ぱんくずリストの「例3」でこのページに戻ってください。ブラウザの[戻る]で戻った場合でも,必要に応じてこのページをリロードすれば,途中までの結果が下に反映されるはずです:

名前:
年齢:
趣味:

仕組み

このページは PHP で書かれています(ファイル名は index.php です)。クッキーとセッション管理で説明したように,まずファイルの先頭で次のようにしてセッションを開始します(パスは適宜変えてください):

<?php
  session_set_cookie_params(0, '/~okumura/');
  session_start();
?>

上の名前や年齢を出力しているところは次のようになっています:

<p>
<?php
  echo '名前:', htmlspecialchars(@$_SESSION['user']), '<br>';
  echo '年齢:', htmlspecialchars(@$_SESSION['age']), '<br>';
  echo '趣味:';
  if (isset($_SESSION['hobbies']))
    foreach ($_SESSION['hobbies'] as $x)
      echo htmlspecialchars($x), ' ';
?>
</p>

アンケート のページは単なるHTMLファイルですので,ソースが簡単に調べられます。頭の部分で

function doit() {
  const form = new FormData(document.getElementById("myform"));
  fetch("ex3.php", { method: "POST", body: form });
}

としています。

ex3.php は次のようなファイルです:

<?php
  session_set_cookie_params(0, '/~okumura/');
  session_start();
  header('Content-Type: text/html; charset=UTF-8');
  $_SESSION['user'] = @$_POST['user'];
  $_SESSION['age'] = @$_POST['age'];
  $_SESSION['hobbies'] = @$_POST['hobbies'];
?>

補足

$_POST['..."]$_SESSION['..."] などで、いちいち isset() で値が入っているかどうか調べるのは面倒なので、ここでは @ という文字をかぶせて使っています。こうするとエラーになりません(ない値は NULL になり、echo で表示されません)。この @Error Control Operator といいます。