サーバサービス/アンケート処理
提供: Internet Web School
サーバサービス(PHP等) > アンケート処理
目次 |
概要
ここでは前章に続いて、PHPによるデータ入出力処理の例をあげ、PHPでのアンケート処理の例を示します。
アンケート処理
PHPの書き方について、便宜のために前章と同じ資料を再び挙げておきます。
- 英語版:http://www.plus2net.com/PHP_tutorial/PHP_introduction.php
- 日本語版:http://www.scollabo.com/banban/PHP/
アンケートを取る
前々章のシステムを少し複雑にすると、インターネット上でアンケートを取るシステムを作ることができます。ある商品(Snow ケーキ)の味を購入してもらった人に評価してもらいます。評価は4段階で「良くないno good」「良い good」「非常に良い very good」「素晴らしい excelent」のどれかにラジオボタンによってチェックを入れてもらいます。
この商品の評価を入力させます。その後記録用のPHPプログラムを呼び、それらの結果をサーバ上にあるCSVファイル(カンマ区切りでデータを区切った、Excelなどに入力し易い形式)に記録させるのです。
この仕組みも前章と同様、2つの要素からなります。一つはデータ入力用のHTMLファイルです。もう一つはその入力されたデータを受け取りサーバに置かれたあるCSVファイルにデータを記録する記録用PHPファイルです。
データ入力用のHTMLファイルによる、この商品の評価入力させる画面(図1)。そのあとsendボタンを押すと次の画面に移ります。
send ボタンを押すと次の画面が現れます(図2)。
この画面が出るとき同時に次のような内容のCSVファイル(quest0.csv)が作られます。
quest0.csv 13222,1
このcsvファイルの意味は、番号13222 の人は評価1を入力した、というものです。なぜ入力したのが番号13222 の人だと分かるか、というと、入力用のwebのURLが
http://..../quest13222.html
となっているからです。つまりこのアンケートはメールなどで評価を依頼するのですが、そのたびに異なるhtml file 名のページに書き込むように依頼している訳です。これによって一人が何回も投稿するのを防いでいます。一応一人が重複して投稿するとその回数だけ記録はされますが、記録されたCSVファイルには同じ番号のデータであることが分かるので、あとで重複したものを削除する処理を Excel などで行えばいいのです。
データ入力用のHTMLファイルの内容
HTMLファイルはデータを記録用ファイルに保存するような機能は無いが、それができるPHP ファイルを読み出すことができます。あらかじめデータを入力するのはHTMLファイル中のform というタグを使います。
データ入力用のHTMLファイル(quest13222.html)の内容
1 <html>
2 <head>
3 <title>Input Form</title>
4 </head>
5 <body>
6 <form action="qsave.php" method="post">
7 <table>
8 <tr><td><h2>How is the taste of Cake Snow?</h2></td>
9 </tr>
10 <tr>
11 <td><input type="radio" name="deg" value="0">no good</td>
12 </tr>
13 <tr>
14 <td><input type="radio" name="deg" value="1">good </td>
15 </tr>
16 <tr>
17 <td><input type="radio" name="deg" value="2">very good </td>
18 </tr>
19 <tr>
20 <td><input type="radio" name="deg" value="3">excelent </td>
21 </tr>
22 <input type="hidden" name="num" value="13222">
23 <tr>
24 <td><input type="submit" name="submit" value="send"></td>
25 </tr>
26 </table>
27 </form>
28 </body>
29 </html>
上のHTMLファイルの説明
これは通常のHTMLファイルで、前章の入力用htmlファイルと基本的には同じです。 行の番号を左側に入れてありますが、実行時はそれらを除いてください。
やはり6行目にPHPファイルとの連携ができる第一の鍵があります。<form>...</form> の間でデータ入力をするが、そのデータはqsave.phpというphpプログラムに渡されること、その渡し方はpost という方式であること(getという方式もありますが)を指定しています。 次の行7行目から21目までが商品Snow Cake の評価の入力に関するところです。評価の入力の方法はラジオボタンによるもので選択できる値は11,14,17,20行目に書かれた4つのうちの一つをチェックして指定するものです。 24行目は入力されたデータを一括してqsave.phpに渡すタイミングを指定するものです。submit というタイプで指定したとき、send というボタンを押した瞬間それまでに各変数に入力された値(=データ)がqsave.phpに送信されるのです。
前章と異なる点は22行目に
<input type="hidden" name="num" value="13222">
という行があることです。これは隠された数値がnumという名前でphpプログラムに送られ、その値は13222である、ということです。これによって入力者の番号が13222であることが分かります。前節で入力用htmlファイルのURLがquest13222.html だから入力者の番号が分かるのだ、と書きましたが、正確にはこの行に、隠れされた値13222が書かれているからなのです。そしてhtmlファイルの名前中の数列とこの値が一致するようにしてある、ということがポイントなのです。 もうひとつこの章で初めて出るものに、<tr>タグと<td>タグがあります。これはテーブル機能に付随したもので、テーブルの構成を表すhtmlの機能です。 すなわちテーブルを4行3列(例えば)の格子に見立てたとき、4つの行は
<tr> ......... </tr> <tr> ......... </tr> <tr> ......... </tr> <tr> ......... </tr>
で表し、それぞれの行の中3つの列は
<tr> <td>...</td><td>...</td><td>...</td> </tr>
のように表すのです。即ち行と列の構成を<tr>タグと<td>タグで完全に記述できるのです。これらがあれば前章でやったように空白の数によって列の位置を無理に合わせる必要は無くなります。
データ記録用PHPファイルの内容
記録用PHPファイル(qsave.php)の内容
1 <html>
2 <head>
3 <title>Sample of data receiving and saving by PHP,II</title>
4 </head>
5 <body>
6 <?php
7 $a0=$_POST['deg'];
8 $anum=$_POST['num'];
9 echo "------------------------------------<br>";
10 echo "Thank you for your help. <br>";
11 $fp=@fopen('./quest0.csv','a');
12 fwrite($fp,$anum.",".$a0."\n");
13 fclose($fp); //output data
14 ?>
15 <br>
16 </body>
17 </html>
上のPHPファイルの説明
このPHPファイルも前章のphpファイルと似ていますが、より簡単なプログラムです。 説明のために左側に行の番号を入れていますが、プログラムとしては除いて考えてください。
6行目の<?phpはこれからphp プログラムの記述が始まる、ということを示します。最後から5行目の ?> がその部分の終了を表します。
7行目、8行目は、入力用HTMLからdeg,numという変数に入れてquest.htmlから送られてきたデータを別のこのPHPプログラム独自の変数 $a0,$anum3 に代入します。$_POSTというのが送られてきた変数からデータを取り出すためのphpの関数です。
次の11-13行目はそれらのデータをサーバ上にある quest0.csv という名のcsvァイルに書き出すためのもので、前章と同様です。
スプレッドシートを使ったCSVファイルの集計
記録用PHPプログラムによってアンケート結果がCSVファイルに記録されました。多くの人がアンケートに答えると記録はcsvファイル(quest0.csv)に追記されていきます。そして例えば
13222,0 13222,1 13222,1 ... ... 13230,2 14723,1 16821,3
のようになったとします。このデータ列の特徴は、順不同であること、回答者番号の重複があるかもしれないこと、などです。このようなCSVファイルはアンケート結果そのものです。ここから回答結果の統計処理をするにはどうしたらいいでしょうか?種々の方法がありえますがここではExcelなどスプレッドシートによる簡易な方法を紹介しましょう。従って以下の内容はPHPのプログラムと関係がないのですが、このような処理が行われることを前提にしてcsvファイルが作られた、ということを理解してもらえれば幸いです。
まず上記のようなCSVファイルからExcelなどのスプレッドシートに読み込みます。
すると回答者番号はA列に、回答内容はB列に読み込まれますが、A列の番号は順不同になっています。そこでA列のデータをキーに(昇順に)A列とB列を同時に並び替えます(このような並び替えはスプレッドシートの基本機能のひとつです)。すると下の図のようになります(図3)。
こうして並び替えてみると回答者番号が重複している場合があることが分かります。重複した場合は最初のもの(並び替えたとき最初にきたもの。必ずしも時間的に最初に入力されたものではない)だけを残し、あとは無視します。それにはどうしたらよいかというと、回答は0から3までですが、重複したものの2番目以降は例えばー1とするのです。あとは回答どうりにします。このような往復データ除去の処理は、次のようにします。C列にそのようなデータを作るには、例えばC2の場所に
=IF(A1<>A2;B2;-1)
という関数を埋め込みます。
この意味は回答者番号が一つ上と同じでなかったらその回答はそのまま(B2にあるもの)とし、そうでなかったら(ということは一つ上と同じだったら)回答をー1とする、というものです。C3以降は同じ関数をコピーしておきます。なお一番上になるC1についてはB1と無条件で同じとします。その結果を示したのが次の図です(図4)。
C列の重複除去処理をしたデータについて頻度分布をF列に求めます。これはスプレッドシートの関数 Frequency を使います。その関数はF1からF5入れたいのですが、その準備としてE1からE2に頻度を取りたい値-1,0,1,2,3を入れておきます。そしてF1~F5を範囲として選択しておいて
=FREQUENCY(A1:A16;E1:E5)
を入力します。この意味はA1からA16にあるデータをE1から E5の段階に従って頻度分布をF1~F5作れ、ということです。なおこの関数の入力の最後は単なるEnterキーを押すのではなく、コントロールキーとシフトキーを押しながらEnterを押すというものです。それはFREQUENCY関数の値が配列であるからです。すると次の図になります(図5)。
上の図のF1~F5を見ると、-1(重複しているもの)が3件、0(no good)が2名、1(good)が4名、2(very good)が5名、3(excelent)が2名であると分かります。
最後に頻度を棒グラフにします。これもスプレッドシートの基本機能でできます。E2~F5を指定し、E2~E5が種別名になるようにすれば(E1はー1なので抜いて考える)、次のようなグラフが得られます(図6)。