- 締切済み
CGIフォーム、タグの表示について。
フォームを使い書き込まれた内容を表示させるのに、 <TR>などのタグをタグとしてではなく、単なる「<TR>」という文字として表示させるためには TEXTAREAしか方法はないのでしょうか? <B>などはまぁいいのですが、<TR>などですと、レイアウトが崩れるほかに、文字の表示が正常に行われません。
- みんなの回答 (12)
- 専門家の回答
みんなの回答
- ticky
- ベストアンサー率36% (123/337)
<を<とするのは、Perlの仕様ではなくて、HTMLの仕様です。 ですから、HTMLのソースコードに、 <tr> と書くと(または書いてあると)、 ブラウザの画面には、 <tr> と表示されるわけです。 逆に、HTMLのソースコードに <tr> なんて書いてあったら、それこそHTMLとして解釈されて、テーブルが崩れるはずですが....
- estea
- ベストアンサー率44% (39/87)
出力さえされないってのは変ですなぁ。 ひとまず、こちらで再現してみないと問題点が指摘できないんでぇ、 サンプルのデータファイル(の一部)と、 表示を担当しているコードの一部を書いていただけませんか? 可能性ばかり論じていても収拾つきそうにありませぬ。
お礼
●書き込み用 read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $buffer =~ s/"/"/g; $buffer =~ s/</</g; $buffer =~ s/>/>/g; $buffer =~s/\r\n/<BR>/g; $buffer =~s/\r/<BR>/g; $buffer =~s/\n/<BR>/g; $buffer =~ tr/+/ /; $buffer =~ s/'/\'/g; $buffer=~ s/ //g; foreach $pair (split(/%/,$buffer)){ ($name,$value) = split(/=/, $pair,2); $value =~ tr/+/ /; $FORM{$name} = $value; $FORM{$name} =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} =~ s/"/"/g; $FORM{$name} =~ s/</</g; $FORM{$name} =~ s/>/>/g; $FORM{$name} =~s/\r\n/<BR>/g; $FORM{$name} =~s/\r/<BR>/g; $FORM{$name} =~s/\n/<BR>/g; $FORM{$name} =~ tr/+/ /; $FORM{$name} =~ s/'/\'/g; $FORM{$name} =~ s/ //g; $TITLE = $FORM{'TITLE'}; $DATE = $FORM{'DATE'}; $NAKAMI = $FORM{'NAKAMI'}; $WORD = $FORM{'WORD'}; } open(FH,">>log.log"); print FH "TITLE=$TITLE%DATE=$DATE%NAKAMI=$NAKAMI%TIME=$year/$mon/$day $hour:$min:$sec%SEARCHKEY=$year$mon$day$hour$min$sec\n"; close(FH);
補足
●表示用 open FILE, "<log.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; $gyou = @log; for ($i=0;$i<$gyou;$i++){ # 日付順 @sort2 = sort{(split(/&/,$b))[1] cmp (split(/&/,$a))[1];} @log; $sort2[$i] =~ s/"/"/g; print "<TABLE>\n"; print "<TR>\n"; @log_data = split(/%/,$sort2[$i]); foreach (@log_data){ ($key,$value) = split(/=/,$_); $FORM{$key} =~ s/</</g; $FORM{$key} = $value; $FORM{$key} =~ s/%3D/=/g; $FORM{$key} =~ s/</</g; $FORM{$key} =~ s/>/>/g; $FORM{$key} =~ s/%3c/</g; $FORM{$key} =~ s/%3e/>/g; $FORM{$key} =~ s/%2d/-/g; } print "<TD WIDTH=80><font color=deeppink>♥</font><font color=deeppink>♡</font>$FORM{'DATE'}</TD>\n"; print "<TD WIDTH=550><A HREF='search.cgi?KEY=$FORM{'SEARCHKEY'}'>$FORM{'TITLE'} [$FORM{'TIME'}]</A></TD>\n"; } #for こんな感じになってます。
- K5237
- ベストアンサー率56% (55/97)
>勝手に=と&で設定されてるんでしたっけ? >これを=と%にするにはどのような設定が必要なんでしょうか? 設定云々の前に,「=」と「&」以外にできませんね。 <input type="hidden" name="field1" value="1234"> <input type="hidden" name="field2" value="5678"> (↑このソースは間違っている可能性もあります) とした場合,送られるデータは field1=1234&field2=5678 として送られます。これはHTTPの仕様だと思いますので,CGI作成者が設定できるものではないです。 ちなみに,半角スペースは「+」となります。ご参考までに。
お礼
回答ありがとうございます。 そうですかー。 やっぱり無理なんですね…。 やったことないなぁとは思いましたが。。 +と'は以前に指摘されて覚えていました。
- K5237
- ベストアンサー率56% (55/97)
>ログファイル記述時に&は使わない方がベストなのでしょうか? それはKODAMARさん次第です。同じ1つのことを実現するにしても,プログラムを書く人によって違いますから。 ですから,KODAMARさんが「&」を使わないほうがいいと思うなら使わないほうがいいです。使わないなら使わないなりに自分でプログラムを書いてください。 掲示板はPerlの参考書などを見ながら作られていますか? でしたら掲示板のプログラムも載っていると思います。それを見てログの保存,読み込み,表示をどのように処理しているか見てみてください。 以前の質問で,解読するのも難しいと書かれていましたが,ある程度プログラムが読めないとプログラムを書くのは結構難しいと思いますよ。 何事も覚えるには "読み・書き" が大事!!(^^;)
お礼
回答ありがとうございます。 どーしても&だとうまくいかなそうなので、%を使ってやってみようかなーと思い出したところです。 たまには変えてみて、いつも「当たり前」だったことを復習してみるのもいいかと。 早速つまづきましたが(笑) フォームのデータって何も設定しないと、勝手に=と&で設定されてるんでしたっけ? これを=と%にするにはどのような設定が必要なんでしょうか? よくよく考えたらやったことありませんでした。 掲示板は今までの自分なりに蓄積した概念と、途切れ途切れのコードを組み合わせてつくってます。 説明書などは、その途中でちょこっと見たりする程度で、流れは自分なりに考えてつくってますので、 一般論からすると、おかしな流れやコードになってると思われます。 これが完成し、無事動くようになったら、書籍を見て、プロが書くコードと照らし合わせてみようと思っています。
- feininger
- ベストアンサー率41% (74/180)
> というように=と&で行っているので、<>で誤動作は考えにくいのですが。。 <や>には&が含まれていますけど、処理上に問題はないですか? とりあえず、「HTMLソースに問題あり」というのがはっきりしたので、 そこからまた新たな手がかりが見えてくるかと。
お礼
すいません、思い出しました。 <などには&が使われているから強制的に<に戻そうと思ってcgiかいたことを…。 ログファイル記述時に&は使わない方がベストなのでしょうか?
補足
追加です。 表示用のcgiファイルでは、<などは勝手に表示される、とのことで消したのですが… <B>テストです。 あー。 と入力して、表示させたのですが、何も表示されません。 ソースにも表示されません。 ログファイルを開くと、 <B>テストです。<BR>あー。 と入っているので、入力はきちんと行われているようです。 なぜ<や>は表示されないのですか?
- feininger
- ベストアンサー率41% (74/180)
> ソースの方をみてみても、同じくその後は入力されていません。 > …ということは<TR>のタグが原因ではないですね…スイマセン。 まったくの勘ですが、ログのセパレータに<>なんかを使っていてばっさり削除されてしまったとか? (もうすこし情報がないとなんともいえません) ・・・で、ちょっと気になったのが、 フォームへ入力したタグが、そのままタグとして機能してしまうのは、 レイアウト崩れよりもセキュリティとして大問題なので注意したほうがよいですよ。 > <TR>などのタグをタグとしてではなく、単なる「<TR>」という文字として表示させるためには > TEXTAREAしか方法はないのでしょうか? <textarea></textarea>で囲まれた部分はタグとして機能しませんのでそのまま表示されますが、 こんな感じ↓でフォームへ入力されたら危険です。 </textarea><span style="font-size:100px;">巨大</span>
お礼
回答ありがとうございます。 今つくっているのは私以外誰も使うものではないのでセキュリティは気にする必要はなく、楽なんですが…。 (公開するものはタグ禁止にします。) ログファイルの書き込みは 1つめのタイトル(表記名)=1つめのデータ&2つめのタイトル… というように=と&で行っているので、<>で誤動作は考えにくいのですが。。
- estea
- ベストアンサー率44% (39/87)
気になっていたのですが、あなたの言う表示ってどれのことですか?ブラウザでの表示?それともブラウザでいう「ソース」での表示? それぞれ意味が違いますのでそれをはっきりさせましょうや。 で、ブラウザでの表示に関する場合は、「ソース」をブラウザがHTMLなどとして解釈した結果ですので、本来ココで問題になるべきは、「ソース」でしょう? 下でお聞きの、「<tr>の後から表示が無い」ってのもソースには出力されているのですか?結構重要なことだと思いますよ。
お礼
回答ありがとうございます。 表示がされない、と言っている「表示」は「ソース」のことです。 混乱させてすいません。 ソースの方をみてみても、同じくその後は入力されていません。 …ということは<TR>のタグが原因ではないですね…スイマセン。 これは何が原因かおわかりになりますか?
- selene_pl
- ベストアンサー率49% (102/207)
>今の状態では<が<に、>が>に表示されるようになってます。 どうも、この作業が、余計っぽいです。 HTMLのソースに「<」があれば、ブラウザが自動的に「<」に見せてくれるんです。 なので、<を、変換せずに、そのまま出力すればいいかと。 つまり、テーブルの中に 「たとえばテーブルのタグには<TR>などがあります。」 と書きたいのなら、CGIの出力として、 <TR><TD>たとえばテーブルのタグには<TR>などがあります。</TD></TR> とすればいいはずです。
お礼
回答ありがとうございます。 <や>の変換記述は削除しました。 Print #FNO, "<TR>" (ログファイル抜粋) という文字なんですが、 実際は Print #FNO, "<TR>" と表示される予定ですが、 Print #FNO, " までしか表示されません。 この後にも文章が続くのですが、それも全部表示されません。 そこでタグだからかな?と思ってたんですが、違うんですかね? これを表示させるにはどうしたらいいのでしょうか?
- K5237
- ベストアンサー率56% (55/97)
selene_plさんの書かれたとおりでできます。 CGIが書き出すHTMLソース上で「<TR>」とすれば,HTMLの表示上は<TR>となりますので。 例を示すと… <TR><TD>たとえばテーブルのタグには<TR>などがあります。</td></tr> ↓表示結果 たとえばテーブルのタグには<TR>などがあります。 となります。 >今の状態では<が<に、>が>に表示されるようになってます。(ログファイル呼び出し時) となっていますが,これはHTMLソースを書き出すときにこの変換作業をしているのですか? でしたらこれは必要ないです。上の例が示すとおり,変換作業無しに「<TR>」と表示することできます。
お礼
知りませんでした。 今まで無駄なことをかいてたんですね~。 Print #FNO, "<TR>" (ログファイル抜粋) という文字なんですが、 実際は Print #FNO, "<TR>" と表示される予定ですが、 Print #FNO, " までしか表示されません。 この後にも文章が続くのですが、それも全部表示されません。 そこでタグだからかな?と思ってたんですが、違うんですかね? これを表示させるにはどうしたらいいのでしょうか?
- namiri_e
- ベストアンサー率37% (37/98)
> 今の状態では<が<に、>が>に表示されるようになってます。(ログファイル呼び出し時) > ただコレですと、例えば今はテーブルでログファイルの表示のレイアウトを作っているんですが、いきなり<TR>とか出たらそこでテーブルのレイアウトが崩れてしまいますよね? >や<は、htmlで表示時には自動的に、 単なる文字としての「>」「<」として表示されるだけなので タグと認識されないので、テーブルは崩れないと思います。 もし心配でしたら、ログに保存するときは<TR>のような形のままにして、 ログファイル読み込み時に「<」を「<」に「>」を「>」に変換して、 テーブル内に表示していけばどうでしょう?
お礼
>や<はわざわざ変換しなくていいんですね! 知りませんでした。 早速変換させてたところを消してみました。 ですがやはりできない…。 Print #FNO, "<TR>" (ログファイル抜粋) という文字なんですが、 実際は Print #FNO, "<TR>" と表示される予定ですが、 Print #FNO, " までしか表示されません。 この後にも文章が続くのですが、それも全部表示されません。 そこでタグだからかな?と思ってたんですが、違うんですかね? これを表示させるにはどうしたらいいのでしょうか?
- 1
- 2
お礼
<とかくと<と表示されて、でもタグにはならないんですね! ちょっとひとつ利口になりました。 今までタグを表示させる時にはtextareaを使用していました。