• ベストアンサー

ログファイル表示で全部表示されたりされなかったり…

ログファイルをオープン、その中のユーザー名・パスワードと入力されたユーザー名・パスワードを比較して、どちらも一致した場合のみ表示するようなものを作成しました。 ただ単に表示を行うと一致するものすべて表示されるのですが、テーブルなどを使用して表示させると数が減って表示されるのです。 これはいったいなぜでしょうか? ---------- for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach if($FORM{'USER'} eq $FORMS{'USER'}){ if($FORM{'PASSWORD'} eq $FORMS{'PASSWORD'}){ print "$FORMS{'TITLE'}<BR>\n"; print "<BR>\n"; だと全件(19件入力中、一致は18件。18件すべて)表示 一番下を print "<TABLE>\n"; print "<TR><TD>$FORMS{'TITLE'}</TD></TR>\n"; print "</TABLE><BR>\n"; print "<BR>\n"; と変更すると13件しか表示されません。

  • w-inty
  • お礼率72% (1169/1618)
  • CGI
  • 回答数5
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.1

perlとしては tableだろうと何だろうとふつうに print文を実行するだけでしょうから、どこかにバグが潜んでるんだと思います。2つのperlソースを良く見比べて、何処が違うのかを発見するしかないでしょう。 tableとして生成された htmlソース上にも13件分のデータしかないのですか? 念のためにお聞きしますが、for文のカッコ閉じ、if文のカッコ閉じはここに書いていないだけで、実際にはちゃんと閉じているのですよね?

w-inty
質問者

お礼

回答ありがとうございます。 for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach #print "<FONT COLOR=GREEN>$i<BR></FONT>\n"; if($FORM{'USER'} eq $FORMS{'USER'}){ if($FORM{'PASSWORD'} eq $FORMS{'PASSWORD'}){ print "<TABLE>\n"; print "<TR><TD>タイトル</TD><TD>$FORMS{'TITLE'}</TD></TR>\n"; print "</TABLE>\n"; print "<BR>\n"; }#if }#if } となってます。 今、ログファイルを増やしてみたら、その分表示される件数が変化しました。 ニュアンス的にですが、どうやら、表示される件数というか、HTMLの行数?みたいなので制限されてるような感じです。 そんな制限ってできるんでしょうか? (私は設定した覚えはないんですが。)

その他の回答 (4)

  • feininger
  • ベストアンサー率41% (74/180)
回答No.5

> 今まで扱ってきたログファイルよりはるかに短いものなのにどうしてだめなんでしょうか? ログファイルを作成する際、データにNullコードが混入していませんか? (無駄なpushをしていたりとか) また、表示する際にNullを送信してしまうと、そこから表示が切れてしまうこともありますよ。

w-inty
質問者

お礼

回答ありがとうございます。 pushは使ってないはずです。 ログファイルに原因があるかどうかをみるために、1行目から81行目まで同じものを入力しましたが、やはり80行目で切れてしまいます。。 同じデータなので、データにおかしいところがある、ということもないと思うんですが…。

w-inty
質問者

補足

さらに違う実験をしてみました。 1行のデータが長めのデータを利用して同じように全部同じログファイルにしたところ、80行行く前に「ページを表示できません」と出てしまいます。 何度やってもだめでした。 行数を減らしたら出てくるようになりましたが。 これはやはり読み込み時にデータの量が多くてエラーがおきてるんでしょうか?

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.4

これまで頂いたプログラムをそのまま組み合わせて、テストしてみました。 データは aaa=bbb&bbb=ccc&title=test1 aaa=bbb&bbb=ccc&title=test2 aaa=bbb&bbb=ccc&title=test3  : aaa=bbb&bbb=ccc&title=test30 と言う感じで作りました。 結果から言うと、ちゃんと表示されました。 テスト環境は W2k/Apache2.0/ActivePerl5.6 Linux2.2.14/Apache1.3.12/Perl5.0005 Linux2.??/Apache2.0/Perl5.?? の3種類で行いました。 ソースはsjisで次の通り。 --- #!/usr/local/bin/perl open FILE,"<aaa.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; $gyou = @log; print "Content-type: text/html\n\n"; print "<html><body>\n\n"; for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach print "<TABLE>\n"; print "<TR><TD>タイトル</TD><TD>$FORMS{'title'}</TD></TR>\n"; print "</TABLE>\n"; print "<BR>\n"; } print "\n</body></html>\n"; --- と言うわけで、Perlソースのロジックではない他に原因があるのだと思います。 データファイルに問題がないとすれば、ちょっと私にはお手上げです。 #すいません。

w-inty
質問者

お礼

回答ありがとうございます。 やはりPerlに間違いはないですか~うーん。 ログの方もいろいろみてるんですが、別にこれといって問題はなさそうなんですけどね。。 ありがとうございました。

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.3

この for文/foreach文に関しては、やはり特に問題がなさそうな感じですね。 それ以前の行について $gyouへの代入と $log[n]にファイルの行を読み込んでいるところはどんな感じでしょうか?

w-inty
質問者

お礼

回答ありがとうございます。 open FILE,"<***.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; $gyou = @log; のようになってます。 普段使用しているような形なんですが…。

w-inty
質問者

補足

print "@log\n"; もためしたりしました。 どうやらログファイルの量が多くてパンク?してるみたいな形にみえるんですが。。 でも1つのデータは、 「名前」「パスワード」「タイトル」 くらいの短いものなんですけど。 今まで扱ってきたログファイルよりはるかに短いものなのにどうしてだめなんでしょうか?

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.2

うーーん、ソースを見る限りは特に問題がなさそうですねぇ。 あとは、データの問題とかぐらいしか考えられない感じです。 たとえば、データ内に <tr>や<table>、&など、htmlの予約語がそのまま格納されていて、ブラウザで表示されないとか....。 もう一度お聞きしますが、CGIによって生成された HTML内もデータが見あたらないのですか? #ブラウザが表示できないだけで、HTMLソースには出力されているかもしれないので。

w-inty
質問者

お礼

回答ありがとうございます。 タグは入っていません。 それとhtml内にもデータは入っていません。 テーブルタグが中途半端なところでなくなってます…。 ログを延々と増やしたところ、80行目以降が表示されなくなってしまいました。 80行目までは正常に表示されています。 (表示方法はテーブルなど使わないで、 $i $FORMS{'TITLE'} としています) このへんが原因かと思いますが、このような現象が起こる原因がまったくわかりません…。

w-inty
質問者

補足

print "$gyou\n"; でみてみると現在は87行と出ます。 行数はあってます。 for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach print "<FONT COLOR=PINK>$i $FORMS{'TITLE'}<BR></FONT>\n"; } のようにしてif文もなくしてみたんですが、やはり80行以降は表示されません。 $gyouで87とでるし、87行目までforが続くはずだと思うんですが…。

関連するQ&A

  • ログファイルと受信データを比べたい。

    フォームを使用して送られてきたデータをlogを比べて同じものがあったら、同じものがあるということを表示したいのです。 前にも同じようなことをしてできたはずなのですが、なぜかできなくて…。 もうずーっとやっていて頭がボーッとしてきてしまいました。。。。 #フォームで受信したデータ read(STDIN,$buffer,$ENV{'content_length'}); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #ログファイルオープン open FILE,"naisen.log"; @FILES =<FILE>; close FILE; $i=0; $n=0; $gyou = @FILES; #文末の改行を削除 $buffer =~ s/\n$//; $FILES[$i] =~ s/\n$//; foreach(@FILES){ @log = split(/&/,$FILES[$i]); ($keys,$values) = split(/=/,$log[$_]); $FORMS{$keys} = $values; } for ($i=0; $i<=$gyou-1;$i++){ if ($buffer eq $FILES[$i]){ print "$i行目<BR>\n"; } else{ print "$i行目。これはありません。<BR>\n"; print "$FILES[$i]<BR>\n"; print "$buffer<BR>\n"; } } ログの1行目と同じものとときだけ、きちんとした結果がでます。 上記のほかにもいろいろやりましたができませんでした。

    • ベストアンサー
    • CGI
  • cgiログファイル分割について。

    ログファイルを開いて変数に代入しています。 $i=0; foreach(@files){ @log = split(/&/,$files[$i]); ($key1,$value1,$key2,$value2,$key3,$value3,$key4,$value4) = split(/=/); : のようにしました。 print "$key2<BR>\n"; などとしても ***&*** と出てしまいます。 その上で&で分割しているのに何故でしょうか?

    • ベストアンサー
    • CGI
  • logファイルをひらいての処理の仕方を教えてください。

    データベース検索のperlをカスタマイズ中です。 ユーザが入力したものを、検索条件のひとつにしたいのですが、表示されません。 インプットしたものはlogファイルに書き込まれるので、それを開いて反映させればいいのだろうということまでは、なんとかわかるのですが、どのように表記していいのか・・・今はない知恵を絞ってこのように表記しているのですが。 if (!open(FD,"$logfile")) { &error(0); } @lines = <FD>; $cnt = @lines; close(FD); print "<select name=P2 >\n"; print "<option value=\"0\" selected>指定なし\n"; $i =0; foreach $line (@lines) { ($no,$sub,$com1,$com2,$com3,$p1,$p2,$p3,$p4) = split(/\,/,$line); chop; if ($p2 ne '') { $i++; $p2s{($p2)[0]}++; $n++; } } foreach (keys %p2s) { print "<option value=\"$_\">$_\n"; } print "</select></td>\n";

  • 検索で二つが一致した場合「OK」と表示させたいのですが

    こんにちは、いつもお世話になっております。 早速質問失礼します。 以前「名前を検索して一致した場合」出身地等を表示するのを作ったのですが、これを「名前とパスを検索して一致した場合」OKと表示させたいのです。 ーーーーーーーーーーーーーーー open(rd,"./file.txt"); @file = <rd>; close(rd); foreach $ww2 (@file){ ($name,$pass,$shushin,$other) = split(/,/,$ww2); chomp($name); chomp($pass); chomp($shushin); chomp($other); $PS{$name} = $pass; $SHU{$name} = $shushin; $OTHER{$name} = $other; } @name1 = keys ( %SHU ); #???? my $FOUND = 0; foreach $string (@name1){ if($string eq $FORM{'item1'}){ $FOUND = 1; print "見つかった名前:$string <br>     出身地:$SHU{$string} <br>     その他:$OTHER{$string}\n"; } } unless($FOUND){print"見つかりません!再度入力してください!";} ーーーーーーーーーーーーーーーーーー 上記を if($string eq $FORM{'item1'})の後にさらにifで if($string eq $FORM{'item1'}){ if($string eq $FORM{'item2'}){ print "OK"; } } という感じにしたのですが動いてくれません。 一つの検索のときはきちんと動くのですが二つになるとさっぱりです。 プログラムの書き込みをお願いできますでしょうか? それと、@name1 = keys( %SHU ); #???? こちらの一文はどういうことに使われてるのかが良くわかりません。 申し訳ないですが解説の方宜しくお願い致します。

    • ベストアンサー
    • Perl
  • プリントすると 保存位置が表示される

    %classをプリントしたいのですが、 保存位置が表示されるだけで肝心の中身が出てきません。 どうしたら 表示できますか? 前略 push @{$class{$name}->{grade}}, @grade とやって保存し、以下で表示させようとしました。 foreach my $key (sort keys(%class)) { print "$key:"; my @values = %{input{$key}}; print join',', @values; print ".\n"; }

  • ユーザ入力が表示されない原因を教えてください。

    CGI初心者です。基礎を勉強しただけなのでまだまだ理解が足りないせいかもしれません。現在データ検索のカスタマイズをしています。 ユーザが入力したものを検索条件の一部にと考えているのですが、なかなかできません。どこがいけないのかおしえていただけないでしょうか? インプット print "<P>● 業 務 <input type=text name=P2 size=30>\n"; アウトプット print "<td valign=top nowrap><font color=\"$t_color\">■</font> <B>業 務</B><br>\n"; print "<select name=P2 >\n"; print "<option value=\"99\" selected>指定なし\n"; $i =99; foreach $line (@lines) { ($name,$value) = split(/\,/,$line); chop; if ($name ne '') { $i++; $names{($name)[0]}++; $n++; } } foreach (keys %names) { print "<option value=\"$_\">[$_]\n"; } print "</select></td>\n"; と表記してます。クッキーを利用して反映できるようにはしていて、 入力したものを、登録内容の確認や、削除するときやメンテするときにはちゃんと表示されています。

  • CGIでhtmlページを表示する

    連日質問させていただいています。 CGI超初心者です。 htmlファイルにラジオボタンを設置し、 Aを選んだらhttp://www.a.html、 それ以外を選んだらhttp://www.b.html というサイトを開くようなCGIを作成したいです。 以下のようにやってみたのですがうまくいきません。 どのように修正したらいいでしょうか? #============================================ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); } else { $str = $ENV{'QUERY_STRING'}; } foreach $i (split('&', $str)) { $i =~ tr/+/ /; $i =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; ($t1, $t2) = split('=', $i); $FORM{"$t1"} = $t2; } $q1 = $FORM{'radio'}; print "Content-Type: text/html; charset=Shift_JIS\n\n"; print "<html>\n"; print "<head></head>\n"; print "<body>\n"; if ($q1 eq "A") { print "Location: http://www.a.html\n\n"; } else { print "Location: http://www.b.html\n\n"; } print "</body>\n"; print "</html>\n"; exit; #============================================ 上記のようにすると、以下のように、ただ文字が表示されてしまいます。 Location: http://www.a.html #============================================ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); } else { $str = $ENV{'QUERY_STRING'}; } foreach $i (split('&', $str)) { $i =~ tr/+/ /; $i =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; ($t1, $t2) = split('=', $i); $FORM{"$t1"} = $t2; } $q1 = $FORM{'radio'}; print "charset=Shift_JIS\n\n";←★ print "<html>\n"; print "<head></head>\n"; print "<body>\n"; if ($q1 eq "A") { print "Location: http://www.a.html\n\n"; } else { print "Location: http://www.b.html\n\n"; } print "</body>\n"; print "</html>\n"; exit; #============================================ ★部分が悪いのかなぁと思い、上記のように修正してみたり、 (Content-Type: text/html; を削除してみました) ★部分を全部削除してみると Internal Server Error となってしまいます。 よろしくお願いいたします!

    • ベストアンサー
    • CGI
  • 指定のフォルダに指定のファイルがあったら画像を表示、なければ飛ばすいい方法(CGI)

    指定のフォルダに指定のファイルがあったら画像を表示、なければ飛ばすというようにしたいのです。 opendir (FOLDER,"img"); @FOLDERS = readdir (FOLDER); closedir(FOLDER); my ($cnt) = 0; foreach(@FOLDERS) { if ($_ =~ /.+\..+/) { $cnt++; } } $tate = $cnt/10; print "<TABLE CELLSPACING=0 CELLPADDING=2>\n"; print "<TR>\n"; for($i=1;$i<11;){ for($n=2;$n<$cnt;$n++){ $F = $FOLDERS[$n]; if("$i.jpg" eq "$F"){ print "<TD CLASS=TD1><IMG SRC='img/$i.jpg' HEIGHT=65 WIDTH=50><BR>$i</TD>\n"; $i=$i+1; } #if } #for $n } #for $i というようにしてみたのですが時間がかかりすぎてしまいます。 何かいい方法はないでしょうか?

    • 締切済み
    • CGI
  • perl で環境変数を表示できない

    perlの初心者です。下記のCGIを実行しましたが、全く表示しません。 最初の「環境変数」と言う文字も表示しません。 どこか初歩的なエラーがあると思いますが、わかりませんので質問させていただきます。 --- #!/usr/local/bin/perl print "Content-type: text/html", "\n\n"; print "<HTML><BODY>", "\n"; print "<H1>環境変数</H1><HR>", "\n"; foreach my $key( keys %ENV ){ print "$key: $ENV{$key}<BR>", "\n"; } print "<HR>", "\n"; print "</BODY></HTML>", "\n";

    • ベストアンサー
    • Perl
  • CGIでの表示の不具合について。

    座席表を作成しようと思い以下のようにしました。 最初の画面で行と列の数を入力。    ↓ その分でテーブルを作成し、入力画面を出す。    ↓ 名前と一緒に数字も入れ、机の向き(1:横向き、2:縦向き)も入力する。    ↓ 完成。 ある程度はうまくいくのですが、なぜか一定のものだけ表示がおかしくなります。 ┏━━━┳━━━━┳━┓ ┃    ┃      ┃  ┃ ┣━━━╋━━━━┫  ┃ ┃    ┃      ┃  ┃ ┗━━━┻━━━━┻━┛ とならなければならないところが ┏━━━┳━━━━┳━┓ ┃    ┃      ┃  ┃ ┣━━━╋━━━━┫  ┣━━┓ ┃    ┃      ┃  ┃   ┃ ┗━━━┻━━━━┻━┻━━┛ となることがあります。 この右端のものは全然関係ない行のログからひっぱられてきます。 でも出るものと出ないものがあります。 表示のコードは $gyou = @FILES; for($i=0;$i<$gyou;$i++){ @log = split(/&/,$FILES[$i]); foreach(@log){ ($key,$value)=split(/=/,$_); $FORM{$key} = $value; } if ($searchkey eq $FORM{'BUSYO'}){ last; } }#for終わり でログファイルを開いて分解し、 for($n=0;$n<$TATE;$n++){ print "<TR>\n"; for($r=0;$r<$YOKO;$r++){ if ($FORM{"NO$n$r"} eq '1'){ print "<TD COLSPAN=2 CLASS=TD WIDTH=100 HEIGHT=50 ALIGN=CENTER>$FORM{\"NAME$n$r\"}</TD>\n"; } elsif ($FORM{"NO$n$r"} eq '2'){ print "<TD ROWSPAN=2 CLASS=TD WIDTH=50 HEIGHT=100 ALIGN=CENTER>$FORM{\"NAME$n$r\"}</TD>\n"; } } #列の終了 print "</TR>\n"; } #行のfor終了 のように表示させています。

    • ベストアンサー
    • CGI