#!/usr/bin/perl #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ # FAQ2 Ver. 1.0 # Copyright Mikazo's Box # E-mail webmaster@mikazo.net # URL http://www.mikazo.net/ #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ $home = "http://www.denno-cabinet.com/"; # 戻りのURL $title_txt = "FAQ-よくある質問"; # タイトル $title_img = ""; # タイトル画像のファイル名(使用しない場合は""にしてください) $img_w = ""; # タイトル画像の幅 $img_h = ""; # タイトル画像の高さ $tagkey = 1; # タグ(0:不可 1:可) $pwd = "datacabi"; # 管理人用パスワード(必ず変えてください)でないと私が遊んじゃうよん♪ $page = 10; # カテゴリ表示時の1ページの件数 @week = ('日','月','火','水','木','金','土'); # 週の表示方法 $list_style = "UL"; # 一覧表示時に質問のリスト(UL または OL) $sort_flg = 1; # ソート順(0:昇順 1:降順) $msg_flg = 0; # 管理人からのお知らせ(0:表示しない 1:表示する) $target = "_top"; # 記事からのリンクする時のターゲット指定 # カテゴリ $category[0] = "お\申\\込\前のよくある質問"; $category[1] = "機\能\に関するよくある質問"; $script = "./faq2.cgi"; # スクリプトファイル $logfile = "./faq2log.cgi"; # データファイル $msgfile = "./kanri.cgi"; # 管理人からのお知らせファイル $cssfile = "./form.css"; # CSSファイル $lockfile = "./file.lock"; # ロックファイル require './jcode.pl'; # jcode.plが同一ディレクトリにない場合だけ変更 #------------------------------------------------------------------------ # 処理です。 #------------------------------------------------------------------------ &decode; $cate_no = -1; if ($data{'cate_no'} ne "") { $cate_no = $data{'cate_no'}; if ($cate_no > $#category) { $cate_no = -1; } } if ($data{'action'} eq "admin") { # 管理モード if ( $data{'pass'} ne $pwd ) { &error("管理パスワードが不正です"); } if ($data{'proc'} eq "admin_mainte") { # 編集画面 &admin_mainte; } elsif ($data{'proc'} eq "write") { # 書き込み &write; } elsif ($data{'proc'} eq "kanri_msg") { # 管理人からのお知らせ入力画面 &kanri_msg; } elsif ($data{'proc'} eq "msg_write") { # 管理人からのお知らせ登録 &msg_write; } } elsif ($data{'action'} eq "answer") { # 個別表示 &answer; } elsif ($data{'action'} eq "category") { # カテゴリ毎に表示 &category; } &list; exit; #------------------------------------------------------------------------ # デコード #------------------------------------------------------------------------ sub decode { if($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{CONTENT_LENGTH}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 文字コードをS-JIS変換 &jcode'convert(*value, "sjis", "", "z"); # タグ処理 if (($tagkey == 1) || ($name eq "message")) { $value =~ s/<>/<>/g; } else { $value =~ s//>/g; } # 改行等処理 if (($name eq "answer") || ($name eq "message")) { $value =~ s/\r\n/
/g; $value =~ s/\r/
/g; $value =~ s/\n/
/g; } else { $value =~ s/\r//g; $value =~ s/\n//g; } $data{$name} = $value; } } #------------------------------------------------------------------------ # 質問一覧表示 #------------------------------------------------------------------------ sub list { # ヘッダ &header(0); print "
\n"; # 質問一覧の表示の表示 # 管理人メッセージ if ($msg_flg) { &kanri_view; } &readfile($sort_flg); # ファイルのオープン $cate_w = ""; print "
\n"; foreach (@dat) { ($no,$cate,$question,$answer,$indate) = split(/<>/,$_); if ($cate ne $cate_w) { if ($cate_w ne "") { print "\n"; } print "\n<$list_style class=\"list\">\n"; } print "
  • $question\n"; $cate_w = $cate; } if ($cate_w eq "") { print "
    データがありません
    "; } else { print "\n"; } print "
  • \n
    \n"; &admin_form("new"); # フッダ &footer; } #------------------------------------------------------------------------ # 管理人パスワード入力フォーム #------------------------------------------------------------------------ sub admin_form { print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "

    \n"; } #------------------------------------------------------------------------ # カテゴリ毎に表示 #------------------------------------------------------------------------ sub category { if ($cate_no < 0) { &error("カテゴリが不正です"); } &readfile($sort_flg); # ヘッダ &header(1); print "
    \n"; # 管理人メッセージ if ($msg_flg) { &kanri_view; } print "

    \n"; print "

    \n"; print "\n"; print "\n"; print "\n"; print "

    \n"; $scnt = 0; if ($data{'start'} ne "") { $scnt = $data{'start'}; } $ecnt = $scnt + $page - 1; if ($ecnt > $#dat) { $ecnt = $#dat; } $cnt = -1; $next_flg = 0; $back_flg = 0; foreach (@dat) { ($no,$cate,$question,$answer,$indate) = split(/<>/,$_); if ($cate eq $cate_no) { $cnt++; } else { next; } if ($cnt < $scnt) { $back_flg = 1; next; } if ($cnt > $ecnt) { $next_flg = 1; next; } &format; } print "\n"; if ($back_flg) { # BACKを表示 $back = $scnt - $page; print "\n"; } if ($next_flg) { # NEXTを表示 $next = $scnt + $page; print "\n"; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "
    \n"; &admin_form("new"); # フッダ &footer; exit; } #------------------------------------------------------------------------ # 個別表示 #------------------------------------------------------------------------ sub answer { &readfile($sort_flg); if ($#dat < 0) { &error("データがありません"); } # ヘッダ &header(2); print "
    \n"; foreach (@dat) { ($no,$cate,$question,$answer,$indate) = split(/<>/,$_); if ($no eq $data{'no'}) { print "
    ■$category[$cate]■
    \n"; &format; } } print "
    \n"; &admin_form("$data{'no'}"); # フッダ &footer; exit; } #------------------------------------------------------------------------ # 答えのフォーマット #------------------------------------------------------------------------ sub format { &date("$indate"); $answer =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/A>/g; print "\n"; print "\n"; print "\n"; print "
    $question
     
    \n"; print "$answer\n


    \n"; } #------------------------------------------------------------------------ # 記事の編集 #------------------------------------------------------------------------ sub admin_mainte { &readfile($sort_flg); # ヘッダ &header(3); print "
    \n"; if ($data{'no'} ne "new") { # データの検索 foreach (@dat) { (@work) = split(/<>/,$_); if ($data{'no'} eq $work[0]) { $no = $work[0]; $cate = $work[1]; $question = $work[2]; $answer = $work[3]; $answer =~ s/\/\n/g; last; } } } else { $no = "new"; $cate = "-1"; $question = ""; $answer = ""; } print "
    \n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; if ($no ne "new") { print "\n"; } print "\n"; print "
    カテゴリ
    質問
    回答
    \n"; print "
    削除
    \n"; print "
    \n
    \n"; # 質問一覧の表示の表示 $cate_w = ""; print "
    \n"; if ($data{'no'} ne "new") { print "<$list_style class=\"list\">\n"; print "
  • 新規\n"; print "\n"; } # カテゴリリスト print "<$list_style class=\"list\">\n"; for ( $i = 0; $i <= $#category; $i++ ) { $cate_id = sprintf("%05d",$i); print "
  • $category[$i]\n"; } print "\n"; foreach (@dat) { ($no,$cate,$question,$answer,$indate) = split(/<>/,$_); if ($cate ne $cate_w) { if ($cate_w ne "") { print "\n"; print "\n"; } $cate_id = sprintf("%05d",$cate); print "\n<$list_style class=\"list\">\n"; } print "
  • $question\n"; $cate_w = $cate; } if ($cate_w ne "") { print "\n"; print "\n"; } print "
  • \n
    \n"; # フッダ &footer; exit; } #------------------------------------------------------------------------ # ファイルに書きこみ #------------------------------------------------------------------------ sub write { # 必須項目のチェック if ($data{'category'} < 0) { &error("カテゴリを選択して下さい。"); } if ($data{'question'} eq "") { &error("質問を入力して下さい。"); } if ($data{'answer'} eq "") { &error("回答を入力して下さい。"); } &lock; #日付の取得 $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $syear = sprintf("%02d",$year + 1900); $smonth = sprintf("%02d",$mon + 1); $sday = sprintf("%02d",$mday); $shour = sprintf("%02d",$hour); $smin = sprintf("%02d",$min); # ファイルのオープン &readfile(-1); if ($data{'no'} eq "new") { # 最大値の取得 (@maxget) = split(/<>/,$dat[0]); $maxget[0]++; $no = $maxget[0]; $indate = $syear.$smonth.$sday.$shour.$smin; $dat = "$no<>$data{'category'}<>$data{'question'}<>$data{'answer'}<>$indate\n"; unshift(@dat,$dat); @new = @dat; } else { @new = (); # データの検索 foreach (@dat) { ($no,$cate,$question,$answer,$indate) = split(/<>/,$_); if ($data{'no'} eq $no) { if ($data{'del'} eq "") { $indate = $syear.$smonth.$sday.$shour.$smin; push(@new,"$no<>$data{'category'}<>$data{'question'}<>$data{'answer'}<>$indate\n"); } } else { push(@new,"$_"); } } } if ( !(open(OUT,">$logfile")) ) { &unlock; &error("データファイル[$logfile]がオープン出来ません"); } print OUT @new; close(OUT); &unlock; &refresh; } #------------------------------------------------------------------------ # ファイルのオープン #------------------------------------------------------------------------ sub readfile { # リストファイルを開いて読んで閉じる if ( !(open(RD,"$logfile")) ) { &error("データファイル[$logfile]がオープン出来ません"); } @work=; close(RD); if ($_[0] < 0) { @dat = sort { (split /<>/, $b)[0] <=> (split /<>/, $a)[0] } @work; } elsif ($_[0] == 0) { @dat = sort { (split /<>/, $a)[1] <=> (split /<>/, $b)[1] || (split /<>/, $a)[4] <=> (split /<>/, $b)[4] } @work; } else { @dat = sort { (split /<>/, $a)[1] <=> (split /<>/, $b)[1] || (split /<>/, $b)[4] <=> (split /<>/, $a)[4] } @work; } } #------------------------------------------------------------------------ # ヘッダー #------------------------------------------------------------------------ sub header { print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "$title_txt\n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print ' 大容量にも使える!ファイル転送・ファイル共有サービス 〜電脳デタキャビ〜

    大容量のファイル転送・ファイル共有サービスを、ブラウザベースで分かりやすくご提供いたします。

    大容量ファイル転送・共有サービス「デタキャビ」
    大容量ファイル転送・共有サービス「デタキャビ」の説明大容量ファイル転送・共有サービス「デタキャビ」の活用事例大容量ファイル転送・共有サービス「デタキャビ」の料金プラン大容量ファイル転送・共有サービス「デタキャビ」のお申込み大容量ファイル転送・共有サービス「デタキャビ」の無料トライアル大容量ファイル転送・共有サービス「デタキャビ」へのログイン
    '; if ($_[0] == 1 ) { print " [一覧表\示]\n"; } elsif ($_[0] == 3) { print " [管理人メッセージ編集]"; } if ($_[0] >= 2) { print " [戻る]\n"; } print "\n"; print "

    "; if ($title_img eq '') { } else { print "\"$title_txt\""; } print "

    \n"; } #------------------------------------------------------------------------ # フッター #------------------------------------------------------------------------ sub footer { print "
    \n"; print '
    '; print "
    \n"; print "\n"; print "\n"; } #------------------------------------------------------------------------ # エラー #------------------------------------------------------------------------ sub error { &header(""); print "

    \n"; print "$_[0]


    \n"; print "
    戻る\n"; print "

    "; &footer; exit; } #------------------------------------------------------------------------ # ロック #------------------------------------------------------------------------ sub lock { foreach (1 .. 5) { if (-e $lockfile) { # ファイル使用中しばらく待機 sleep(1); } else { # 書きこみOK♪ open(LOCK,">$lockfile"); close(LOCK); return; } } &error("他の方が書き込み中です。"); } #------------------------------------------------------------------------ # ロック解除 #------------------------------------------------------------------------ sub unlock { if (-e $lockfile) { unlink $lockfile; } } #------------------------------------------------------------------------ # リフレッシュ♪(二重投稿禁止用) #------------------------------------------------------------------------ sub refresh { print "Content-type: text/html\n\n"; print ""; exit; } #------------------------------------------------------------------------ # 管理人メッセージの表示 #------------------------------------------------------------------------ sub kanri_view { if ( !(open(RD,"$msgfile")) ) { &error("データファイル[$msgfile]がオープン出来ません"); } @msg=; close(RD); ($title,$message,$indate) = split(/<>/,$msg[0]); &date("$indate"); $message =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/A>/g; print "
    \n"; print "
    $title
    \n"; print "
    $message
    \n"; print "
    $date
    \n"; print "

    \n"; } #------------------------------------------------------------------------ # 管理人メッセージの入力 #------------------------------------------------------------------------ sub kanri_msg { # 管理人からのお知らせ if ( !(open(RD,"$msgfile")) ) { &unlock; &error("データファイル[$msgfile]がオープン出来ません"); } @msg=; close(RD); ($title,$message,$indate) = split(/<>/,$msg[0]); &date("$indate"); $message =~ s/\/\n/g; $menu = " [
    戻る]\n"; &header($menu); print "
    \n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    タイトル
    コメント
    \n"; print "



    "; &footer; exit; } #------------------------------------------------------------------------ # 管理人メッセージに書きこみ #------------------------------------------------------------------------ sub msg_write { # 必須項目のチェック if ($data{'message'} eq "") { &error("メッセージを入力して下さい。"); } &lock; # ファイルのオープン if ( !(open(RD,"$msgfile")) ) { &unlock; &error("データファイル[$msgfile]がオープン出来ません"); } @msg=; close(RD); #日付の取得 $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $syear = sprintf("%02d",$year + 1900); $smonth = sprintf("%02d",$mon + 1); $sday = sprintf("%02d",$mday); $shour = sprintf("%02d",$hour); $smin = sprintf("%02d",$min); $indate = $syear.$smonth.$sday.$shour.$smin; $dat = "$data{'title'}<>$data{'message'}<>$indate\n"; if ( !(open(OUT,">$msgfile")) ) { &unlock; &error("データファイル[$msgfile]がオープン出来ません"); } print OUT $dat; close(OUT); &unlock; &refresh; } #------------------------------------------------------------------------ # 日付フォーマット #------------------------------------------------------------------------ sub date { $yy = substr($_[0],0,4); $mm = sprintf("%d",substr($_[0],4,2)); $dd = sprintf("%d",substr($_[0],6,2)); $hh = sprintf("%d",substr($_[0],8,2)); $mi = sprintf("%02d",substr($_[0],10,2)); $date = "$yy/$mm/$dd"; # 曜日の取得 if ($mm<=2) {$yy--;$mm+=12;} $w = (($yy+int($yy/4)-int($yy/100)+int($yy/400)+int((13*$mm+8)/5)+$dd)%7); $ww = $week[$w]; $date = "$date($ww) $hh:$mi"; }