アンケートの作成 誤りの指摘やご意見はこちらへ ご意見板
BBS

PHP Top
項目
アンケートの作成 ↑項目に戻る
自分のサイトにアンケートを設置してみましょう.今回はDBを使って作ってみます.

以下のテーブルを用意してください.DB名,テーブル名は任意でかまいません.
(もちろんフィールド名もお好きなものを.counter01等でなくて大丈夫です)
フィールドの数がユーザが選択するラジオボタンの数になります.

フィールド名 フィールド型 属性
counter01 int  
counter02 int  
counter03 int  

出来上がったtableの各要素には、初期値の0を入れておきましょう。

mysql> insert into テーブル名 set counter01="0", counter02="0", counter03="0";

アンケートに使用する空のファイルanswer.txtを作成してください。(touchコマンド)
また,グラフを描くためのイメージgraph.gifを作成してください.
そしてアンケート入力フォームであるank.htmlを,以下の内容で作成してください.

<html>
<body>
<b>アンケート PHP Dreamについて</b>
	<form method = "post" action = "ank.php">
		<input type = "radio" name = "type" value = "1" checked>良かった<br>
		<input type = "radio" name = "type" value = "2" >悪かった<br><br>
		<input type = "radio" name = "type" value = "3" >その他
		<input type = "text", name = "test_about_other"  maxlength="100">
		<input type ="submit" value="投稿する"><br>
	</form>
</body>
</html>
			

ユーザに示すためのアンケート入力結果ank.phpを,以下の内容で作成してください.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"></head>
<body>

<?php

	
	$posttype = $_POST['type'];//ラジオボタンのタイプを入れる
	
//注意 $num = 3;//ラジオボタンの数 $strLength = 100;//文字列の最大の長さ
$filename = "answer.txt";//アンケートの記述項目を保存するtxtファイル名 //DB
//データベースに接続する.引数に注意 mysql_connect("127.0.0.1","ユーザ名", "パスワード"); mysql_select_db("データベース名");//あなたのデータベース名を入れて下さい //テーブルから情報を得る テーブル名は各自変更して下さい $result = mysql_query("select * from テーブル名"); $array = mysql_fetch_array($result); print "アンケートに協力していただきありがとうございます。<br>"; print "あなたの解答:"; //注意 if( $posttype == 1 ){ print "良かった<br><br>"; $counter = $array['counter01']; } else if( $posttype == 2 ) { print "悪かった<br><br>"; $counter = $array['counter02']; } else if( $posttype == 3 ) { $counter = $array['counter03']; if(mb_strlen($_POST['test_about_other']) > $strLength) { //最大の文字数 $limitedStr = mb_substr($_POST['test_about_other'], 0, $strLength); echo "over100"; } else $limitedStr = $_POST['test_about_other'];

print "その他 \"".$limitedStr."\"<br><br>"; $file = fopen( $filename, "r+"); flock( $file, LOCK_EX ); //注意-2 fseek($file, 0 , SEEK_END); //時間を入れる $today = getdate(); fwrite($file, $today[year]."年".$today[mon]."月".$today[mday]."日"
.$today[hours]."時".$today[minutes]."分".$today[seconds]."秒"); fwrite($file, ":コメント:\"".$limitedStr."\"\n"); flock($file, LOCK_UN ); fclose($file); //時間を入れる記述はここまで } //ラジオボタンの値がおかしいとき else { echo "ERROR"; exit; }
$counter++;//選ばれたラジオボタンの票の数を1増やす //注意 //DBの更新 $posttype=addslashes($posttype); $result = mysql_query("update テーブル名 set counter0".$posttype."=$counter"); //宿題 //php.iniが以下の設定なら$posttype($_POSTより引き継いだ変数)をaddslashes関数に //通す必要はありません.
//php.ini //; Magic quotes //; // //; Magic quotes for incoming GET/POST/Cookie data. //magic_quotes_gpc = On
//offなら //シングルクォート、ダブルクォート、バックスラッシュ、 //NULLバイトをバックスラッシュで文字に変換 //addslashes(); //更新後の結果を取得 $result = mysql_query("select * from テーブル名"); $array = mysql_fetch_array($result); $sum = 0;//全体の票を数えるために使用される$sum変数 //全体の票を計算 宿題 for( $i = 0; $i<$num; $i++){ $sum += $array[$i]; } //グラフの描画 //graphの長さを割合で計算するために使用する変数 $graph_length = 0; for($i = 0; $i <$num; $i++){ //小数点以下を長くしないように工夫 注意 $percentage = round(($array[$i]*100/$sum)*10)/10; $graph_length = (int)($percentage*2);//小数点をカット $button_num = $i+1;//ラジオボタンの番号を計算する //グラフの描画 print "ボタン$button_num <img src=\"../img/graph.gif\" width=\"$graph_length
\" height=\"5\">  $percentage"."%    ";
print $array[$i]."票<br><br>"; }
//最後に戻るボタン print "<a href = \"./ank.html\">戻る</a>"; ?> </body> </html>


