CGI-BBS > データベース > 簡易データベース > 検索でエラーになります


カレッヂ
カレッヂ


質問者 駆け出しPG  投稿日 1/3(水) 00:06:32
APACHEをPCにセットアップして、ローカルでCGIの動作テックをしているのですが、
登録系はうまくいくのですが、検索ではInternal Server Errorになります。
なお、サンプルプログラムでは正常に動作します。
ファイルのパス・タイトル名などの、CGIの前半部分は正しいはずなのですが。
変数名は追加・変更しているのですが、Internal Server Error
とは関係ありますでしょうか?
原因が解らずに、悩んでいます。どうか、よろしくお願いします


返信(回答)する
回答者 まさ  [削除]  投稿日 1/3(水) 06:36:13
Internal Server Errorはプログラムが途中で異常終了したり、ヘッダーが
出力されなかったりで出ます。
このエラーを見つける一番簡単な方法は、コマンドラインから「perl -wc foo.cgi」
を実行することです。
これでほとんどの場合、エラーはなくなります。
質問者 駆け出しFP  [削除]  投稿日 1/3(水) 12:07:39
ご回答いただき、どうもありがとうございます。
>Internal Server Errorはプログラムが途中で異常終了したり、ヘッダーが
>出力されなかったりで出ます。
>このエラーを見つける一番簡単な方法は、コマンドラインから「perl -wc foo.cgi」
>を実行することです。
>これでほとんどの場合、エラーはなくなります。
ActivePerl522で構文チェックすると、下記のエラーがでます。
’Unrecognized character \272 at01 search.cgi line7’
のメッセージがでますが解読できなく困っています。
ご回答の’コマンドラインから「perl -wc foo.cgi」の実行’は上記の構文チェックとは
違う方法なのでしょうか?
コマンドラインとは、DOSプロンプトから実行できるのでしょうか?
素人の質問で恐縮ですがご回答よろしお願いします。
回答者 しあわせのツボ  [削除]  投稿日 1/3(水) 14:41:42
エラーメッセージの意味は
「7行目に\272という意味不明の文字がある」ですね。
どこかに全角文字が紛れ込んでいませんか?
質問者 駆け出しPG  [削除]  投稿日 1/3(水) 17:20:12
幸せのツボさんご回答どうもありがとうございます。
上記のエラーメッセージはサンプルで本当は下記なのですが、
’Unrecognized character \201 at01 search.cgi line134’
もしよろしければ、この134行目のCGIソースを下記しますので、診ていただけないでしょうか?

    print "<th nowrap>商品格付け</th>\n";
上記が134行目なのですが、上にも同じような部分があり、そちらはエラーが出ていません。
ちなみに、下記なのですが、
     print "<th nowrap>登録日</th>\n";
        print "<th nowrap>保険会社</th>\n";
        print "<th nowrap>会社格付け</th>\n";
        print "<th nowrap>会社格付けの理由</th>\n";
        print "<th nowrap>その他の理由</th>\n";
        print "<th nowrap>保険種類</th>\n";
        print "<th nowrap>その他の種類</th>\n";
        print "<th nowrap>保険商品名</th>\n";
この134行目の意味は、秀丸エディタの134行目と理解しているのですが、そのような理解でよろしいのでしょうか? 本当は別の意味でエラーの部分は違うところのような気がするのですが・・・
回答者 まさ  [削除]  投稿日 1/3(水) 18:15:57
わたしはそのエラーの意味はわかりませんが、エラー行数は正確にその位置にエラーが
あるという意味ではありません。だいたいはその行か、あるいは2,3行上にエラーがあ
ります。
また、エラー行数はコメントも空白も含んでいます。

もういちどスクリプトを見直して見て下さい。

#ゴミレスですみません。
質問者 駆け出しPG  [削除]  投稿日 1/3(水) 20:11:57
まささんどうもありがとうございます

この201の数字の意味はエラーコードなのでしょうか?
上記のサンプルの場合、しあわせツボさんいわく、272は’意味不明の文字がある’という
エラーコードみたいなのですが、201はどうなるのでしょう?
どなたか、ご存知の方がいらっしゃたら教えてください
質問者 駆け出しPG  [削除]  投稿日 1/4(木) 14:25:47
上記のスクリプトから133行目のprint "<th nowrap>保険商品名</th>\n";
から削除すると、構文チェックのエラーがなくなったのですが、この場合、検索結果の項目が3つ
削除されます。エラーがない状態での検索結果項目は7つなのですが、検索結果項目には制限
数又はどこかで定義されているのでしょうか?
どなたか教えていただけないでしょうか?
回答者 まさ  [削除]  投稿日 1/4(木) 15:52:24
7つぐらいで制限にひっかかることはまずないですね。
制限は確かにあります。しかしそれは途方もない大きな数です。7つとかそんな程度では
ないです。

