CGI-BBS > データベース > CGI検索 > 自作cgi 検索が作動しません...


カレッヂ
カレッヂ


質問者 まだまだ初心者...  投稿日 9/7(土) 16:07:44
いつもお世話になっています。

自作のDBで、内容を登録するスクリプトが出来ました。
登録された内容を検索し、修正する為にデータを1つだけ読み出すスクリプトもできました。
で、問題のスクリプトなんですが、条件に合うデータを複数読み出すものなんですが、
サーバーのエラー表示が
「サーバで内部エラーまたは設定エラーが発生したため、リクエストに対する処理を完了できませんでした。 」
と出てしまい、どこが悪いのか、さっぱり分からないのです。

もし、教えていただける方がいらっしゃいましたら、お願いします。
以下に、スクリプトを記入しておきます。

#!/usr/bin/perl

require 'cgi-lib.pl';
require 'jcode.pl';
#エラー表示サブルーチン(別ファイル)
require 'error.pl';

#前のページからのデータを読み込み
&ReadParse(*form);
&jcode'convert(*form,'sjis');

#データファイルを読み込み
if (!open(IN,"./$form{'store'}/comic.dat")) {
$title = $title14;
$word = $word18;
&error;
}
@data = <IN>;
close<IN>;

#読み込んだデータと条件の照らし合わせ
foreach $data (@data) {
($comic_name,$author_name,$publisher,$comic_yomikata,$author_yomikata,$zen_kansuu,$syoji_kansuu,$yomareta_kaisuu) = split(/\,/,$data);
if ($form{'comic_name'} =~ m/^$comic_name/) {
push @data2,$data;
next;
} elsif ($form{'author_name'} =~ m/^$author_name/) {

#条件に合うデータだけを新しい配列@data2に追加
push @data2,$data;
next;
} elsif ($form{'comic_name'} !~ m/^$comic_name/) {
next;
} elsif ($form{'author_name'} !~ m/^$author_name/) {
next;
} elsif ($form{'comic_name'} eq "" and $form{'author_name'} eq "") {
$title = $title16;
$word = $word25;
&error;
last;

#データファイルの最後尾には"dummy"というデータを置き、
#それにアクセスしたらループ終了
} elsif ($comic_name eq "dummy" or $author_name eq "dummy") {
&k_hyouji;
last;
}
}

#検索結果表示
sub k_hyouji {
print "Content-type:text/html\n\n";
print << "EOH";
<html>
<head>
<title>検索結果</title>
</head>
<body bgcolor="#ffffff">
<div align="center">
<b><font size="+4" color="#00bfff">検索結果</font></b>
<table border="1" cellspacing="2" cellpadding="0">
<tr>
<td nowrap><div align="center">
<font size="3">出版社</font></div>
</td>
<td nowrap><div align="center">
<font size="3">コミック名</font></div>
</td>
<td nowrap><div align="center">
<font size="3">作者名</font></div>
</td>
<td nowrap><div align="center">
<font size="3">巻数</font></div>
</td>
</tr>
EOH

#条件に合うデータだけを表示
foreach $data2 (@data2) {
($comic_name,$author_name,$publisher,$comic_yomikata,$author_yomikata,$zen_kansuu,$syoji_kansuu,$yomareta_kaisuu) = split(/\,/,$data2);
print "<tr>\n";
print "<td nowrap>$publisher</td>\n";
print "<td nowrap>$comic_name</td>\n";
print "<td nowrap>$author_name</td>\n";
print "<td nowrap>$zen_kansuu</td>\n";
print "</tr>\n";
}

print << "EOH";
</table>
</div>
</body>
</html>

EOH
}

プロバイダ参照:http://www.interlink.co.jp
サーバのOS:UNIXサーバ
パソコンのOS:Mac9
エディタ:Mac J perl
FTPソフト:Fetch v3
サーバ移転:していない
改造:(未選択)
CGI習熟度:expert

回答者 しあわせのツボ  [削除]  投稿日 9/7(土) 16:57:53
文法チェックをかけたところ、line 19
close<IN>;
は
close(IN);
と書け、と出ました。
質問者 まだまだ初心者...  [削除]  投稿日 9/7(土) 17:17:40
しあわせのツボさん、いつもお教え頂いてありがとうございます。

早速試してみましたが、結果は同じくエラーでした。
うちのMAC J PERLでもsyntax OKと出るので、どこにエラーがあるのか
さっぱりです...

