• ベストアンサー

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終了 のように表示させています。

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

  • ベストアンサー
  • mirurin
  • ベストアンサー率43% (48/111)
回答No.5

補足ありがとうございます。 おそらくですが・・・ ログファイルを配列に格納している部分、 for($i=0;$i<$gyou;$i++){ @log = split(/&/,$FILES[$i]); foreach(@log){ ($key,$value)=split(/=/,$_); $FORM{$key} = $value; } if ($searchkey eq $FORM{'BUSYO'}){ last; } 一行ずつデータをみて、該当データでループをストップしていますよね。 該当行は「...NAME11=金子&NO11=1&WORD=入力完了」となっていますが、 それより前の行は「...NAME11=AAA&NO11=1&NAME12=BBB&NO12=1&WORD=入力完了」 のように、12まで存在するかもしれません。 つまり、$FORM{"NAME12"}や$FORM{"NO12"}にデータが入ったままということです。 これを回避するために foreach(@log){ ($key,$value)=split(/=/,$_); $FORM{$key} = $value; } の前に %FORM = (); を追加して配列を初期化してみてはどうでしょう? ------------------------------------------------------------------------------- //追加 $tmp=$n+1; $FORM{"NO$tmp$r"}=0; は、 #追加 $tmp=$n+1; $FORM{"NO$tmp$r"}=0; の間違いでした。すみません。

KODAMAR
質問者

お礼

回答ありがとうございます。 >%FORM = (); で無事解決しました。 本当にありがとうございました。

その他の回答 (4)

回答No.4

正常に表示されるかどうかはともかく、条件文の 'ne', 'eq' はそれぞれ '!=', '==' ではないでしょうか。

KODAMAR
質問者

お礼

回答ありがとうございます。 そうですね数字ですから==の方がいいですよね。 アドバイスありがとうございます。

  • mirurin
  • ベストアンサー率43% (48/111)
回答No.3

> でも入力しているときは、00,01,02,10,11だけで12は入力もしていないし、表示もされません。(入力後の確認画面上) > なぜ入力していないものが勝手に出てくるのでしょうか? もう少し情報をいただけますか? 1.入力画面はどのようになっているのですか? 2.勝手に出てくるとは、何が出てくるのですか? 3.入力画面で入力後、いったんファイルに書き込んでいるのですか? 下記↓の追加では上手くいきませんでしたか? ----------------------------------------------------------------------------------- } 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"; //追加 $tmp=$n+1; $FORM{"NO$tmp$r"}=0; }

KODAMAR
質問者

お礼

