本日  昨日
 
03/16(Sun) 02:26

CGI Tips 集
このページは私が今までに設置したCGIで適用した、あると便利なちょっとした機能追加の方法をTips集として汎用的に使えるようまとめたものです。あなたのCGIの改造にお役に立てれば幸いです。

各スクリプトはマウスでドラッグして「コピー」し、エディタに「貼りつけ」るとコピーできます。
No項目機能
1アクセス時刻の表示ページにアクセスした時刻を表示する
2過去の日付情報の取得フォーム入力された今日より n日前の日付情報を取得する
3ファイルの最終更新時刻の取得指定したファイルの最終更新時刻を取得する
4メールのフォーマットチェックフォーム入力されたメールアドレス形式が正しいかチェックする
5IPアドレスによる投稿排除いたずらなどで困った時にIPアドレス指定による投稿排除をする
6サーバエラーのメッセージ表示newInternal Server Errorのエラー情報を表示する

アクセス時刻の表示
表示形式は 9月23日(土)07時56分 です。
# 時刻表示 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time + 9*3600); @week = ('日','月','火','水','木','金','土'); $date_now = sprintf("%01d月%01d日(%s)%02d時%02d分",$mon +1,$mday,$week[$wday],$hour,$min); # 表示したい場所に以下を記述 print "<P ALIGN=right><FONT SIZE=2><I>$date_now</I></FONT></P>\n";

過去の日付情報の取得
<FORM METHOD="GET" ACTION="このxxxx.cgi">
<INPUT SIZE=2 TYPE="text" NAME="date">に n日前のデータが入力されるとします。
日付形式は 9/23(土)07:56 です。あなたの欲しい形式に変更して下さい。
# 環境変数取得 $buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $FORM{$name} = $value; } # n日前の日付情報の取得 ($sec,$min,$hour,$mday,$mon,$year,$wday,$suu) = gmtime(time + 9*3600-$FORM{'date'}*60*60*24); @week = ('日','月','火','水','木','金','土'); $date_old = sprintf("%01d/%01d(%s)%02d:%02d",$mon +1,$mday,$week[$wday],$hour,$min);

ファイルの最終更新時刻の取得
ファイルのサイズや作成日付などのステータス情報を調べる stat命令を使います。
最終更新時刻は$FILESTAT[9]で得られます。ちなみに、サイズは$FILESTAT[7]、作成日付は$FILESTAT[10]です。
日付形式は 98/09/23 です。あなたの欲しい形式に変更して下さい。
# ファイル xxx.html のステータス情報の取得 # 最終更新時刻は$FILESTAT[9]で得られる @FILESTAT = stat('xxx.html'); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=gmtime($FILESTAT[9] + 9*3600); $up_date = sprintf("%02d/%02d/%02d",$year + 1900,$mon + 1,$mday);

メールのフォーマットチェック
$email =~ /(.*)\@(.*)\.(.*)/)でメールアドレスの形式が aaa@bbb.ccc であるかをチェックします。
# 訪問者の名前($name)やメールアドレス($email)が無い # 場合は入力エラーにする if ($name eq "" || $email eq "" || !($email =~ /(.*)\@(.*)\.(.*)/) ) { print &print_sjis(<<EOF); <TITLE>入力エラー</TITLE> <BODY BGCOLOR="#FFE4C4"> <h1>入力ミス</h1><h3> EOF if ($name eq "") {print "お名前を入力して下さい。<br>\n";} if ($email eq "") {print "メールアドレスを入力して下さい。<br>\n";} if ($email ne "" && !($email =~ /(.*)\@(.*)\.(.*)/)) {print "メールアドレスが正しく記入されていません。<br>\n";} print &print_sjis(<<EOF); <p>ブラウザの「戻る」ボタンで戻り確認してください。 EOF exit; }

IPアドレスによる投稿排除
投稿排除するIPアドレスリストで指定された(123.456.789.0、123.456.789.1)からの投稿を排除します。
この指定は前方一致です。例えば@deniedaddrs = ('123.456.789.0','124.356');と設定することにより,123.456.789.0及び124.356.*.*からの投稿を排除することができます。(*は任意の数字に一致する)
# 投稿排除判別 @deniedaddrs = ('123.456.789.0','123.456.789.1');# 投稿排除するIPアドレスリスト $addr = $ENV{'REMOTE_ADDR'}; foreach(@deniedaddrs){ if($addr =~ /^$_/ && length($_) > 4){ print "あなたのアドレス $addr は投稿制限の対象となっています。<br>"; print "投稿したい場合は管理人に連絡してください。\n"; exit; } }

サーバエラーのメッセージ表示
Internal Server Error といわれても何がなんだかわかりません。 このエラーが出たときは、perlのパス指定の次の行(2行目以降)に次のものを加えるとエラー情報の詳細を表示することができます。
#!/usr/bin/perl # エラー情報の詳細表示 BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); }


 
 
©1997- Kikuchisan's workshop All rights reserved //

スポンサーリンク

関連コンテンツ