アンケートフォーム例

Copyright(C) 25Feb2014 coskx TNCT



フォームによるアンケート


phpプログラムが大きくなりすぎて,本論中で紹介しきれなかったフォーム部品のダイナミックな使い方を紹介する。
このアンケートフォームで使用している部品は
(1)テキストボックス(input type="text")
(2)ラジオボタン(input type="radio")
(3)ポップアップリスト(select option)
(4)チェックボックス(input type="checkbox")
(5)複数行対応テキストボックス(textarea)
(6)実行ボタン(input type="submit")
である。
ページの遷移は本論中と同じで次のようになっている。



ページ遷移部品は次のものが必要になる。
トップページフォーム  送信ボタン(name="okuru")
入力確認ページフォーム 確定保存ボタン(name="hozon") キャンセルボタン(name="kyanseru")
            やりなおし訂正ボタン(name="teisei")
保存確認ページ     了解ボタン(name="ryokai")

注意しなければならない点は,次の通り。
(1)入力確認ページから別のページに移動する際に,
得られている回答データを持っていかなければならないことである。
このとき,フォーム部品の
<input type="hidden" ・・・>
を使う。ページ上には何も表示されていないけれど,フォームのデータとして,ページ移動の際に
それらの値を持っていくことができる。
(2)テキスト入力のところでは,悪意を持ったスクリプトが入力されても問題を引き起こさないため
関数htmlspecialcharsを用いて,危険な文字を変換する。
(3)checkboxの状態データは配列データとして1度目は受け取るが,それをもう一度hiddenで
送信するときには,配列要素ごとに送信しなければならない。

フォームによるアンケート(3)
<?php
//==== 制御部 ここから ====
    $sex[0]="男性";
    $sex[1]="女性";
    $season[0]="春";
    $season[1]="夏";
    $season[2]="秋";
    $season[3]="冬";
    $pet[0]="いぬ";
    $pet[1]="ねこ";
    $pet[2]="小鳥";
    $pet[3]="子ぶた";
    $pet[4]="ウサギ";
    $datafname="questionnaire.csv";
    $pageToDisplay=0; //表示すべきページ
    $nickname="";
    $seibetsu=-1; //どこも指していない状態
    $kisetsu=-1;  //どこも指していない状態
    $checkmessage="";
    $omosiro="";
    if(isset($_POST['okuru']) == true)
    {
        $pageToDisplay=1;
        $kisetsu=$_POST['kisetsu'];
        if (isset($_POST['seibetsu'])) {
            $seibetsu=$_POST['seibetsu'];
        } else {
            $pageToDisplay=0;
            $checkmessage.="性別が選択されていません。<br>";
        }
        if ($_POST['nickname']!="") {
            $nickname=$_POST['nickname'];
        } else {
            $pageToDisplay=0;
            $checkmessage.="ニックネームが記入されていません。<br>";
        }
        if ($checkmessage!="") {
            $checkmessage="<font color=\"red\"><b>".$checkmessage;
            $checkmessage.="正しく記入してもう一度送信してください。</b></font><br>& lt;br>";
        }
        if (isset($_POST['petto'])) $petto=$_POST['petto'];
        $omosiro=$_POST['omosiro'];
    }
    if(isset($_POST['teisei']) == true)
    {
        $kisetsu=$_POST['kisetsu'];
        $seibetsu=$_POST['seibetsu'];
        $nickname=$_POST['nickname'];
        if (isset($_POST['petto'])) $petto=$_POST['petto'];
        $omosiro=$_POST['omosiro'];
    }
    if(isset($_POST['hozon']) == true) {
        $kisetsu=$_POST['kisetsu'];
        $seibetsu=$_POST['seibetsu'];
        $nickname=$_POST['nickname'];
        if (isset($_POST['petto'])) $petto=$_POST['petto'];
        $omosiro=$_POST['omosiro'];
        $pageToDisplay=2;
        $fp=fopen($datafname,"a");
        fprintf($fp,"%s,%s,%s,",htmlspecialchars($nickname, ENT_QUOTES),$sex[$seibetsu],$season[$kisetsu]);
        if (isset($petto)) {
            fprintf($fp,"\"");
            $i=0;
            foreach ($petto as $p) {
                if ($i==0) fprintf($fp,"%s",$pet[$p]);
                else fprintf($fp,",%s",$pet[$p]);
                $i++;
            }
            fprintf($fp,"\"");
        }
        fprintf($fp,",\"%s\"",htmlspecialchars($omosiro, ENT_QUOTES));
        fprintf($fp,"\n");
        fclose($fp);
    }
//==== 制御部 ここまで ====
?>

<html>
<body>

