5.条件分岐

参照 URL http://horiuchi.akira.ne.jp/cgi/giho-05-1.html http://horiuchi.akira.ne.jp/cgi/giho-05-2.html http://horiuchi.akira.ne.jp/cgi/giho-05-3.html
■概要  条件分岐によって異なる HTML 画面を出力させるには、内部または外部サブルーチンによってその 部分を記述するか、またはそれら各出力部分を独立した HTML ファイルとして用意しておき、ファイ ルのオープンによってその HTML 画面を出力するという方法をとります。本来ならば入力値の値によ って異なる CGI ファイルを開かせることができればいいのですが、現段階の CGI にはそういう命令 はないため、Perl プログラミングによって異なる HTML 画面を出力させることしかできません。  ファイルオープンによって指定した HTML ファイルを開かせることは可能ですが、会員専用のページ のようにセキュリティのあるページをこういった方法で開かせる訳にはいかないので、エラーメッセージ や、占いの結果のようなセキュリティの伴わないページにしか使用することはできません。  ここでは、生徒のみがアクセスできる学校のページ(時間割、試験範囲、補講、課題、追試等)へのログ インを行い、番号やパスワードが正しいか否かによって異なる HTML 画面を出力させてみます。また、番号、 パスワード共に未入力(空白)の場合に「正しい」となることを防ぐために「未入力」の処理を設け、「正し い」「誤り」のと合わせて、計3種類の判定を行っています。 例1:「内部サブルーチン」  エラーメッセージの HTML 出力を、内部サブルーチンを用いて処理します。 入力フォーム画面 giho-05-1.html
<HTML>
<HEAD>
<TITLE>Giho 05-1</TITLE>
<meta http-equiv="Content-Type" Content="text/html; charset=SHIFT_JIS">
</HEAD>
<BODY BGCOLOR="#7ffffe">
<FORM ACTION="giho-05-1.cgi" METHOD="POST">
<PRE>

<H2> 番号とパスワードの照合(1)</H2>
<HR>
 生徒番号  : <INPUT SIZE="16" MAXLENGTH="16" NAME="bango">

 パスワード: <INPUT TYPE="password" SIZE="16" MAXLENGTH="16" NAME="pass">

<HR>
 <INPUT TYPE="submit" VALUE="login">

 (生徒番号, パスワード) = 
 (20031101, abc1101), (20031102, abc1102), ・・・, (20031110, abc1110) / 10 件
 (20031201, abc1201), (20031202, abc1202), ・・・, (20031210, abc1210) / 10 件
</PRE>
</FORM>
</BODY>
</HTML>
CGI 画面 giho-05-1.cgi
#!/usr/local/bin/perl

require 'cgi-lib.pl';
&ReadParse(\%moji);

# パスワード表の呼び出し
  open F, "id-pass.txt";
  %id = split /,/, <F>;

print &PrintHeader;

# エラー処理
# 両方とも空白
  if ($id{$moji{bango}} eq '')
    {$message = 'この番号は登録されていません'; &err}

# パスワード違い
  elsif ($id{$moji{bango}} ne $moji{pass})
    {$message = 'パスワードが正しくありません'; &err}


# 本文(マッチした場合)
print <<EOH;
<HTML>
<HEAD>
<TITLE>Giho 05-1-match</TITLE>
<meta http-equiv="Content-Type" Content="text/html; charset=SHIFT_JIS">
</HEAD>
<BODY BGCOLOR="#7ffffe">
<BR>
<CENTER>
<H2>ASUKA 学園 へようこそ!</H2>
<CENTER>
EOH
print &HtmlBot;
exit;


# サブルーチン/エラー出力
 sub err {
print <<EOH;
<HTML>
<HEAD>
<TITLE>Giho 05-1-err</TITLE>
<meta http-equiv="Content-Type" Content="text/html; charset=SHIFT_JIS">
</HEAD>
<BODY BGCOLOR="#7ffffe">
<BR>
<H2> * $message *</H2>
 <A HREF="giho-05-1.html">戻る</A>
EOH
print &HtmlBot;
exit}
例2:「外部サブルーチン」  エラー処理を外部サブルーチン化し、汎用性を持たせた形で色々な場面で使えるように してみました。サブルーチンの引数は順に、パスワード表の "ファイル名" 、入力された番号、入力された パスワード、戻り番地の "URL" となっています。 入力フォーム画面 → 例1と同じ giho-05-2.html → giho-05-2.cgi に対して同様の処理を行う CGI 画面 → 例1と同じ giho-05-2.cgi
#!/usr/local/bin/perl

require 'cgi-lib.pl';
&ReadParse(\%moji);

# エラー処理/外部サブルーチンの呼び出し
 $hyo = 'id-pass.txt';
 $url = 'giho-05-2.html';
 require 'pass_err.pl';
 &pass_err($hyo, $moji{bango}, $moji{pass}, $url);

# 本文(マッチした場合)
print &PrintHeader;
print <<EOH;
<HTML>
<HEAD>
<TITLE>Giho 05-2-match</TITLE>
<meta http-equiv="Content-Type" Content="text/html; charset=SHIFT_JIS">
</HEAD>
<BODY BGCOLOR="#7ffffe">
<BR>
<CENTER>
<H2>ASUKA 学園 へようこそ!</H2>
<CENTER>
EOH
print &HtmlBot;
外部サブルーチン pass_err.pl
# pass_err.pl

# 番号とパスワードのエラーチェック

 sub pass_err
{
 my $ban, $hyo, %id, $mess, $pass, $url;
 ($hyo, $ban, $pass, $url) = @_;

# パスワード表の呼び出し
  open F, "$hyo";
  %id = split /,/, <F>;
  close F;

# 両方とも空白
  if ($id{$ban} eq '')
    {$mess = 'この番号は登録されていません'}

# パスワード違い
  elsif ($id{$ban} ne $pass)
    {$mess = 'パスワードが正しくありません'}

# エラーなし
  else {return}

# エラーメッセージ出力
print &PrintHeader;
print <<EOH;
<HTML>
<HEAD>
<TITLE>ID PASSWORD ERROR</TITLE>
<meta http-equiv="Content-Type" Content="text/html; charset=SHIFT_JIS">
</HEAD>
<BODY BGCOLOR="#7ffffe">
<BR>
<H2> * $mess *</H2>
 <A HREF="$url">戻る</A>
EOH
print &HtmlBot;
exit}

1;
例3:「外部ファイル(HTML)のオープン」  各エラーの内容を記述した HTML ファイルを外部ファイルとして用意しておき、オープン命令 によってそれらを表示させます。 入力フォーム画面 → 例1と同じ giho-05-3.html → giho-05-3.cgi に対して同様の処理を行う CGI 画面 → 例1と同じ giho-05-3.cgi
#!/usr/local/bin/perl

require 'cgi-lib.pl';
&ReadParse(\%moji);

# パスワード表の呼び出し
  open F, "id-pass.txt";
  %id = split /,/, <F>;

print &PrintHeader;

# エラー処理
  # 両方とも空白
    if ($id{$moji{bango}} eq '')
      {open F, 'giho-05-3-null.html'; print <F>; exit}

  # パスワード違い
    elsif ($id{$moji{bango}} ne $moji{pass})
      {open F, 'giho-05-3-err.html'; print <F>; exit}

# 本文(マッチした場合)
print <<EOH;
<HTML>
<HEAD>
<TITLE>Giho 05-3-match</TITLE>
<meta http-equiv="Content-Type" Content="text/html; charset=SHIFT_JIS">
</HEAD>
<BODY BGCOLOR="#7ffffe">
<BR>
<CENTER>
<H2>ASUKA 学園 へようこそ!</H2>
<CENTER>
EOH
print &HtmlBot;
外部ファイル (HTML ファイル) giho 05-3-null.html
<HTML>
<HEAD>
<TITLE>Giho 05-3-null</TITLE>
<meta http-equiv="Content-Type" Content="text/html; charset=SHIFT_JIS">
</HEAD>
<BODY BGCOLOR="#7ffffe">
<PRE>

<H2> * この番号は登録されていません *</H2>

 <A HREF="giho-05-3.html">戻る</A>
</PRE>
</BODY>
</HTML>
giho 05-3-err.html
<HTML>
<HEAD>
<TITLE>Giho 05-3-err</TITLE>
<meta http-equiv="Content-Type" Content="text/html; charset=SHIFT_JIS">
</HEAD>
<BODY BGCOLOR="#7ffffe">
<PRE>

<H2> * パスワードが正しくありません *</H2>

 <A HREF="giho-05-3.html">戻る</A>
</PRE>
</BODY>
</HTML>