回答ありがとうございます。 >1.入力画面はどのようになっているのですか? 1.パスワードを入力   ↓ 2.OKなら部署名と列・行の数を入れる画面が出てくる。   ↓ 3.2で入力された列数と行数をもとにテーブルを作成。 #----*コード*----------------------------------------------------- print "<TABLE CLASS=TABLE2 CELLSPACING=0 CELLPADDING=2>\n"; for($i=0;$i<$TATE;$i++){ if ($i ne $TATE-1){ print "<TR>\n"; for ($r=0;$r<$YOKO;$r++){ if ($r ne $YOKO-1){ print "<TD CLASS=TD1 WIDTH=50 HEIGHT=50><INPUT TYPE=TEXT CLASS=TEXT NAME=NAME$i$r SIZE=6 AUTOCOMPLETE=OFF STYLE=IME-MODE:ACTIVE;><BR><INPUT TYPE=TEXT CLASS=TEXT SIZE=3 NAME=NO$i$r AUTOCOMPLETE=OFF STYLE=IME-MODE:DISABLED;></TD>\n"; } elsif ($r eq $YOKO-1){ print "<TD CLASS=TD2 WIDTH=50 HEIGHT=50><INPUT TYPE=TEXT CLASS=TEXT NAME=NAME$i$r SIZE=6 AUTOCOMPLETE=OFF STYLE=IME-MODE:ACTIVE;><BR><INPUT TYPE=TEXT CLASS=TEXT SIZE=3 NAME=NO$i$r AUTOCOMPLETE=OFF STYLE=IME-MODE:DISABLED;></TD>\n"; } } #YOKOが終るまで print "</TR>\n"; } elsif ($i eq $TATE-1){ print "<TR>\n"; for ($r=0;$r<$YOKO;$r++){ if ($r ne $YOKO-1){ print "<TD CLASS=TD3 WIDTH=50 HEIGHT=50><INPUT TYPE=TEXT CLASS=TEXT NAME=NAME$i$r SIZE=6 AUTOCOMPLETE=OFF STYLE=IME-MODE:ACTIVE;><BR><INPUT TYPE=TEXT CLASS=TEXT SIZE=3 NAME=NO$i$r AUTOCOMPLETE=OFF STYLE=IME-MODE:DISABLED;></TD>\n"; } elsif ($r eq $YOKO-1){ print "<TD WIDTH=50 HEIGHT=50><INPUT TYPE=TEXT CLASS=TEXT NAME=NAME$i$r SIZE=6 AUTOCOMPLETE=OFF STYLE=IME-MODE:ACTIVE;><BR><INPUT TYPE=TEXT CLASS=TEXT SIZE=3 NAME=NO$i$r AUTOCOMPLETE=OFF STYLE=IME-MODE:DISABLED;></TD>\n"; } } #YOKOが終るまで print "</TR>\n"; } } # $TATEが終るまで print "</TABLE>\n"; #------------------------------------------------------------      ↓ 4.上記で入力したものを同じような感じで画面に出して確認。OKならボタンを押す。      ↓ 5.入力されたデータがログファイルに入力される。(↓ログファイルの例) #------------------------------------------------------------ BUSYO=総務課&TATE=2&YOKO=3&NAME00=佐藤&NO00=1&NAME01=鈴木&NO01=1&NAME02=田中&NO02=2&NAME10=高橋&NO10=1&NAME11=金子&NO11=1&WORD=入力完了 #------------------------------------------------------------     ↓ 6.トップ画面はログファイルからBUSYO名を出してリンクを貼る。 #------------------------------------------------------------ print "<A HREF='zaseki_search.cgi?GYOU=$FORM{'BUSYO'}'>$FORM{'BUSYO'}</A><BR>\n"; #------------------------------------------------------------     ↓ 7.リンクをクリックするとBUSYO名で検索して表示する。※ ※この時の表示がおかしい。 >2.勝手に出てくるとは、何が出てくるのですか? 例えば上記のログファイルでは5人が入っていますよね? ですが、おかしいもののときは上のログファイル(上記のログファイルが2行目だとすると0行目と1行目とか)のデータが紛れ込んだりするんです。 >3.入力画面で入力後、いったんファイルに書き込んでいるのですか? はい、ログファイルに書込みしています。 >下記↓の追加では上手くいきませんでしたか? 7の時に使用するsearch.cgiで print "<TD ROWSPAN=2 CLASS=TD WIDTH=50 HEIGHT=100 ALIGN=CENTER>$FORM{\"NAME$n$r\"}</TD>\n"; のあとに以下を足してみましたがエラーになってしまいました。 //追加 $tmp=$n+1; $FORM{"NO$tmp$r"}=0; よろしくお願いします。

回答No.2

 前の行のデータが大きいときにおかしくなるのではないですか。 配列を初期化してみてはどうでしょう?

KODAMAR
質問者

お礼

回答ありがとうございます。 そう思って長い行の後に違う2つを持ってきてみたのですが、そうなるものとそうならないものがありました。

  • mirurin
  • ベストアンサー率43% (48/111)
回答No.1

┏━━━┳━━━━┳━┓ ┃    ┃      ┃  ┃ ┣━━━╋━━━━┫  ┃ ┃    ┃      ┃  ┃ ┗━━━┻━━━━┻━┛ この場合、2行3列になると思いますが、1行目の3列目は2行にまたがっています。 ┏━━━┳━━━━┳━┓ ┃ 00 ┃ 01   ┃  ┃ ┣━━━╋━━━━┫02┃ ┃ 10 ┃ 11   ┃  ┃ ┗━━━┻━━━━┻━┛ KODAMARさんの場合、 ┏━━━┳━━━━┳━┓ ┃ 00 ┃ 01   ┃  ┃ ┣━━━╋━━━━┫02┣━━┓ ┃ 10 ┃ 11   ┃  ┃12 ┃ ┗━━━┻━━━━┻━┻━━┛ このようになっているのではないでしょうか? 2行にまたがった場合は、2行目のセル(図では[12])は表示させないようにしてはどうでしょう? ----------------------------------------------------------------------------------- } 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"; //追加 $tmp=$n+1; $FORM{"NO$tmp$r"}=0; }

KODAMAR
質問者

お礼

回答ありがとうございます。 ┏━━━┳━━━━┳━┓ ┃ 00 ┃ 01   ┃  ┃ ┣━━━╋━━━━┫02┣━━┓ ┃ 10 ┃ 11   ┃  ┃12 ┃ ┗━━━┻━━━━┻━┻━━┛ となっています。 でも入力しているときは、00,01,02,10,11だけで12は入力もしていないし、表示もされません。(入力後の確認画面上) なぜ入力していないものが勝手に出てくるのでしょうか?