<?php
//==== 表示部 ここから ====
    if ($pageToDisplay == 0) {
        print "<h2>アンケートです</h2>\n";
        if ($checkmessage!="") print $checkmessage."\n";
        print "<form method=\"post\">\n";
        print "<b>1.あなたのニックネームは?</b>\n";
        print "<ul>";
        print "<input type=\"text\" size=\"30\" name=\"nickname\" value=\"".htmlspecialchars($nickname, ENT_QUOTES)."\" required><br>\n";
        print "</ul>";
       
        print "<b>2.あなたの性別は?</b>\n";
        print "<ul>\n";
        for ($i=0; $i<2; $i++) {
            print "<input type=\"radio\" name=\"seibetsu\" value=".$i;
            if ($i==$seibetsu) print " checked";
            print " required>".$sex[$i]."<br>\n";
        }
        print "</ul>\n";
       
        print "<b>3.あなたの一番好きな季節は?</b>\n";
        print "<ul>\n";
        print "<select name=\"kisetsu\">\n";
        for ($i=0; $i<4; $i++) {
            print "<option value=".$i;
            if ($i==$kisetsu) print " selected";
            print ">".$season[$i]."</option>";
        }
        print "\n";
        print "</select>";
        print "</ul>\n";

        print "<b>4.あなたの好きなペットは?(複数選択OK,無選択OK)</b>\n";
        print "<ul>\n";
        for ($i=0; $i<5; $i++) {
            print "<input type=\"checkbox\" name=\"petto[]\" value=".$i;
            if (isset($petto)) foreach($petto as $p) if ($i==$p) print " checked";
            print ">".$pet[$i]."<br>";
        }
        print "</ul>\n";

        print "<b>5.これまでに,おもしろいと感じたことについて書いてください。</b>\n";
        print "<ul>\n";
        print "<textarea name=\"omosiro\" rows=\"6\" cols=\"80\">".htmlspecialchars($omosiro, ENT_QUOTES)."</textarea>\n";
        print "</ul>\n";

        print "回答がおわったら送信ボタンを押してください。<br>\n";
        print "<ul>\n";
        print "<input type=\"submit\" name=\"okuru\" value=\"送信\">\n";
        print "</ul>\n";
        print "</form>\n";

    } else if ($pageToDisplay == 1) {
        print htmlspecialchars($nickname, ENT_QUOTES) . " さんの回答です<br><br>";
        print "性別    : ".$sex[$seibetsu]."<br>\n";
        print "好きな季節 : ".$season[$kisetsu]."<br>\n";
        print "好きなペット: ";
        if (isset($petto)) {
            $i=0;
            foreach ($petto as $p) {
                if ($i==0) printf("%s",$pet[$p]);
                else printf(",%s",$pet[$p]);
                $i++;
            }
        }
        print "<br>\n";
        print "おもしろい : ".htmlspecialchars($omosiro, ENT_QUOTES)."<br>\n";
        print "<br>\n";
        print "<ul>\n";
        print "<form method=\"post\">\n";
        print "<input type=\"submit\" name=\"hozon\" value=\"確定送信\"><br>\n";
        print "<input type=\"hidden\" name=\"nickname\" value=\"".htmlspecialchars($nickname, ENT_QUOTES)."\">\n";
        print "<input type=\"hidden\" name=\"seibetsu\" value=\"".$seibetsu."\">\n";
        print "<input type=\"hidden\" name=\"kisetsu\" value=\"".$kisetsu."\">\n";
        if (isset($petto)) { //配列要素ごとにhiddenで送る
            $i=0;
            foreach ($petto as $p) {
                print "<input type=\"hidden\" name=\"petto[".$i."]\" value=\"".$p."\">\n";
                $i++;
            }
        }
        print "<input type=\"hidden\" name=\"omosiro\" value=\"".htmlspecialchars($omosiro, ENT_QUOTES)."\">\n";
        print "</form>\n";
        print "<form method=\"post\">\n";
        print "<input type=\"submit\" name=\"kyanseru\" value=\"キャンセル\"><br>\n";
        print "</form>\n";
        print "<form method=\"post\">\n";
        print "<input type=\"submit\" name=\"teisei\" value=\"やりなおし訂正\"><br>\n";
        print "<input type=\"hidden\" name=\"nickname\" value=\"".htmlspecialchars($nickname, ENT_QUOTES)."\">\n";
        print "<input type=\"hidden\" name=\"seibetsu\" value=\"".$seibetsu."\">\n";
        print "<input type=\"hidden\" name=\"kisetsu\" value=\"".$kisetsu."\">\n";
        if (isset($petto)) { //配列要素ごとにhiddenで送る
            $i=0;
            foreach ($petto as $p) {
                print "<input type=\"hidden\" name=\"petto[".$i."]\" value=\"".$p."\">\n";
                $i++;
            }
        }
        print "<input type=\"hidden\" name=\"omosiro\" value=\"".htmlspecialchars($omosiro, ENT_QUOTES)."\">\n";
        print "</form>\n";
        print "</ul>\n";
    } else if ($pageToDisplay == 2) {
        print "ファイル ".$datafname." に保存しました。<br><br>\n";
        print "<form method=\"post\">\n";
        print "<input type=\"submit\" name=\"ryokai\" value=\"了解\"><br>\n";
        print "</form>\n";
    }
//==== 表示部 ここまで ====
?>

</body>
</html>

アンケートページの表示

入力データ確認ページ

保存確認ページ
ファイル questionnaire.csv に保存しました。