スクリプトを御覧になって、「これは変だなぁ」とか「これでいいの?」と
お感じになった箇所はありませんか?
回答者 しあわせのツボ  [削除]  投稿日 9/7(土) 18:54:59
こちらでもsyntax okですね。

気付いた点ですか。
これだと、ヒットした件数だけHTMLのフルセットを出力しますね(苦笑)
他はとりあえず動くと思いますが。

ざっと書き直したので、差し替えてみてください。

#!/usr/bin/perl

require 'cgi-lib.pl';
require 'jcode.pl';
require 'error.pl';

&ReadParse(*form);
&jcode::convert(*form,'sjis');

if ($form{'comic_name'} eq "" and $form{'author_name'} eq "") {
$title = $title16;
$word = $word25;
&error;
}

#データファイルを読み込み
if (!open(IN,"./$form{'store'}/comic.dat")) {
$title = $title14;
$word = $word18;
&error;
}
#読み込んだデータと条件の照らし合わせ
foreach (<IN>) {
	($comic_name,$author_name) = split(/&#165;,/);
#条件に合うデータだけを@dataに追加
	if ($form{'comic_name'} =~ /^$comic_name/) {
		push (@data,$_);
	} elsif ($form{'author_name'} =~ /^$author_name/) {
		push (@data,$_);
	}
}
close(IN);

print "Content-type:text/html; charset=&#165;"Shift_JIS&#165;"&#165;r&#165;n&#165;r&#165;n";
print << 'EOH';
<html>
<head>
<title>検索結果</title>
</head>
<body bgcolor="white">
<div align="center">
<b><font size="+4" color="#00bfff">検索結果</font></b>
<table border="1" cellspacing="2" cellpadding="0">
<tr>
<td nowrap align="center">
<font size="3">出版社</font></div>
</td>
<td nowrap align="center">
<font size="3">コミック名</font></div>
</td>
<td nowrap align="center">
<font size="3">作者名</font></div>
</td>
<td nowrap align="center">
<font size="3">巻数</font></div>
</td>
</tr>
EOH

#条件に合うデータだけを表示
foreach (@data) {
($comic_name,$author_name,$publisher,$comic_yomikata,$author_yomikata,$zen_kansuu) = split(/&#165;,/);
print << "EOH";
<tr>
<td nowrap>$publisher</td>
<td nowrap>$comic_name</td>
<td nowrap>$author_name</td>
<td nowrap>$zen_kansuu</td>
</tr>
EOH
}

print << 'EOH';
</table>
</div>
</body>
</html>
EOH
回答者 しあわせのツボ  [削除]  投稿日 9/7(土) 18:56:56
あー、化けてやがる。Mozillaのバカぁ(泣)
&#165; は 半角¥ に直してください。
質問者 まだまだ初心者...  [削除]  投稿日 9/7(土) 22:01:16
しあわせのツボさんへ

差し換えてみた所、無事、動きました!!
どうもありがとうございます!!
とっても、嬉しいです。

一体、どこがいけなかったのでしょう?
後学の為にアドバイスを頂けませんか?

よろしくお願い致します。
回答者 しあわせのツボ  [削除]  投稿日 9/7(土) 23:25:20
申し訳ありませんが、私にも見当たらないのです。
文法ミスではありませんし、結果も同じになるようにしたのに、
片方だけダメな理由がわかりません。

少しずつ戻しながら試していって、エラーになった場所があれば
そこがいけなかった所だとは思うのですが。


あと、エラーの原因ではないと思いますが、ついでなので。
print << "EOF"; ならヒアドキュメント中でも変数は使えます。
print << 'EOF'; とすると変数展開されずにそのまま表示されます。
質問者 まだまだ初心者...  [削除]  投稿日 9/8(日) 11:16:08
しあわせのツボさんへ

> あと、エラーの原因ではないと思いますが、ついでなので。
> print << "EOF"; ならヒアドキュメント中でも変数は使えます。
> print << 'EOF'; とすると変数展開されずにそのまま表示されます。
そういう違いがあるのですね。勉強になりました。

個人的にはデータの受け渡しが煩雑すぎたかな、と思います。
書き換えて頂いたスクリプトですと、非常にシンプルですもんね。

また教えて頂く事もあるかと思いますが、その時はよろしくお願い致します。
どうもありがとうございました。

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

Web裏技