ユーザが解答したテキストフォームの内容(answer.txt)は以下(answer.php)で見ることが出来ます.(勿論テキストファイルをそのまま見ることも出来ます)

<?php

   $fp = fopen( "answer.txt", "r" );

  while( !feof( $fp ) ){
    //feof関数 ファイルポインタがEOF(END OF FILE)に到達したらtrue
    print ( fgets( $fp )."<br>" );//1kまで maxlength
  }

?>


試してみる(ank.htmlとank.php)

試してみる(answer.php)


■解説--------

ank.htmlではラジオボタンのフォームを作成しています.value属性の値で何が選ばれたかank.phpは理解することが出来ます.
textboxは最大100文字までの制限を設けています.(maxlength="100")

ank.phpですが,このプログラムでは以下のような流れになっています.

DBにアクセス.今DBに入っているアンケート結果を取得する.(注意の前まで)

▲罅璽兇押したラジオの特定して,ユーザが操作した内容を表示(注意

2,気譴織椒織鵑離侫ールドを1増やす
(このときにラジオボタンが3番目だったらユーザが入力したテキストをanswer.txtに挿入) (ここまでで注意の前

DBにフィールドの変更を反映させ(注意),票の合計数を計算,グラフとして表示する

answer.phpでは単純にanswer.txtに書き込まれた内容を表示しています.

----

注意は静的な変数にしたほうがいいかもしれません.これがどういうことか是非調べてください.

注意では長いですが,ラジオボタンに従ったプログラムの動作を書いています.
$array = mysql_fetch_array($result);で得られた$arrayから,DBのフィールド名を指定することで,レコードにアクセスすることが可能です.
注意-2ではいままでflock関数の第2引数は数字でしたが,文字になっています.
これはマジックナンバーといい,一定の値です.
引数の値が,2や3では何をやっているかわからないので,変数の名前で排他制御をしている等を明らかにしています.

注意$_POSTや$_GETに格納されていた、外部から取り込む変数については、DBのSQL文に投入する前に、addslashes()で特殊文字(シングルクォート、ダブルクォート、バックスラッシュ、NULLバイト)をエスケープしましょう。php.iniの設定で,ユーザの入力に'や"等があっても自動的にエスケープすることができます.
ex.' → \' を自動的に変換
時間のある方は、宿題,鬚笋辰討澆泙靴腓Α

注意ではそのまま表示すると小数点が長くなってしまうので小数点をカットしています.

----
今回の宿題ですが,

宿題php.iniのmagic_quotes_gpcの設定を調べてみましょう.ヒントはコメントとしてプログラムに残しておきました;)
また、magic_quotes_gpcのOnとOffを切り替えてみて、挙動がどう変わるか試してみましょう。

宿題全体の票をいちいち計算するのは手間です.DBに格納したプログラムを書きましょう!

ヒント:以下のようなテーブルを作ってみては?
フィールド名 フィールド型 属性
sum int  
counter01 int  
counter02 int  
counter03 int  


難しくなってきましたね.ですが,地道に自分で調べることがphpマスターの道です.

phpに王道なし!なんて・・・(笑)

がんばっていきましょう^^


↑項目に戻る

PHP Top