のフリー、シェアCGI・PHPスクリプト・JavaScriptをキーワード、97のカテゴリーから検索できます。スクリプトの登録ご利用は一切無料です。


フリー、シェアCGI・PHPスクリプトをキーワード、96のカテゴリーから検索できます。

 スクリプトをお探しなら当サイトでOK

  •  フリー、シェアのCGI・PHPスクリプトをメインに検索。
  •  ランキングによる評価で人気のスクリプトを紹介。
  •  サンプル(ページ)によるダウンロード前の事前評価。
  •  お気に入りスクリプトへのパーソナルリンクの作成。

 スクリプト登録のメリット

  •  シェアスクリプトでも、掲載は一切無料。
  •  細かなカテゴリー(全97項目)で閲覧者に分かり易く分類。
  •  スクリプトを印象づけるサンプル(ページ)の登録が可能。
  •  ダウンロードランキングの実施による人気度の評価。

当サイトはQ&A掲示板(コミュニティ)の窓口を共有して下さるサイト様を募集しています。

[Q&A掲示板] 共有サイト様募集!

一言コメント


一言コメントには、先ほどのカウンターのデータの書きだしを応用して行います。
しかし、カウンターとは違い入力データの受け取り処理をする必要があります。

今回は、サブルーチンを使ってプログラムを書いてみます。

#!/usr/bin/perl

# コメントデータ
$DATA_COMMENT = 'comment.dat';


# デコード処理
if($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
} else {
   $query = $ENV{'QUERY_STRING'};
}
@args = split(/&/, $query);
foreach $i (@args) {
   ($name, $val) = split(/=/, $i);
   $name =~ tr/+/ /;
   $name =~ s/%([0-9a-fA-F]{2})/pack('C', hex($1))/eg;
   $val =~ tr/+/ /;
   $val =~ s/%([0-9a-fA-F]{2})/pack('C', hex($1))/eg;
   $in{$name} = $val;
}

# データ読み込み関数
sub Get_Comment {
   open(DATA, "< $DATA_COMMENT");
   eval{ flock(DATA, 1); };
   @COMMENT_DATA = <DATA>;
   chomp(@COMMENT_DATA);
   close(DATA);
}

# データ書き込み関数
sub Set_Comment {
   open(DATA, "+< $DATA_COMMENT") or open(DATA, ">> $DATA_COMMENT");
   eval { flock(DATA, 2); };
   seek(DATA, 0, 0);
   foreach(@COMMENT_DATA) {
      print DATA "$_\n";
   }
   truncate(DATA, tell(DATA));
   close(DATA);
}

# 出力関数
sub Out {
   # データ読み込み
   &Get_Comment();

   print "Content-type: text/html\n\n";

   print <<E_O_M;
<html>
<head>
<title>一言コメント</title>
</head>
<body>
E_O_M

   # コメント出力
   foreach(@COMMENT_DATA) {
      my(@tmp) = split(/\t/);
      print "NAME:$tmp[0]<br>\n";
      print "<br>\n";
      print "$tmp[1]\n";
      print "<hr>";
   }

   # フォームの出力
   print <<E_O_M;
<form action="test.cgi" method="POST">
名前 <input type="text" name="name" size="20"><br>
コメント <input type="text" name="comment" size="50"><br>
<input type="submit" value="書き込み">
</form>
</body>
</html>
E_O_M
}

# 書き込み処理関数
sub In {
   # データ読み込み
   &Get_Comment();

   # 末尾にデータを追加
   push(@COMMENT_DATA, "$in{'name'}\t$in{'comment'}");

   # データの書き込み
   &Set_Comment();

   print "Content-type: text/html\n\n";
   print "書き込みが完了しました!\n";
}

if($in{'name'} && $in{'comment'}) {
   &In();
} else {
   &Out();
}

サブルーチンに処理をまとめることで、スクリプトの見直しもかなり楽になったことかと思います。
処理をルーチン化するメリットは、同じ処理を何回も書きなおす必要がなくなるのはもちろんですが、最大のメリットは、
もしその処理がうまく動いていなかった場合、ルーチン化していない場合は、全個所を修正する必要がありますが、
ルーチン化した場合はそのルーチン内の処理を治すだけで修正できる点です。

今回から、デコード処理という部分が追加されました。これはCGIを作成する上では必ず必要になる処理です。
特に理解する必要性もないので、写すだけで十分です。

データ読み込み関数で @COMMENT_DATA = <DATA>; とありますが、これは各行を配列の要素1つずつに割り振り、
格納する処理です。
つまり、配列には $DATA_COMMENT のデータがすべて格納されるわけです。
そして、 chomp(@COMMENT_DATA); によって各行末にある改行文字のみを除去しています。

データ書き込み関数では、読み込み関数で定義した @COMMENT_DATA を1要素(行)ずつ保存して行っています。
ちなみに、読み込み時に改行文字を除去したため改めて改行させています。

まず、このCGIへアクセスした場合は、&Out 関数へアクセスされます。
これは、一言コメントの一覧と書き込みフォームを出力します。

&In 関数は、&Out て出力されたフォームで入力されたデータをファイルへ書き込み保存するという処理を行っています。

この二つの処理を分岐させているのが、一番最後の条件分岐の部分です。
名前とコメントが真(記入されている)である場合のみ、書き込み処理へ移行させています。

scriptEYE