人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

《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以上差し上げます。

●質問者: esecua
●カテゴリ:ビジネス・経営 コンピュータ
✍キーワード:CGI Perl QUERY_STRING うまい ひとつ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● o0o0o0o0o
●40ポイント

http://www.hatena.ne.jp/

はてな

■対策案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;

}

}

◎質問者からの返答

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

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

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


2 ● naoya
●100ポイント

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} と変数の境界を明示するかどっちかです。


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

◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