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


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

 色々なスクリプトをお探しなら当サイトで検索

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

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

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

素材サイト検索
- SPECIAL THANKS -

TOPページFlashを制作して頂きました
[ バナー作成ドットコム ]

会員登録


会員登録とは、ユーザーがその会員登録システムに入会してさまざまな情報を得る仕組みのことです。
会員情報には、ID、パスワード、名前、メールアドレスを登録することにします。

また、このシステムの運営者が管理者としてアクセスした場合に全会員の情報を表示させます。

#!/usr/bin/perl

# 会員データ
$DATA_USER = 'user.cgi';

# 管理パスワード
$ADMIN_PASS = '7777';

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 Top {
   &Header();
   print <<E_O_M;
・<a href="test.cgi?m=Entry">新規登録</a><br>
<br>
<form action="test.cgi" method="POST">
<input type="password" name="pass"> <input type="submit" value="管理">
<input type="hidden" name="m" value="Admin">
</form>
</body>
</html>
E_O_M
}

# 会員登録フォームおよび処理
sub Entry {
   if(!$in{'f'}) {
      # フォームの表示
      &Header();
      print <<E_O_M;
<form action="test.cgi" method="POST">
希望ID <input type="text" name="id"><br>
パスワード<input type="password" name="pass"><br>
名前<input type="text" name="name"><br>
メールアドレス<input type="text" name="mail"><br>
<input type="hidden" name="f" value="1">
<input type="hidden" name="m" value="Entry">
<input type="submit" value="登録">
</form>
</body>
</html>
E_O_M

   } else {
      # 登録処理
      # エラーメッセージ
      $ERROR = '';

      # 会員データの読み込み
      &Get_User();
      # IDチェック
      $ERROR .= 'IDが入力されていません!<br>' unless($in{'id'});
      $ERROR .= 'IDが長すぎます' if(length($in{'id'}) > 20);
      # ID重複チェック
      $ERROR .= 'そのIDは既に使われています!<br>' if(exists($UserData{$in{'id'}}));
      # パスワードチェック
      $ERROR .= 'パスワードが入力させていません!<br>' unless($in{'pass'});
      $ERROR .= 'パスワードには半角英数字以外は使用できません!<br>' if($in{'pass'} =~ /[^0-9a-zA-Z]/);
      $ERROR .= 'パスワードが長すぎます' if(length($in{'pass'}) > 20);
      # 名前チェック
      $ERROR .= '名前が入力されていません!<br>' unless($in{'name'});
      $ERROR .= '名前が長すぎます!<br>' if(length($in{'name'}) > 40);
      # メールアドレスチェック
      $ERROR .= 'メールアドレスが不正です!
                 <br>' if($in{'mail'} !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/);
      $ERROR .= 'メールアドレスが長すぎます!<br>' if(length($in{'mail'}) > 100);

      # エラー処理
      if($ERROR) {
         print "Content-type: text/html\n\n$ERROR";
         exit;
      }

      # タグ削除
      $in{'name'} = &Del_Tag($in{'name'});

      # ユーザーデータに追加
      @tmp = ($in{'id'}, $in{'pass'}, $in{'name'}, $in{'mail'});
      $UserData{$tmp[0]} = \@tmp;

      # 会員情報の保存
      &Set_User();

      &Header();
      print "新規登録が完了しました。</body></html>";
   }
}

# 管理モード
sub Admin {
   # パスワード不一致ならエラー
   &Error('パスワードが違います!') if($in{'pass'} ne $ADMIN_PASS);

   # 会員データの読み込み
   &Get_User();
   # ヘッダー
   &Header();
   # ユーザーフラグ
   $f = 0;
   print <<E_O_M;
<table border="1">
<tr><td>ID</td><td>PASS</td><td>名前</td><td>メールアドレス</td></tr>
E_O_M
   foreach(keys %UserData) {
      # ユーザーが一人でもいるならユーザーフラグを真
      $f = 1;
      print "<tr><td>$UserData{$_}[0]</td><td>$UserData{$_}[1]</td>
      <td>$UserData{$_}[2]</td><td>$UserData{$_}[3]</td></tr>";
   }
   # ユーザーフラグが偽ならユーザー不在のメッセージ
   print "<tr><td colspan=\"4\">登録されたユーザーはありません</td></tr>" unless($f);
   print "</table></body></html>"; 
}

# 会員情報取得
sub Get_User {
   open(DATA, "< $DATA_USER");
   while(<DATA>) {
      chomp;
      my(@tmp) = split(/\t/);
      $UserData{$tmp[0]} = \@tmp;
   }
   close(DATA);
}

# 会員情報保存
sub Set_User {
   open(DATA, "> $DATA_USER");
   foreach(keys %UserData) {
      my($tmp) = $UserData{$_};
      print DATA join("\t", @$tmp)."\n";
   }
   close(DATA)
}

# ヘッダー出力関数
sub Header {
   print <<E_O_M;
Content-type: text/html

<html>
<head>
<title>$_[0]</title>
</head>
<body>
E_O_M
}

sub Del_Tag {
   $_[0] =~ s/<.+?>//g;
   return($_[0]);
}

# エラー出力関数
sub Error {
   print "Content-type: text/html\n\n";
   print "ERROR [$_[0]]\n";
   exit;
}

# モード分岐
if($in{'m'}) {
   my($m) = $in{'m'};
   # 指定されたモードへ
   &$m();
} else {
   # トップページへ
   &Top();
}

今回は今まで出てきた関数や機能などを織り交ぜて作成いたしました。また、新しい要素も加わっています。

まず、モード変更の仕様が変わりました。
$in{'m'} とはモードを分岐するための変数なのですが、ここに入っている文字列と同じ名前の関数を呼び出しています。
つまり、以前のように各モードに条件分岐をつける必要がなくなりました。
しかし、これにも弱点があります。もし、架空のモードを呼び出されてしまったら、
存在しない関数を呼び出すわけですから致命的エラーになります。
それを回避するために以下のスクリプトに書き換えることができます。

my($m) = $in{'m'};
if(defined(&$m)) {
   &$m();
} else {
   &Error('存在しないモードです!');
}

definedとは、指定された関数や変数が定義されていた場合に真を返す関数です。
存在しないモードへのアクセスは、トップページへ飛ばす。という処理もいいかもしれません。

次にユーザーデータの取り扱いです。
今回は、リファレンスを利用した擬似データベースを利用しています。
この方法ですと、データの取り扱いが非常に楽になり、ソースも簡素化することができます。
今回は、配列をリファレンスしましたが、ハッシュをリファレンスにし、擬似構造体なども再現することができます。

また、この会員登録のスクリプトでは、複数の場所から呼ばれるであろう処理は、ルーチンにまとめてあります。
こうすることで、後々に機能を追加したり、デバッグする際に非常に便利になりますので、ルーチン化に心がけましょう。

sozaiCLUB