- ベストアンサー
CGI掲示板カスタマイズ~メッセージ送信の上にプロフを付けたい。
現在、CGI掲示板のカスタマイズ中ですが、この掲示板は、投稿者の名前をクリックすると、メッセージ送信フォームが出るようになっています。 そこでこの送信フォーム画面の上部に、その投稿者の文章を表示したく、観覧処理や出力処理の中から必要そうな記述を抜き出し、送信フォーム表示処理の中のルーチンに取り込み、なんとか表示させることには成功したのですが、、その人物の投稿内容ではなく、なぜか1番目の投稿者の内容なのです。以下がそのメッセージ送信フォーム表示処理の内容です。 ###+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ## SUB >>> メール送信フォーム表示処理 ###+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sub mailform { if ($in{'sex'} eq '0') { if(!open(IN,"$mensfile")) { &error("$mensfile ファイルオープンエラー"); } } elsif ($in{'sex'} eq '1') { if (!open(IN,"$ladysfile")) { &error("$ladysfile ファイルオープンエラー"); } } if ($in{'sex'} eq "0") { $word_color = "$boy_color"; } elsif ($in{'sex'} eq "1") { $word_color = "$girl_color"; } if ($in{'sex'} eq "0") { $word_color = "$boy_color"; } elsif ($in{'sex'} eq "1") { $word_color = "$girl_color"; } if ($in{'sex'} eq "0") { $image = "image/otoko.gif"; } elsif ($in{'sex'} eq "1") { $image = "image/onna.gif"; } #--生年月日から年齢を計算--# $nenrei = ""; unless ($noage) { $nenrei = $year - $age_y; if ($age_m > $month) { $nenrei = $nenrei - 1; } if ($age_m == $month) { if ($age_d > $mday) { $nenrei = $nenrei - 1; } } } #--メール送信可能数の設定--# if ($max) { $max = "$max通まで"; } else { $max = "無制限"; } $i = 0; $allno = 0; while (<IN>) { ($no,$name,$mail,$age,$state,$comment,$hoop,$risou,$max,$date,$H_A,$m_pass,$looks) = split(/\,/,); ($age_y,$age_m,$age_d,$noage) = split(/<>/, $age); ($street,$title) = split(/<>/, $state); $i++; $allno++; if ($i < $start) { next; } if ($i > $end) { next; } if ($in{'sex'} eq '0') { $name_color = "$m_namecolor"; } if ($in{'sex'} eq '1') { $name_color = "$l_namecolor"; } &member_view; } close(IN); ~~~~↑↑↑追加部分↑↑↑~~~~~~~~ &html_head; &title; print <<"HERE"; <TABLE width="580"> <TR><TD bgcolor="$top_t_bgc"><CENTER> <FONT color="$top_t_color"><B>メッセージ送信フォーム</B></FONT> </TD></TR></TABLE> ~~~~↓↓↓追加部分↓↓↓~~~~~~~~ <TABLE width="98%" cellspacing="0" cellpadding="5" border="$table_border"> <TR><TD bgcolor="$table_bgc"> ■<FONT color="$title_color">[<B>$no</B>] <B>$title</B></FONT><BR> ■お名前/ <B>$name</B>さん $date<BR> ■住所/ $street 年齢/ $age_y年$age_m月$age_d日生まれ($nenrei歳)<BR> ■希望/ $risou <FONT color="$word_color">[$hoop]</FONT> ■メール制限数/ <FONT color="$word_color">[$max]</FONT><BR> <FONT color="$word_color">$comment</FONT></TD></TR></TABLE> <TABLE height="$kiji_sp" border="0"><TR><TD></TD></TR></TABLE> HERE ~~~~↑↑↑追加部分↑↑↑~~~~~~~~ 以下は元からある送信フォーム。文字数オーバーのため省略 ~~~ここまでが送信処理のルーチンですが、 この上部の方の記述をどう記したら、その人物の投稿文が出せるのか、宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ANo.3の修正で特に問題なく動作するような気がしますが、 特殊な文字が入っているとダメかも知れないのでコメントをurlエンコードしてみてはどうでしょう? print <<"HERE"; <CENTER><TABLE width="98%" cellspacing="0" cellpadding="5" border="$table_border"> <TR><TD bgcolor="$table_bgc"> <FONT color="$title_color">[<B>$no</B>] <B>$title</B></FONT><BR> <A href="$cgifile?action=mailform&sex=$in{'sex'}&number=$no&to_name=$name"><B>$name</B></A>さん $date HERE この部分を、 my $comm=$comment;#追加 $comm=~s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;#追加 print <<"HERE"; <CENTER><TABLE width="98%" cellspacing="0" cellpadding="5" border="$table_border"> <TR><TD bgcolor="$table_bgc"> <FONT color="$title_color">[<B>$no</B>] <B>$title</B></FONT><BR> <A href="$cgifile?action=mailform&sex=$in{'sex'}&number=$no&to_name=$name&comment=$comm"><B>$name</B></A>さん $date HERE と、してみてください
その他の回答 (3)
- calltella
- ベストアンサー率49% (317/635)
最初からご使用のCGIを聞けばよかったですね。 一番簡単な方法はjewel.cgiの328行目を下記に書き換えてください。 <A href="$cgifile?action=mailform&sex=$in{'sex'}&number=$no&to_name=$name&comment=$comment"><B>$name</B></A>さん $date そして963行目からのHTMLのコメントを表示したい部分に $in{'comment'} と記述してください。 後はやってみればわかると思いますので応用してください。
補足
手間をお掛けして申し訳ありません。 何度もありがとうございます。 >そして963行目からのHTMLのコメントを表示したい部分に >$in{'comment'}と記述してください。 こちらは、タイトルとコメントだけきちんと表示させられるようになりましたが、 ><A href="$cgifile?action=mailform&sex=$in{'sex'} >&number=$no&to_name=$name&comment=$comment"><B>$name</B></A>さ>ん $date こちらを挿入すると、元の閲覧画面で文字化けや、ホスト表示されたりと、とてもじゃないですが見られる画面ではありません。 うーむ・・・
- calltella
- ベストアンサー率49% (317/635)
>この掲示板は、投稿者の名前をクリックすると、メッセージ送信フォームが出るようになっています。 ↑ここでCGIに対してリンクからどんなデータを渡してメッセージ送信フォームに表示させる為にどんなデータ抽出処理をしているのか データ抽出をせずにリンクから渡されたデータを表示しているだけなのかわかれば答えられますが こちらの質問にもお答えしていただけないみたいなので具体的に申し上げる事はできません。 フリーで配布されているCGIをお使いならばどこのCGIなのか教えてください。
補足
失礼しました。 書籍もなく、ネットだけでCGIを手がけ初めてまだ一ヶ月なので、 どこの部分を指しているかなどもまだ、分からないことの方が多いのです。 フリーCGIは以下のサイトにある、Jewelというのを使っています。 GROOWEB - 高機能フリーCGI配布サイト http://www.groo-web.com/index.shtml jewel 解説&ダウンロードページ http://www.groo-web.com/jewel.html この掲示板のカスタマズ方法のサイトなどもほとんどなく、 本当に大変です。 何卒宜しくお願い致します。
- calltella
- ベストアンサー率49% (317/635)
CGIが断片的に切り取ってあるのでCGIからはよくわかりません。 ・【$comment】が投稿者の文章が入っている変数なのでしょうか? ・whileループの中に【$start】【$end】変数がありますがどこから取ってきているのでしょう? その人物の文章を出すにはクリックされた人のnoを探さなければいけませんが もともとの機能で投稿者の名前をクリックするとメッセージ送信フォームが出るようになっていますとの事なので そこのCGI部分から文章を取り出せれば一番簡単だと思います。
補足
レス有難うございます。まだ徹夜して四苦八苦しております。 参考になりそうなCGI落としてソースみたりして。。 $Keyとか$rcomment試してみても、やはり駄目でした。 calltellaさんのいう、noというので、no_titleとかでやっても出て来ないんです。 以下が現在の、その問題部分です。 ■<FONT color="$title_color">[<B>$in{'no_number'}</B>] <B>$in{'no_title'}</B></FONT><BR> ■お名前/ <B>$in{'to_name'}</B>さん $date}<BR> ■お住まい地域/ $street ■年齢/ $age_y年$age_m月$age_d日生まれ($nenrei歳)<BR> ■希望/ $risou [$hoop}■メール制限数/ [$max]<BR> $comment</TD></TR></TABLE> <TABLE height="$kiji_sp" border="0"><TR><TD></TD></TR></TABLE> それから以下の部分てすが、これは上のほうにある、 登録者の閲覧情報を出す処理から勝手に取って付けたものです。 $i = 0; while (<IN>) { ($no,$name,$mail,$age,$state,$comment,$hoop,$risou,$max,$date,$H_A,$m_pass,$looks) = split(/\,/,); ($age_y,$age_m,$age_d,$noage) = split(/<>/, $age); ($street,$title) = split(/<>/, $state); $i++; if ($i < $start) { next; } if ($i > $end) { next; } &member_view; if ($in{'sex'} eq '0') { $name_color = "$m_namecolor"; } if ($in{'sex'} eq '1') { $name_color = "$l_namecolor"; } } close(IN); この下の方法で名前だけは出せたのですが、 <B>$in{'to_name'}</B>さん 他の欄はまさにバラバラで、年齢やメール受信数もまともに表示されず、 中身はなぜだか1番目の人の投稿内容です。はあ。。 メール受信数の欄なんて、(0)とか表示されています。 はあ、難しくて難しくて・・・ なんとか宜しくお願いします。
補足
pipipi523さん、こんにちわ!いつもいつも有難うございます。 実は文字化けで困ってました!!何で分かったんでしょう!??@@; っというのも、普通に見る分には平気だったんですが、 アクセス・アナライザーと解析ページを見ると、 記事Noから先が文字化けしていたんです。それも強烈に長く!! そしてリファラーから飛ぶと、ページが文字化けしてる。 こんな体験は初めてでした。正直、驚いてます。 アクセス解析特有の現象なのか、私のPC環境のせいなのか・・? 他人のブラヴザでは正常に掲示板が見れているのか不安になって、 思わず検索で、「アクセスアナライザー文字化け」などと入れて調べてました。 結局それらしい答えが無かったので諦めていました。 書き込みしている人間がいるのだから大丈夫だろうと。 今、pipipi523さんから教わった通りにタイトルのほうも入れて、 my $comm=$comment;#追加 my $tit=$title;#追加 $comm=~s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;#追加 $tit=~s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;#追加 ■お名前/<A href="$cgifile?action=mailform&sex=$in{'sex'}&number=$no&to_name=$name&title=$tit&comment=$comm"><B>$name</B></A>さん $date というふうにしてみました。 まだ解析画面は覗いていませんが、 ソースを見てみると以下になってます↓@@; <A href="./deai.cgi?action=mailform&sex=1&number=28&to_name=Y・0&title=%90S%82%CC%97D%82%B5%82%A2%90l%21%21&comment=%90%B3%92%BC%81d%81d%8A%E7%82%E0%81A%82%E6%82%AD%82%C8%82%A2%82%C5%82%B7%82%B5%81d%82%A0%82%DC%82%E8%8E%A9%95%AA%82%C9%8E%A9%90M%82%E0%96%B3%82%A2%82%C5%82%B7%82%A9%82%E7%90%C3%82%A9%82%C9%82%B5%82%C4%82%E6%82%A4%82%C1%82%C4%8Ev%82%C1%82%C4%82%BD%82%F1%82%C5%82%B7%82%AF%82%C7%81A%82%E2%82%C1%82%CF%82%E8%81d%81d%91%A7%94%B2%82%AB%82%AA%82%B5%82%BD%82%A2%82%F1%82%C5%82%B7%21%21%3CBR%3E%8AO%8C%A9%81A%8BC%82%C9%82%B5%82%C8%82%A2%82%C5%81A%92%86%90g%82%F0%8C%A9%82%C4%82%A2%82%BD%82%BE%82%AF%82%E9%90l%21%21%82%C8%82%E9%82%D7%82%AD%81A%E3Y%97%ED%82%C9%82%C8%82%EB%82%A4%82%C6%93w%97%CD%82%B5%82%DC%82%B7%21%21%96%7B%93%96%82%C5%82%B7%21%21%3CBR%3E%95%CF%82%C8%90l%82%B6%82%E1%82%C8%82%A2%8C%C0%82%E8%82%CD%81A%95K%82%B8%81A%82%A8%95%D4%8E%96%82%B5%82%DC%82%B7%82%CC%82%C5%8BC%8Ay%82%C9%82%A8%95%D4%8E%96%89%BA%82%B3%82%A2%81B%82%A8%8A%E8%82%A2%82%B5%82%DC%82%B7%21%21"><B>Y・0</B></A>さん なんでしょうか、いったい?? $no&to_name=$nameまではアクセス解析でも普通に見れてたんですが、 &title=$title&comment=$commentを追加したとたんに変なになりました。 文字化けしててもNoが分かるので、誰が誰の送信フォームを覗いたかというのはなんとか分かりますが、 いかんせん、文字列が強烈に長くなって解析画面がみずらいことと、 やはりリファラーから飛んで見るの文字化けしてるということでした。 これで普通に見てたら良いですが、根本的な解決というか、 やはりエンコードに関係があるのでしょうかねぇ・・。 しかし、pipipi523さん、いつもいつも本当に詳細で確実で的確な回答、 有難うございます。何でそれほど詳しいのでしょう?? 凄すぎます。うーん気になる・・。