第6章 フォームデータの扱い方

6.1 フォームデータについて

PHPではHTMLで作成したフォームからデータを受け取って扱うことができます。このフォームデータを扱う方法がPHPを学ぶ大きな目的の1つになります。フォームデータを扱う方法は、PHP入門で学習済みですのでこの章では簡単に復習しておきましょう。

6.1.1 フォームデータの扱い方

PHPでフォームデータを扱うには、HTML側のデータ送信方式を知っておく必要があります。データの送信方法式は以下に示す2つなので、覚える事がそんなに難しくありません。但しGET送信には複数の指定方法がありますので、この3つの指定方法を覚えておく必要があります。

POST送信

① <form>タグを使ってmethod属性に「post」を指定する方法。

GET送信

① <form>タグを使ってmethod属性に「get」を指定する方法。
② <a href=”XXX”>のタグ(リンク)で指定する方法。
③ Webブラウザのアドレスバーに直接URLを指定する方法。

GETかPOSTで送信されてくることが分かれば、PHP側ではスーパーグローバル変数を使って値を取得することができます。但し、フォームのデータを取得する際は、必ずHTMLで設定したフォームの各部品名が必要になります。

  • POST送信からデータが送信される場合、「$_POST[‘部品名’] 」で値の取得が行える。
  • GET送信からデータが送信される場合、「$_GET[‘部品名’] 」で値の取得が行える。


図 6.1.1: データ送信方法と取得方法の関係

また、データを送る場合には、部品1つに対してPHP側で受け取りを行いますが、1つの部品の複数データ(チェックボックス)や複数の部品のデータをまとめて配列で受け取ることも可能です。

次の節からフォームデータを配列で受け取る方法について学習していきます

6.1.2 フォームデータをまとめて配列で扱おう

フォーム画面に同じような入力部品がある場合、それらのデータをまとめて配列で受け取ることができます。そのためにはHTMLの部品名に、これまでとは少しだけ違う指定を行う必要があります。

書式:配列としてまとめてデータを送る

HTMLの部品名に同じ名前を付けその後ろに「[ ]」を付けると、複数の部品の入力データを配列としてまとめて送ることが可能になります。この記述方法はPHPで学習した配列の仕組みと同じです。配列と同じ仕組みのため、[]だけで指定すると数値キーを割り振ってデータを送り、[]の中に文字キーを付けると連想配列データとして送ることができます。

凡例:データを配列としてまとめて送りそのデータを受け取る

送信元の部品名に「部品名[]」と付けていますが、送信先でスーパーグローバル変数で受け取る場合には「[‘部品名’]」として「[ ]」は付けないことに注意してください。

凡例のデータ送信(POST送信)をイメージで表すと、以下の図6.1.2のようになります。


図 6.1.2: まとめてデータ送信イメージ

では実際にプログラムを作って確認していきましょう。

フォームデータをまとめて送り配列データとして扱うプログラム

フォームからの入力データをまとめて送信して、配列データとして受け取れることをWeb画面にその結果を表示して確認します。

ソース・フォルダー: myproj_basic/ch06
パッケージ: arrayFormData.php
アクセスURL:http://localhost/myproj_basic/ch06/arrayFormData.php

arrayFormData.php

ソース・フォルダー: myproj_basic/ch06
パッケージ: receiveArrayFormData.php
アクセスURL:arrayFormData.phpからの画面遷移でアクセスされる

receiveArrayFormData.php

実行結果

解説

今回のプログラムのポイントはarrayFormData.phpから入力データをまとめて送信し、その入力データをreceiveArrayFormData.phpで配列データとして受け取り処理を行うのが目的になります。

まず入力画面arrayFormData.phpのフォーム部品について説明していきます。
7行目のformタグで送信先にreceiveArrayFormData.phpと送信方法にPOSTを指定しています。

8、9行目で2つのテキストボックスの部品名に同じ名前「personal」を付けています。但しキー値として8行目のお名前のデータには「[name]」、9行目の年齢のデータには「[age]」を設定し、連想配列となるようにしています。

11~16行目では同じチェックボックスの部品名に「hobby[]」を付けています。
これにより、選択されているチェックボックス項目の値が配列として設定されます。配列のキー値は選択されているチェックボックス項目を上から順番に0、1、2…と自動的に割り当てられます。
チェックボックスなど、データをまとめて送信する際には、配列データで送信する仕組みがよく使用されます。

今回の実行結果のテキストエリアの入力情報と、チェックボックスの選択情報を配列イメージにすると以下の図6.1.3になります。テキストエリアの配列の要素は2つで固定ですが、チェックボックスに関しては選択したデータに応じて変動します。最小は送信データなし(1つも選択しない)~最大6要素のデータが送信されます。


図 6.1.3: arrayFormData.phpからの入力データ

続いてデータの受け取り先であるreceiveArrayFormData.phpについて説明していきます。
9、10行目で入力画面からのPOST送信データを、スーパーグローバル変数$_POSTを使って取得しています。
$_POSTに指定する連想配列キーは、入力画面で設定されている部品名から[]を省いて指定します。

12行目ではテキストボックスの入力データである、名前と年齢を画面に表示しています。テキストボックスの部品名にpersonal[name]personal[age]と指定されていた場合、PHPで受け取ったデータも同じ名前「name」と「age」で連想配列として格納されています。値をPHP側で参照したい場合、部品名[XXX]のXXX部分に合わせて文字列キーを指定する必要があります。

16~18行目で選択された趣味のデータをforeach文を使って全て画面に表示しています。

実行結果からも確認できますが、フォーム画面の部品名に「[ ]」を付けることで、PHP側に配列としてデータを送信できることが確認できました。基本的には部品1つに対して部品名を付けますが、PHP側としては何個も$_POSTで取得しないといけなくなるため、まとめて配列で受け取ると便利になる場合もあります。

今回のプログラムのように状況に応じて、入力データをまとめて配列でも受け取れる仕組みを利用することも覚えておいてください。

NEXT>> 6.2 Webアプリケーションのセキュリティを考える