#!/usr/local/bin/perl #サーバによっては上の一文を変更する必要があります。サーバ管理者にお尋ねください。 $ver = 3.50; #バージョン情報 #-----これ以下の著作者表示を変更しないでください----- #[Web Qnaire 1] #(C)narishin,2000-2004 #http://www.narishin.com #このスクリプトはフリーウェアです。 #このスクリプトの設定・設置・運用はスクリプト使用者の責任において行ってください。 #改造・再配布etcは著作者表示を改変しない限り自由です。 #-----ここまで----- #---------------------- #初期設定 #---------------------- require './jcode.pl'; #日本語処理系(このファイルと同じディレクトリにおいてください) $kanji='sjis'; #漢字変換方式(sjis(推奨)かjisかeuc) $script='./qnaire1.cgi'; #スクリプト名(このファイルの名前) $logfile='./data.txt'; #データファイル名(このファイルと同じディレクトリにおいてください) $graphgif='http://'; #グラフ用画像データ(絶対パスで指定) $method='POST'; #メソッド形式(POST(推奨)かGET) $mkazu = 0; #フリーメッセージ表示数(0:非表示) $home='http://'; #ホームページ(帰り先、絶対パスで指定) $mail=''; #管理者メール $pass='0123'; #管理者用パスワード $title='アンケート'; #タイトル $bgcolor='#fffff0'; #背景色 $bgimage='http://'; #背景画像 #説明文(タグも使用可能) $subtitle=''; $lockkey = 0; # ロック機構 (0:不使用 1:使用) $lockfile = './lock'; # ロックファイル名 #---------------------------------- #メイン処理系 #---------------------------------- &decode; if ($mode eq 'tohyo' || $mode eq 'kekka'){ &tsuika; }elsif($mode eq 'kanri'){ &kanri; }else { &tohyo; } #---------------------------------- #初期投票画面 #---------------------------------- sub tohyo{ &head; print "
$subtitle
$qtemp[0]"; #質問文の表示 if ($qtemp[3] =~ m/sosu/){ print "\n 投票総数 $tothyo 票"; #投票総数表示 } print "\n
| $h_anstmp[$j] | "; print "$h_hyotmp[$j] 票 | "; if ($qtemp[3] =~ m/radio/ || $qtemp[3] =~ m/select/){ if ($tothyo>0) { $wari[$j]=sprintf("%.1f",$h_hyotmp[$j]*100/$tothyo); } $width = int ( 3 * $wari[$j] ); print "$wari[$j] % | "; }else{ if ($maxhyo > 0){ $width = int(300*$h_hyotmp[$j]/$maxhyo); } } print "";
print " |
ご意見・ご感想をどうぞ
\n";
print "$qset[$qkazu+1]\n"; #メッセージ表示
}
if ($mode eq 'tohyo'){
$qset[$qkazu+2]="$jikanl \n"; #最終投票時間更新
}else{
$qset[$qkazu+2]="$qset[$qkazu+2]\n";
}
if ($mode eq 'tohyo'){
$qset[$qkazu+3]="$host\n"; #最終投票ホスト更新
}else{
$qset[$qkazu+3]="$qset[$qkazu+3]\n";
}
$qset[$qkazu+4]="$qset[$qkazu+4]\n"; #末データ処理
$qset[$qkazu+5]="$qset[$qkazu+5]\n"; #末データ処理
$qset[$qkazu+6]="$qset[$qkazu+6]\n"; #末データ処理
$qset[$qkazu+7]="$qset[$qkazu+7]\n"; #末データ処理
$qset[$qkazu+8]="$qset[$qkazu+8]\n"; #末データ処理
#データファイル更新
open (OUT,">$logfile") || &error("ログファイルを開けません");
print OUT @qset;
close(OUT);
&unlock if ($lockkey); # ロック解除
print "
投票画面に戻ります\n"; &foot; #フッタ表示 } #---------------------------------- #管理者用 #---------------------------------- sub kanri{ if ($in{'pass'} ne "$pass") {&error('パスワードが違います');} &jikan(0); &head; print <<"EOM";
EOM
&lock if ($lockkey); # ロック開始
open (IN,$logfile) || &error("ログファイルを開けません"); #データファイル読み込み
@qset= $qtemp[0]\n"; #質問文の表示
print " 動作に不具合がありましたらお手数ですが\n";
print "こちらまでお知らせください。\n";
}
print <<"EOM";
$_[0]
\n";
print "それぞれの実行ボタンは1回だけクリックしてください。ダブルクリックするとデータが失われる恐れがあります。
\n";
print "こまめに投票ページに戻って設定変更を確認しながら作業を進めてください。\n";
$qkazu=$qset[0];
$qset[0]="$qset[0]\n";
#質問の消去
foreach $x (@delque){
splice(@qset,$x,1);
$qkazu--;
$qset[0]="$qkazu\n";
}
#質問の追加
if ($in{'addque'} ne ''){
$qkazu++;
$qset[0]="$qkazu\n"; #質問数の更新
splice(@qset,1+$in{'ajun'},0,"$in{'addque'},0,$in{'aadd'},$in{'rc'},");
}
for ($i=1;$i<=$qkazu;$i++){ #質問ごとの処理
@qtemp=split(/,/,$qset[$i]); #行内データを「,」で分けて配列qtempに格納
$add=$in{"add$i"},$tothyo=0;
if ($in{'qubunc'} eq $i){ #質問文の更新
$qtemp[0] = $in{'qubun'};
}
if ($in{'qtyc'} eq $i){ #回答方法の更新
$qtemp[2] = $in{'aadd'};
$qtemp[3] = $in{'rc'};
if ($in{'sort'} && $qtemp[3] !~ m/sort/){
$qtemp[3] .= '=sort'; #ソート有無の変更
}elsif (!$in{'sort'}){
$qtemp[3] =~ s/=sort//;
}
if ($in{'sosu'} && $qtemp[3] !~ m/sosu/){
$qtemp[3] .= '=sosu'; #投票総数表示有無の変更
}elsif (!$in{'sort'}){
$qtemp[3] =~ s/=sosu//;
}
}
print "\n
";
print "\n"; #結果表示
for ($j=1;$j<=$qtemp[1];$j++){
$wari[$j]=0;
if ($tothyo>0) {
$wari[$j]=sprintf("%.1f",$hyotmp[$j]*100/$tothyo);
}
$width = int ( 3 * $wari[$j] );
print "\n
\n\n";
print "\n\n";
push(@qtemp,"\n"); #行末に改行をつける
$qset[$i]=join(",",@qtemp); #行データを更新する
} #質問ごとの処理の終了
print " \n";
}
print "$anstmp[$j] ";
print "$hyotmp[$j] 票 ";
if ($qtemp[3] =~ m/radio/){
print "$wari[$j] % ";
}
print " \n";
print "\n";
print "
\n";
print "[質問を追加する]
\n";
print "\n\n";
#メッセージの処理
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }
@tnaiyo = split(/
/,$qset[$qkazu+1],$mkazu+1);
if($in{'toko'} ne ''){ #メッセージ更新
unshift (@tnaiyo,"$in{'tname'}/$in{'toko'} [$jikanl][$host]");
}
splice (@tnaiyo,$mkazu);
if ($in{'todel'} ne ''){
$tnaiyocp = $tnaiyo[$in{'todel'}-1];
$tnaiyocp =~ tr/<> //d;
if ($tnaiyocp eq $in{'todelnai'}){
splice (@tnaiyo,$in{'todel'}-1,1); #投稿内容の削除
}else{
print "新規投稿がありました。確認してください。データ保護のため投稿を削除しません。\n";
}
}
$tnkazu = @tnaiyo;
if ($mkazu > 0){
print "
\n";
print "ご意見・ご感想をどうぞ
\n";
if ($tnkazu == 0){
print "(現在 発言はありません)\n";
}
}
for ($i=1;$i<=$tnkazu;$i++){
print "\n\n";
}
$qset[$qkazu+1] = join('
',@tnaiyo);
$qset[$qkazu+1] = "$qset[$qkazu+1]\n";
$qset[$qkazu+2]="$qset[$qkazu+2]\n";
$qset[$qkazu+3]="$qset[$qkazu+3]\n"; #末データ処理
$qset[$qkazu+4]="$qset[$qkazu+4]\n"; #末データ処理
$qset[$qkazu+5]="$qset[$qkazu+5]\n"; #末データ処理
$qset[$qkazu+6]="$qset[$qkazu+6]\n"; #末データ処理
$qset[$qkazu+7]="$qset[$qkazu+7]\n"; #末データ処理
#データファイル更新
open (OUT,">$logfile") || &error("ログファイルを開けません");
print OUT @qset;
close(OUT);
&unlock if ($lockkey); # ロック解除
&foot;
}
#----------------------------------
#入力情報の解析
#----------------------------------
sub decode{
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }
open (IN,"$logfile") || &error("ログファイルを開けません");
@qset=
(既にすべての選択肢が削除されている場合、1回 票数リセットを行ってみてください。)');
}else{
push (@delque,$value); #質問の消去
}
}
}
if ($in{'mode'} eq 'tohyo'){ #回答情報の不備をチェック
for ($i=1;$i<=$qset[0];$i++){
if ($input[$i] != 1){
&error("$i 番目の質問が未解答です");
}
if ($addc[$i] == 1 && $in{"add$i"} eq ''){
&error("$i 番目の質問の選択肢に追加したい内容が書かれていません");
}
}
if ($in{'tname'} eq '' && $in{'toko'} ne ''){
&error('メッセージにお名前がありません');
}
}
if ($in{'mode'} eq 'kanri'){ #回答情報の不備をチェック
for ($i=1;$i<=$qset[0];$i++){
if ($addc[$i] == 1 && $in{"add$i"} eq ''){
&error("$i 番目の質問の選択肢に追加したい内容が書かれていません");
}
}
if ($in{'k_mode'} eq 'bunadd' && $in{'addque'} eq ''){
&error("追加する質問文に内容がありません");
}
}
$mode = $in{'mode'};
}
#----------------------------------
#時間読み込み
#----------------------------------
sub jikan{
#更新履歴用
($sec,$min,$hour,$mday,$mon,$year,) = localtime;
$mon++;
$mon = sprintf("%.2d",$mon);
$mday = sprintf("%.2d",$mday);
$hour = sprintf("%.2d",$hour);
$min = sprintf("%.2d",$min);
$sec = sprintf("%.2d",$sec);
$year += 1900;
$jikanl = "$year/$mon/$mday $hour:$min:$sec";
}
#----------------------------------
#ヘッダ表示
#----------------------------------
sub head{
print "Content-type: text/html\n";
print "\n";
print <<"EOM";
\n";
if ($mail ne ''){
print "