《Perl関連》助けてください。KentWebさんが配布しているアクセスレポート(http://www.kent-web.com/data/report.html)を複数のユーザーで使えるようにしたいのですがなかなかうまくいきません。


ひとつのCGIを複数のユーザーで共用するためreport.cgi?ID のように引数をつけユーザーごとにログを吐くようにしています。

replist.cgi(ログを見やすくグラフにするスクリプト)の複数使用に対応するように改造ししっかり動いてくれましたがログを作成するreport.cgiの複数使用化がうまいいきません。

ユーザーIDを認識させログを書かせるため以下のように書き換えました。
--------
#引数を取得
$id = $ENV{’QUERY_STRING’};
# ログファイル
$logfile = ’./¥$id¥replog.cgi’;
-------
しかし何回やっても500で作動してくれません。どうしたらいいのでしょうか。見事解決してくれた方には少ないですが100P以上差し上げます。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:o0o0o0o0o No.1

回答回数84ベストアンサー獲得回数0

ポイント40pt

■対策案1


$logfile = ’./¥$id¥replog.cgi’;

というのは、おそらく$idディレクトリごとにファイルを作成する

という理解でよろしいでしょうか。

としますと存在しない場合は、作成する必要があります。


そこで、

「$logfile = ’./¥$id¥replog.cgi’;」を

「# $logfile = ’./¥$id¥replog.cgi’;」とコメントにします。


次に、

「# ログ読み込み

open(IN,”$logfile”) || &error(”Open Error : $logfile”);」を

「# open(IN,”$logfile”) || &error(”Open Error : $logfile”);」とコメントにし、以下を加えます。


#ディレクトリ存在チェック・作成

if (-d $id){

mkdir $id, 0777 || &error(”ディレクトリ作成エラー”);

}

#ファイル存在チェック・作成

if (-e ”$id/$logfile”){

open(INOUT,”$id/$logfile”) || &error(”オープンエラー”);

}else {

open(INOUT,”+>$id/$logfile”) || &error(”ファイルリ作成エラー”);

}


そして、

「# 更新

open(OUT,”>$logfile”) || &error(”Write Error: $logfile”);」を

「# open(OUT,”>$logfile”) || &error(”Write Error: $logfile”);」とコメントにし、以下を加えます。


open(OUT,”>$id/$logfile”) || &error(”Write Error: $id/$logfile”);


■対策案2


$id = $ENV{’QUERY_STRING’};

の$idは、ちゃんと文字列がとれていますでしょうか?

もし取れていなければ、こうしては、いかがでしょうか?

&decode;

$id=$in{’ID’};


#-------------------------------------------------

# デコード処理

#-------------------------------------------------

sub decode {

local($buf, $key, $val);


if ($ENV{’REQUEST_METHOD’} eq ”POST”) {

read(STDIN, $buf, $ENV{’CONTENT_LENGTH’});

} else {

$buf = $ENV{’QUERY_STRING’};

}

foreach ( split(/&/, $buf) ) {

($key, $val) = split(/=/);

$val =~ tr/+/ /;

$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(”H2”, $1)/eg;


# 不要コード削除

$val =~ s/&/&/g;

$val =~ s/”/"/g;

$val =~ s/</</g;

$val =~ s/>/>/g;

$val =~ s/¥r|¥n|¥0//g;


$in{$key} = $val;

}

}

id:esecua

回答ありがとうございました。

残念ながら2つの対策案を試してみましたがInternal Erorr(500)になってしまいCGIが作動してくれません。

ありがとうございました。

2005/11/17 13:55:49
id:naoya No.2

回答回数14ベストアンサー獲得回数1

ポイント100pt

http://search.cpan.org/

The CPAN Search Site - search.cpan.org

URLはダミーです。


そのスクリプトのコードがないので憶測になっちゃいますが、


$logfile = ’./?$id?replog.cgi’;


が間違ってるんじゃないかなと。


$id を $logfile に対して展開したい場合は、


$logfile = $id . ”replog.cgi”;


あるいは


$logfile = ”${id}replog.cgi”;


ですね。シングルクオートだと変数が展開されないので、文字列連結か、ダブルクオートで ${id} と変数の境界を明示するかどっちかです。


それ以外の部分でだめしたらごめんなさい。

id:esecua

回答ありがとうございます。。。って!はてなのチィーフテクノロジーオフィーサーじゃないですか。こんな形でしかもご回答いただけるなんて感激です。実は私直也様のファンなんです。特にCnetの記事のすばらしさには感動しましたw

ところで問題に戻ります。さすがCTO。みごと $logfile = $id . ”replog.cgi”;で問題が解決しました。まことにありがとうございます。

いやぁ〜しかしスタッフの方もこのようにご回答されているのですね。ご苦労様です。

PS:ソフトバンクのWTY(?)のノミネートおめでとうございます。

2005/11/17 14:04:44

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません