解決済み

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

  • 困ってます
  • 質問No.756110
  • 閲覧数60
  • ありがとう数6
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 72% (1169/1618)

ログファイルをオープン、その中のユーザー名・パスワードと入力されたユーザー名・パスワードを比較して、どちらも一致した場合のみ表示するようなものを作成しました。

ただ単に表示を行うと一致するものすべて表示されるのですが、テーブルなどを使用して表示させると数が減って表示されるのです。
これはいったいなぜでしょうか?

----------
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件しか表示されません。

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

  • 回答No.1

ベストアンサー率 40% (201/496)

perlとしては tableだろうと何だろうとふつうに print文を実行するだけでしょうから、どこかにバグが潜んでるんだと思います。2つのperlソースを良く見比べて、何処が違うのかを発見するしかないでしょう。

tableとして生成された htmlソース上にも13件分のデータしかないのですか?

念のためにお聞きしますが、for文のカッコ閉じ、if文のカッコ閉じはここに書いていないだけで、実際にはちゃんと閉じているのですよね?
お礼コメント
w-inty

お礼率 72% (1169/1618)

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

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の行数?みたいなので制限されてるような感じです。
そんな制限ってできるんでしょうか?
(私は設定した覚えはないんですが。)
投稿日時 - 2004-01-20 14:17:51

その他の回答 (全4件)

  • 回答No.5

ベストアンサー率 41% (74/180)

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

また、表示する際にNullを送信してしまうと、そこから表示が切れてしまうこともありますよ。
補足コメント
w-inty

お礼率 72% (1169/1618)

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

お礼率 72% (1169/1618)

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

pushは使ってないはずです。
ログファイルに原因があるかどうかをみるために、1行目から81行目まで同じものを入力しましたが、やはり80行目で切れてしまいます。。
同じデータなので、データにおかしいところがある、ということもないと思うんですが…。
投稿日時 - 2004-01-21 09:22:16
  • 回答No.4

ベストアンサー率 40% (201/496)

これまで頂いたプログラムをそのまま組み合わせて、テストしてみました。
データは
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

お礼率 72% (1169/1618)

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

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

ありがとうございました。
投稿日時 - 2004-01-21 09:20:55
  • 回答No.3

ベストアンサー率 40% (201/496)

この for文/foreach文に関しては、やはり特に問題がなさそうな感じですね。

それ以前の行について
$gyouへの代入と $log[n]にファイルの行を読み込んでいるところはどんな感じでしょうか?
補足コメント
w-inty

お礼率 72% (1169/1618)

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

今まで扱ってきたログファイルよりはるかに短いものなのにどうしてだめなんでしょうか?
投稿日時 - 2004-01-20 18:15:29
お礼コメント
w-inty

お礼率 72% (1169/1618)

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

open FILE,"<***.log";
flock(FILE,2);
@log = <FILE>;
flock(FILE,8);
close FILE;

$gyou = @log;

のようになってます。
普段使用しているような形なんですが…。
投稿日時 - 2004-01-20 17:15:26
  • 回答No.2

ベストアンサー率 40% (201/496)

うーーん、ソースを見る限りは特に問題がなさそうですねぇ。
あとは、データの問題とかぐらいしか考えられない感じです。
たとえば、データ内に <tr>や<table>、&など、htmlの予約語がそのまま格納されていて、ブラウザで表示されないとか....。

もう一度お聞きしますが、CGIによって生成された HTML内もデータが見あたらないのですか?
#ブラウザが表示できないだけで、HTMLソースには出力されているかもしれないので。
補足コメント
w-inty

お礼率 72% (1169/1618)

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が続くはずだと思うんですが…。
投稿日時 - 2004-01-20 15:54:35
お礼コメント
w-inty

お礼率 72% (1169/1618)

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

タグは入っていません。
それとhtml内にもデータは入っていません。
テーブルタグが中途半端なところでなくなってます…。

ログを延々と増やしたところ、80行目以降が表示されなくなってしまいました。
80行目までは正常に表示されています。
(表示方法はテーブルなど使わないで、
$i $FORMS{'TITLE'}
としています)
このへんが原因かと思いますが、このような現象が起こる原因がまったくわかりません…。
投稿日時 - 2004-01-20 15:39:27
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

ピックアップ

ページ先頭へ