これは間違いなく別の問題です。
質問者 駆け出しPG  [削除]  投稿日 1/5(金) 22:55:41
まささん ご回答どうもありがとうございます

どうしても原因がわからず、項目を削って6つにすることにいたしました。
しかし、また問題が発生して、データファイル(CSV)にあるデータと一致する検索条件
で検索しても、”ご指定の条件で見当たりませんでした”というメッセージが返ってきます。
もし、お時間があれば、その検索部分のCGIを下記いたしますので診てもらえないでしょうか?ちなみに、サンプルスクリプトはDB項目以外はいじっておりません。


#■検索処理
if (!open(IN,"$file")) { &error('データベース読取エラー','復旧をお待ちください.'); }
@BASE = <IN>;
close(IN);

if ($FORM{'FF'} eq '') { $FF = 0; } else { $FF = $FORM{'FF'}; }
$TO = $FF + $page - 1;
if ($TO > $#BASE) { $TO = $#BASE; }
$hit = 0;
$next_num = '';

foreach $num ($FF .. $#BASE) {

        $data = $data2 = $BASE[$num];
        &jcode'convert(*data,'euc');
        ($d,$DATE,$s1,$s2,$t1,$s3,$s4,$t2) = split(/\,/,$data);

        # 保険会社(一致)

        if ($FORM{'s1'} ne 'all') {

                if ($s1 eq $FORM{'s1'}) { ; } else { next; }
        }

        # 保険会社の格付け(一致)

        if ($FORM{'s2'} ne 'all') {

                if ($s2 eq $FORM{'s2'}) { ; } else { next; }
        }

        # 保険種類(一致)

        if ($FORM{'s3'} ne 'all') {

                if ($s3 eq $FORM{'s3'}) { ; } else { next; }
        }

        # 保険商品の格付け(一致)

        if ($FORM{'s4'} ne 'all') {

                if ($s4 eq $FORM{'s4'}) { ; } else { next; }
        }

        # 検索終了処理
        if ($hit == $page) { $next_num = $num; last; }
        else { push(@NEW,$data2); $hit++; }
}
#■検索結果

print "Content-type: text/html\n\n";
print <<"EOF";
<html><head><title>$title</title></head>
<!-- MiniDatabase v2.1 (c) www.rescue.ne.jp -->
$body
<h2>《検索結果》</h2>
EOF

if (!@NEW) { print "●ご指定の条件では見当たりませんでした.<p>\n"; }
else {
        print "<table border=2 cellpadding=1 cellspacing=1><tr>\n";
        print "<th nowrap>登録日</th>\n";
        print "<th nowrap>保険会社</th>\n";
        print "<th nowrap>会社格付け</th>\n";
        print "<th nowrap>会社格付けの理由</th>\n";
        print "<th nowrap>保険種類</th>\n";
        print "<th nowrap>商品格付け</th>\n";
        print "<th nowrap>商品格付けの理由</th>\n";
        print "</tr>\n";

        foreach $data (@NEW) {

                ($d,$DATE,$s1,$s2,$t1,$s3,$s4,$t2) = split(/\,/,$data);

                print "<tr>\n";

                print "<td nowrap>$DATE</td>\n";
                print "<td nowrap><center>$s1</center></td>\n";
                print "<td nowrap><center>$s2</center></td>\n";
                print "<td nowrap><center>$t1</center></td>\n";
                print "<td nowrap><center>$s3</center></td>\n";
                print "<td nowrap><center>$s4</center></td>\n";
                print "<td nowrap><center>$t2</center></td>\n";
                print "</tr>\n";

回答者 まさ  [削除]  投稿日 1/6(土) 09:30:55
&jcode'convert(*data,'euc');
これを
&jcode'convert(*data,'sjis');
にすればどうなりますか?
質問者 駆け出しPG  [削除]  投稿日 1/6(土) 11:42:33
まささん、何回もご回答いただき、どうもありがとうござます。

まささんのご回答の通り、まず検索処理の部分のコード変換を”sjis”に変更して、
実行させたのですが、残念ながら、結果が変わりませんでした。
それで、入力処理の部分のコード変換も”sjis”に変更して、実行させたのですが、
残念ながら、結果が変わりませんでした。

そこで、登録(rejist.cgi)スクリプトをみたところ、
”&jcode'convert(*value,'sjis');”このように記述されているのですが、こちらは変更する必要があるのでしょうか?

返信(回答)する


Web裏技