CGI-BBS > データベース > 簡易データベース > 簡易データベースで日本語データの入力・未入力チェックしたい。


カレッヂ
カレッヂ


質問者 はな  投稿日 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

質問者 はな  [削除]  投稿日 10/1(火) 13:42:28
自己レスですが、
一箇所間違いを見つけました。

foreach $num (@BASE) {
	$data = $BASE[$num];
	if ($s_name == $data ) { push(@NEW,$data); }
}
if (@NEW) { &error('入力エラー','既に同じ名が登録されています。'); }

これの、
if ($s_name == $data ) { push(@NEW,$data); }
ではなくて
if ($s_name eq $data ) { push(@NEW,$data); }
ですね。
(データは数値ではないので。)

しかし、そうすると、全てチェックを通り抜け、登録されてしまいます。
つまり、データの重複はないとみなされている?

どうぞよろしくお願いします。
質問者 はな  [削除]  投稿日 10/1(火) 15:00:42
転記時にもう一つ間違っていました。

foreach $num (@BASE) {
	$data = $BASE[$num];
	if ($s_name == $data ) { push(@NEW,$data); }
}
if (@NEW) { &error('入力エラー','既に同じ名が登録されています。'); }

これの、
foreach $num (@BASE) {
の上には
$num = 0;
があります。これが落ちていました。
あと、このforeachは
foreach $num (0 .. @BASE) {
です。

どうぞよろしくお願いします。
回答者 やまだ  [削除]  投稿日 10/4(金) 13:23:53
改行付きで記録してますよね。それがネックになっていますよ。chopしましょう。

for(0..$#BASE){
    chomp($BASE[$_]); # or chop($BASE[$_]);
    if($s_name eq $BASE[$_]){push(@NEW,$BASE[$_]);
}
if(@NEW){print "find it\n"}
質問者 はな  [削除]  投稿日 10/6(日) 11:42:45
やまださま

すっかり改行のことを失念していました。

無事できました。ありがとうございました。

このページは終了したので返信(回答)は書きこめません

Web裏技