質問者 はな
投稿日 10/1(火) 11:58:22
簡易データベースを改造しています。
入力項目は一つだけに簡素化した物ですが、
入力された日本語のデータが既に入力された物か、
新しいデータなのかチェックをしたいのですが、上手く出来ません。
現在、入力チェックを全然行わない物は完成しているのですが、
これは同じデータを幾つでも登録可能です。
#!/usr/local/bin/perl
#
#-----------------------------------------------------------------------------------
#日本語コード処理ライブラリ
require './jcode.pl';
#データベースファイル
$file = "./data.dat";
#このファイルの名前
$prog = $ENV{ 'SCRIPT_NAME' };
#<body>設定
$body = '<BODY>';
#タイトル
$title = 'データ登録';
#パスワード
$pass = '1234';
#戻りたいところ
$url = './home.html';
#-----------------------------------------------------------------------------------
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); }
else { $buffer = $ENV{'QUERY_STRING'}; }
if ($buffer eq "") {
print "Content-type: text/html\n\n";
print "<html><head><title>$title</title></head>\n";
print "$body\n";
print "<form method=\"POST\" action=$prog>\n";
print<<"_EOF_";
<p>パスワードを入力してください。<br>
<input type="password" name="pwd"></p>
<input type="hidden" name="code" value="pass">
<input type="submit" value="送信"><input type="reset" value="リセット">
</form>
_EOF_
print "<hr noshade><p>[<a href=$url>TOP</a>]</p>\n";
print "</body></html>\n";
exit;
}
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value,'sjis');
$FORM{$name} = $value;
}
if (($FORM{'code'} eq "pass")&&($pass != $FORM{'pwd'})) {&error('エラー','パスワードが違います。'); }
if ($FORM{'code'} eq "pass") {
print "Content-type: text/html\n\n";
print "<html><head><title>$title</title></head>\n";
print "$body\n";
print "<form method=\"POST\" action=$prog>\n";
print<<"_EOF_";
<p>追加したいデータ:<input type="text" name="s_name" size=60></p>
<input type="hidden" name="code" value="tou">
<input type="submit" value="送信"><input type="reset" value="リセット">
</form>
_EOF_
print "<hr noshade><p>[<a href=$url>TOP</a>] [<a href=$prog>最初から</a>]</p>\n";
print "</body></html>\n";
exit;
}
if ($FORM{'code'} eq "tou") {
$s_name = $FORM{'s_name'};
if ($s_name eq ''){ &error('エラー','データを入力してください。'); }
#書きこむ
if (!open(OUT,">>$file")) { &error('システムエラー','ファイルを書きこみオープンできません.'); }
print OUT "$s_name\n";
close(OUT);
#メッセージ出力
print "Content-type: text/html\n\n";
print "<html><head><title>$title</title></head>\n";
print "$body\n";
print "<p class=dai>登録しました</h2>\n";
print "<hr noshade><p>[<a href=$url>TOP</a>] [<a href=\"javascript\:history\.back\(\)\;\">一つ前に</a>] [<a href=$prog>最初から</a>]</p>\n";
print "</body></html>\n";
exit;
}
sub error {
print "Content-type: text/html\n\n";
print "<html><head><title>$title</title></head>\n";
print "$body\n";
print "<p class=dai>$_[0]</p>\n";
print "<p class=cyu>$_[1]</p>\n";
print "<p>ブラウザの[戻る]ボタンを押して前の画面に移動してください。</p>\n";
print "</body></html>\n";
exit;
}
当初、空白データの場合エラーを出す処理のすぐ下に、
if (!open(IN,"$file")) { &error('データベース読取エラー','復旧をお待ちください.'); }
@BASE = <IN>;
close(IN);
foreach $num (@BASE) {
$data = $BASE[$num];
if ($s_name == $data ) { push(@NEW,$data); }
}
if (@NEW) { &error('入力エラー','既に同じ名が登録されています。'); }
という一文を入れていました。
すると、どんなデータでも既に同じ名が〜と表示されます。
データはSJISです。
上記のチェックをしなければ登録も、そのデータを他のCGIで使用することも可能です。
これらは、現在まだAN HTTPでテストしただけです。
サーバにはアップしていません。
どうぞ教えてください。お願いします。
プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:秀丸エディタ
FTPソフト:NEXT FTP
サーバ移転:していない
改造:している 改造前正常動作
CGI習熟度:advanced
|