プロが教える店舗&オフィスのセキュリティ対策術

現在CGIで掲示板を製作中なのですが、PC内で動作確認をしようとファイルにアクセスすると読み込もうとしているのですが、そここから動きません。エラーがあるのかと思いチェックファイルにアクセスしてみると問題なくきちんと作動します。チェックファイルのCGIからなら問題ないのに、直接では作動しません。なぜそのような現象がおきるのでしょうか?何の問題があるのかまったくわからず困っております。どなたか教えていただけないでしょうか?

A 回答 (4件)

まず最初に。


コマンドラインで動かした場合、CGI関連のモジュールが正常に動作しない場合があります。
今回のエラーはその辺が関係しているかもしれません。

ちなみに、perl に -w オプションを指定すると、
・一度しか出現しない変数名(宣言のみで未使用)
・初期化されずに参照される変数
・危険、無駄と思われる処理
などをチェックして警告を出します。

最初の「Use of uninitialized value ~」は
$cgi->param('mode')の中身が無い(=不定)だからでしょうね。
これはコマンドラインで実行したからだと思います。

この手のエラーメッセージは、単語の意味を調べたり
英文を(変数名、サブルーチン名は除いて)検索に掛けてみたりすると
何がわかるかもしれません。

ところで、今の時点ではブラウザ上ではCGIは動作していますか?
もしそちらで表示できるのなら、以降の動作確認/デバッグは
ブラウザを介してやった方が良いでしょう。
前回書き忘れましたが、ApacheのログにもCGIのエラーは出ますので
(確かlogというフォルダに)そちらを参考にしてください。

コマンドラインでのチェックは、CGIモジュールの問題があるので、
あくまでも文法チェック、HTMLの出力確認程度に留めてください。
    • good
    • 0
この回答へのお礼

現時点ではブラウザで問題なく動作しています。今後はそちらでチェックしていきます。今回はいろいろご親切に有難うございました。とても助かりました。

お礼日時:2006/12/22 15:12

>「ファイル名、ディレクトリ名、またはボリュームラベルの構文が間違っています」



> cd (テストしたいCGIがあるフォルダ)
> (perlのパス) (テストしたいCGIのパス) > out.html
パス指定が間違っているかもしれません。
あと、ファイル名やディレクトリ名にスペースがある場合は、
ダブルクオート(")で囲ってください。

一応、細かく手順を書いておきましょうか
・perl.exeのパス:C:\usr\local\bin\perl.exe
・CGIの置き場所:C:\home\hoge\public_html\cgi_bin
・CGIファイル:test.cgi
としておきます。あとは自分の環境に置き換えて読んでください。

1. コマンドプロンプト起動
最初はC:Documents and Setttings\(ユーザ名)にいるはずです

2. CGIの場所まで移動
> cd C:
> cd \
> cd "home\hoge\public_html\cgi_bin"
ここまできたら
> dir
で、CGIのファイルがあることを確認しましょう

3. perlコマンド実行
・文法のチェック (チェックファイルCGIとほとんど同じです)
> "C:\usr\local\bin\perl.exe" -cw "test.cgi"
問題なければ、syntax OK と出ます

・実行+HTML出力
> "C:\usr\local\bin\perl.exe" "test.cgi" > out.html
これで、CGIファイルと同じ場所にout.htmlができますので
ブラウザまたはテキストエディタで中身を確認してみましょう。
途中で問題があればエラーメッセージが出ます。

この回答への補足

有難うございました!同じサブルーチン内に同じ名前の変数があったのでダメだったみたいです。一応out.htmlにきちんと出力されました。
しかしまだ、いくつかエラーがあるみたいです。ネット調べたのですがよくわからないのがいくつかあります。

「Use of /c modifier is meaningless in s/// at ・・・.cgi line・・・」
この部分では空白を置換している行なのです。何かおかしいのでしょうか?「$hennsu=~ s/ /and/gc;」としています。

「Use of uninitialized value in string eq at ・・・.cgi line・・・」これは変数が初期化されていないとネットに書いてあったのですが、直前で
my $cgi = CGI::new();
my$mode = $cgi->param('mode');
if ($mode eq 'read') {&READ();}
初期化してるはずです。

他のファイルから読み込んでいるサブルーチンにも
「Useless use of subtraction (-) invoid context at ・・・.cgi line・・・」

「Useless use of subtraction (.) or string at ・・・.cgi line・・・」

「se of uninitialized value in split at・・・.cgi line・・・」

とエラーがあります。いろいろ調べたのですが、何がエラーなのか良くわかりません。どんな問題があるのでしょうか?

補足日時:2006/12/22 10:25
    • good
    • 0

チェックファイルのCGIがどういうものかはわかりました。


中でCGIを読み込んでエラーチェックしているんですね。
($cgiroom_cgiのところは実際にはちゃんとファイル名が書いてありますよね?)

他に考えられるのは
・CGI中のperlや各種ファイルのパス
・出力したHTMLのエンコード(charset指定と実際のテキスト)
あたりでしょうか?

まず一度、コマンドプロンプトで
> cd (テストしたいCGIがあるフォルダ)
> (perlのパス) (テストしたいCGIのパス) > out.html
を実行して、out.htmlがちゃんと出力&表示されるか、試してみてください。

この回答への補足

上記の方法でコマンドプロンプトを試してみたところ
「ファイル名、ディレクトリ名、またはボリュームラベルの構文が間違っています」となってしまいました。この場合どこに問題があるのでしょう?

補足日時:2006/12/21 11:53
    • good
    • 0
この回答へのお礼

丁寧に有難うございました。
いろいろ試してみたいと思います。

お礼日時:2006/12/20 19:05

状況がよくわからなかったので


まず最初に、いくつか確認させてください。

・PCのOS種類、バージョン
・httpサーバソフトの種類(Apacheとか)
・動作確認はローカルでやっているのか?
(FTPでサーバーに置くのではなく、自分のPC内にあるCGIにアクセスしているのか?)

ちなみに、この手の問題では掲示板CGIのファイル自身に
実行属性が無かったりするというケースが多かったりします。
(Windowsの場合でパーミッションが有効なのかは知りませんが

チェックファイルのCGIというのがよくわかりませんが、
そちらだと、チェックファイルのCGIが内部で掲示板CGIを読み込んで
いるからOKなのだと推測します。

この回答への補足

すいません説明不足でした!
OSはXPです。
ローカルでApacheでやっています。

チェックファイルは下記のようなものです。

#◇ チェックするCGIファイルの名前
$cgiroom_cgi = ".cgi";

#======================================================================#
# CGIの実行 & 出力

$cgiroom_check= (split(/\\|\/|\:/,$0))[-1];
open(CHECK,$cgiroom_cgi) || &cgiroom_error("チェックしようとしたCGI($cgiroom_cgi)が見つかりません。");
while(<CHECK>){
last if /^__END__[\r\n]+$/;
$cgiroom_perl .= $_;
}
close(CHECK);

$cgiroom_perl =~ s/$cgiroom_cgi/$cgiroom_check/g;
eval $cgiroom_perl;
&cgiroom_error("$cgiroom_cgiを実行した結果エラーが報告されました。<hr><pre>$@</pre><hr>CHECK ") if $@ ne "";
exit;

sub cgiroom_error{
print "Content-type: text/html\n\n";
print "$_[0]<hr size=1><pre>$]</pre><hr size=1><a href=\"http://cgiroom.nu\" target=cgiroom>CGIROOM</a>";
exit;
}

補足日時:2006/12/20 16:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!