ゲストブック

いよいよ本格的なCGIを使ったスクリプトです。ここでは, シェルスクリプトとPerlスクリプトを混ぜて使っています。 FORMでは,GETを使っています。Perlでの読みとりもそれを 前提にしていますが,PUTにすることも可能です。この場合, Perlでの読みとり方も変わります。

次のようなディレクトリ構成を前提にしてスクリプトの サンプルを作ってみました。

usr/local/httpd/
  |
  +--cgi-bin--+--getgbook.cgi....(2)
  |           +--showgbook.cgi...(3)
  |
  +--htdoc--cgi-test--gbook--+--index.html..(1)
                             +--guest.dat...(4)
名前とメールアドレスを入力してもらうページです。
(1) counter.cgi [rwxr-xr-x, 755]

  <head>
  <title>ゲストブック</title>
  </head>
  <body>
  <h1>ゲストブック</h1>
  
  <form method="get" action="/cgi-bin/getgbook.cgi"> ★
  あなたのお名前:<br>
  <input name="name"><br>
  あなたのメールアドレス:<br>
  <input name="address" size=30><p>
  <input type="submit" value="Add to Guest Book">
  </form>
  <hr>
  <I>by Shozo Fukada</I>
  </body>
★:getgbook.cgiは/cgi-bin/に置きます。

入力されたデータをファイルに格納します。
(2) getgbook.cgi [rwxr-xr-x, 755]


  #!/usr/local/bin/perl
  
  print "Content-type: text/html\n\n";
  
  $arg = $ENV{'QUERY_STRING'};
  @item = split('&', $arg);
  foreach (@item) {
  	($tag, $value) = split(/=/, $_, 2);
  	$value =~ s/\+/ /g;
  	$value =~ s/%([0-9A-Fa-f]{2})/pack("H2", $1)/eg;
  	eval("\$$tag = \"$value\"");
  }
  
  open(OUT, ">>/usr/local/httpd/htdocs/cgi-test/gbook/guests.dat");  ★
  print OUT "$name (<a href=\"mailto:$address\">$address</a>)<br>\n";
  close(OUT);
  
  print <<EOF
  <h2>登録してありがとうございました。<br>
  ゲストブックは,<a href="showgbook.cgi">ここ</a>をみてください。</h2>
  <hr>
  <I>by Shozo Fukada</I>
  EOF
★:データファイルはフルパスを指定する必要があります。

ゲストブックの一覧を見るスクリプトです。
(3) showgbook.cgi [rwxr-xr-x, 755]


  #!/bin/sh
  echo Content-type: text/html
  echo
  DIR=/usr/local/httpd/htdocs/cgi-test/gbook ★
  
  cat <<EOF
  <head>
  <title>ゲストブック</title>
  </head>
  <body>
  
  <h1>ゲストブック</h1>
  <a href="/cgi-test/gbook/index.html">
  あなたもゲストブックに登録して下さい.</a>
  <hr>
  EOF
  
  cat $DIR/guests.dat
  
  cat <<EOF
  <hr>
  <I>by Shozo Fukada</I>
  </body>
  EOF
★:データファイルはフルパスを指定する必要があります。

ゲストブックに入力されたデータを保持しているファイルです。
(4) guest.dat [rw-rw-rw-, 666]
最初は,中身はからで結構です。
# touch guest.dat
で中身のないファイルを作ります。書き込みを許可しておくのを 忘れないようにしましょう。


Shozo Fukada(sfukada@educ.hiroshima-u.ac.jp)