WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:if文に相性などあるのでしょうか?

0:[投稿] chirumiru [MAIL] [URL] [2004/01/03 16:46 ][環境:IE6,WIN98 UNIX]

はじめまして、
chirumiruと申します。

これからよろしく願います。 > ALL様&管理人様。

まずはじめに。
あけましておめでとうございます、
みなさんにおきましては、よい年でありますように。

早速ですが、
質問させていただきます。

やや、…、
というより、
かなり抽象的になりますが。

Perlを用いてCGIを書いています。
そして実際に、
その拙い産物、
掲示板とダイアリをchirumiruが運営するサイトで、
運用しています。

質問の内容は、“2つのif文”についてです。

ひとつのCGIにある、別のアクションで、
if文を用いているのですが、
2つのif文を記述すると、
片方のif文が機能しません。

今のところ、
投稿をしてくださる方には関係しないところで、
管理人の投稿の際だけ注意すればすみますので、
ひとつははずしています。

コンピュータ、
スクリプト、
の世界に相性なんてあってたまるか!!、
と思っているのですが、
そう言い聞かすしかありません。

実際このような事象の起こることがあるのでしょうか?

十分に机上デバグし、
今のところ、
両者には遠因関係はないと思います。

また、
デバグの際に、
障害を起こすのはひとつのif文であることはつきとめたと、
思います。

記述方法は、
バリバリのPerl4です、(あぁ、早くオブジェクト指向に移行せねば)
はじめての質問、

明確なバグではないため、
十分な判断材料を提示できているかわかりませんが。

その際は、
またご指摘ください。

余談になりますが、
いま次に買うPerlの本、CGIの本を選別しています。

でも、
いまの自分がどれだけの技量にいるのか(チマチマとひとりで作っているので)、
判断しかねて、
どの本を手に取ればいいのかわかりません。

みなさんに、
ぜひ、
掲示板とダイアリを見ていただき、
実際のレベルをご指摘ください、(どうか容赦なく斬ってくだされ、見てもらうことが技量アップにもつながると信じていますので)

コンテンツ名は、
“愛の談笑”と、
“愛の徒然”、
です。

マスにカーソルをあわせていただければ、
ガイドがでます。

それでは、
長くなりましたが、
ご教示のほど、よろしく願います。

http://homepage2.nifty.com/penelotty/index.html
(愛に御用心)


1:[質問] バギンズ [2004/01/03 21:39 ]

>2つのif文を記述すると、
>片方のif文が機能しません。
これだけではわかりません。
問題が起きている箇所のソースを公開して、具体的に質問してください。


2:[質問] chirumiru [MAIL] [URL] [2004/01/03 22:07 ]

バギンズさん、
はじめまして。

早速コンタクトをとっていただき、
どうも、
ありがとうございます。

問題の箇所と、
そしてほかにどの部分を明示すればいいのか、
吟味して、
明日(2004/01/04)にでもアップさせていただきます。

その際は、
またよろしく願います。


3:[質問] chirumiru [MAIL] [URL] [2004/01/03 23:01 ]

#####chirumiruBBS.cgiソースの一部。

$icon=1;    #アイコンの使用、不使用(1=使用する、0=使用しない)

$icon_dir='http://homepage2.nifty.com/penelotty';
@icon1=('cat1.gif', 'dog1.gif', 'rob1.gif', 'pen1.gif', 'td1.gif', 'rabi1.gif', 'ball1.gif', 'tel1.gif', 'sheep.gif', 'master');        #####こちらのアイコンは借用させていただいています
@icon2=('しろねこ', 'いぬ', 'くるくるロボ', 'ぺんぎん', 'くま', 'うさぎ', 'ぼーるやろう', 'てるてるお嬢', 'ぱちくりヒツジ', '管理者用');    
$master='ai.gif';
$icon_ck='この変数は管理人の認証に使っているので伏せさせていただきます。';

&init_form($charcode);
if ($myaction eq 'fom') { &form_; }        #####$myaction変数はCGIに対する命令です。
if ($myaction eq 'wri') { &wri_; }
if ($myaction eq 'dis') { &dis_($block); }
if ($myaction eq 'del') { &del_; }
if ($myaction eq 'res') { &res_; }
&dis_(0);

######フォームデコードルーティン、&init_formの一部です。
    $myaction =$form{'myaction'};
    $myname   =$form{'myname'};
    $mytitle  =$form{'mytitle'};
    $mycomment=$form{'mycomment'};
    $mycolor  =$form{'mycolor'};
    $myback      =$form{'myback'};
    $myaccess =$form{'myaccess'};
    $mymail   =$form{'mymail'};
    $mylink   =$form{'mylink'};
    $mylink   =~s/^http\:\/\///g;
    $myicon   =$form{'myicon'};
    $mypass   =$form{'mypass'};
    $resset      =$form{'namber'};
    $parent   =$form{'res'};
    $block    =$form{'block'};

    $mycomment=~s/\r\n/<br>/g;
    $mycomment=~s/\r|\n/<br>/g;
    $myname   =~s/</&lt;/g;
    $myname   =~s/>/&gt;/g;
    $mytitle  =~s/</&lt;/g;
    $mytitle  =~s/>/&gt;/g;
    $mymail   =~s/</&lt;/g;
    $mymail   =~s/>/&gt;/g;
    $mylink   =~s/</&lt;/g;
    $mylink   =~s/>/&gt;/g;
#####

#####フォーム表示の一部分。
    if ($icon) {
        $html.="<tr>\n";
        $html.="<td colspan=\"3\"  width=\"15%\" align=\"center\" valign=\"middle\" bgcolor=$form_color>Icon</td>\n";
        $html.="<td colspan=\"17\" width=\"85%\" align=\"left\" valign=\"middle\">\n";
        $html.="<select name=myicon>\n";
        if ($c_icon eq '') {            #####$c_icon変数はクッキーから取得したものです。
            $html.="<option value=$icon1[0] selected>$icon2[0]</option>\n";
            foreach (1..$#icon1) { $html.= "<option value=$icon1[$_]>$icon2[$_]</option>\n"; }
        } else {
            ##### $icon1[$#icon1]=$icon_ck;        この文を記述すると、下で指定したブロックが無視されます。いまははずしてます。
            foreach (0..$#icon1) {
                if ($c_icon eq $icon1[$_]) { $html.="<option value=$icon1[$_] selected>$icon2[$_]</option>\n"; }
                else { $html.="<option value=$icon1[$_]>$icon2[$_]</option>\n"; }
            }
        }
        $html.="</select>\n";
        $html.="</td>\n";
        $html.="</tr>\n";
    }
#####    

#####以下、ファイル書き込みルーティンです、ここに機能しないブロックがあります。
sub wri_ {
    if ($myname    eq '')                                   { $myname='匿名希望さん\n'; }
    if (length($mytitle)>$title_length)                     { &error_("タイトルは$zenkaku_title字以内\n"); }
    if ($mycomment eq '' || length($mycomment)>$com_length) { &error_("コメントが空、または長すぎ。\n"); }
    if ($mytitle   eq '')                                   { $mytitle='NO TITLE'; }
    if ($mymail    ne '')                                   { if (0>index($mymail, '@')) { &error_("正確なメールアドレスを入力してください。"); } }
    if ($icon) {                #####このブロックが無視されます。
        if ($myicon  eq 'master')                             { if ($icon_ck eq $mymail) { $myicon=$master; } else { &error_("管理者用アイコンです。\n"); } }
    }
    if ($mypass=~s/[^0-9a-zA-Z]//g)                         { &error_("パスワードが不正。\n"); }
    if (length($mypass)>8 || length($mypass)<4)             { &error_("パスワード長が不正。\n"); }

    open(WRI, "+<$datfile") || die "can't open $datfile: $!";
    @databank=<WRI>;
    if ($lock) { if (!&lock_(WRI, 1)) { error_("can't lock\n"); } }

    $mytitle=~s/^re://g;

    $mytype=0; @new=();
    foreach (0..$#databank) {
        my ($dno, $dtitle, $dname, $dcomment, $dmail, $dlink, $dcolor, $dback, $daccess, $dtype, $dip, $dico, $ddel, $filler, $dtime)=split(/<>/, $databank[$_]);
        if ($dtype==0) { push(@new, $databank[$_]); }
    }
    if ($parent!=0) { $mytype=$parent; }

    $myaccess++;
    $editpass=crypt($mypass, $salt);
    &set_;
    my ($dno, $dtitle, $dname, $dcomment, $dmail, $dlink, $dcolor, $dback, $daccess, $dtype, $dip, $dico, $ddel, $filler, $dtime)=split(/<>/, $databank[0]);
    if ($dcomment eq $mycomment && $dname eq $myname && $dtitle eq $mytitle) { &error_("二重投稿は禁止です"); }
    $message=$mytitle.'<>'.$myname.'<>'.$mycomment.'<>'.$mymail.'<>'.$mylink.'<>'.$mycolor.'<>'.$myback.'<>'.$myaccess.'<>'.$mytype.'<>'.$myip.'<>'.$myicon.'<>'.$editpass.'<>'.$filler;
    
    open(CNT, "+<$cntfile") || die "can't open $cntfile: $!";
    $cnt=<CNT>;
    $cnt++;

    seek(CNT, 0, 0);
    print CNT $cnt;
    close(CNT);
    
    $mytime=&get_time;

    $message=$cnt.'<>'.$message.'<>'.$mytime."\n";
    unshift(@databank, $message);

    seek(WRI, 0, 0);
    $i=0;
    foreach (0..$#databank) {
        my ($dno, $dtitle, $dname, $dcomment, $dmail, $dlink, $dcolor, $dback, $daccess, $dtype, $dip, $dico, $ddel, $filler, $dtime)=split(/<>/, $databank[$_]);
        if ($dtype==0) { $i++; if ($i>=$kijimax) { last; } }
        print WRI $databank[$_];
    }

    $filesize=tell(WRI);
    truncate(WRI, $filesize);
    close(WRI);

    if ($lock) { &lock_(WRI, 0); }
    $parent=0;
}
#####

以上の通り、
2つのサブルーティンは、
フォームの出力と、ファイルへの書き出しという、
共有関係にないモノで互いに影響を与えないモノなんですが、
実際は遠因関係にあるようです。

クッキーには、配列@icon1の選択要素をセットしています。

とりあえず、
直接の問題点を書き出しました。

まだ、
情報が足りないようでしたら、
ご指摘してください。

それでは、
ご教示願います。


4:[関連] chirumiru [MAIL] [URL] [2004/01/03 23:05 ]

P.S. なのでいまは管理人に関しては、その都度アイコンを選択しています。


5:[回答] 薫 [2004/01/04 01:49 ]

>2つのif文を記述すると、
>片方のif文が機能しません。
問題のif文はどれですか?


6:[回答] バギンズ [2004/01/04 02:19 ]

$icon1[$#icon1]=$icon_ck;

の行で、'master'を$icon_ck($icon_ckが'master'以外)に置き換えてしまうと、管理者用アイコンを選択したときのvalueが$icon_ckになってしまうので、
書き込み処理の

if ($myicon  eq 'master')

の結果は、当然 False になります。

select要素で返す値はCGIから指定しているので関連してるって事がわかりますか?

でも、
$icon1[$#icon1]=$icon_ck;
の行は外してて正解ですね。
そうしないと、ソース見ただけで$icon_ckが何かばれちゃいます。

メールアドレスに$icon_ckの内容を書かないと管理者アイコンが使えないのであれば、今のままでいいのではないでしょうか。

>なのでいまは管理人に関しては、その都度アイコンを選択しています。
ん?クッキーがうまく効いてないのでしょうか?
別問題な気がします。


7:[回答] バギンズ [2004/01/04 02:21 ]

補足
>そうしないと、ソース見ただけで$icon_ckが何かばれちゃいます。
「HTMLソースを見ただけで」って意味です。


8:[質問] chirumiru [MAIL] [URL] [2004/01/04 07:01 ]

薫さん、はじめまして、
ありがとうございます。

バキンズさん、
こちらも昨日に続いて、
ありがとうございます。

##### $icon1[$#icon1]=$icon_ck;

##### $icon1[$#icon1]=$master;

の誤りです。

バキンズさんにご指摘(HTMLソース〜バレ、クッキー)いただいた点はまた別に思案させていただきます、ありがとうございます。

お二方、
みなさんにおきましては、
大変感謝しています。

スレッドを終了するときに
あらためて感謝の念を伝えますので、
それまでは、
しばらくの失礼、ご容赦してください。


9:[回答] gun [2004/01/05 10:47 ]

結局、どれが問題のif文ですか?


10:[質問] chirumiru [MAIL] [URL] [2004/01/05 12:32 ]

みなさん、
こんにちわ。

あっ、
どうもすいませんでした。
if文と書いていましたね。

掲載したソースの中で、
『########## $icon1[$#icon1]=$icon_ck;        この文を記述すると、下で指定したブロックが無視されます。いまははずしてます。

*****実際にはこれはこちらに質問するおりにあらためて書いたときに間違えました、その後、こちらの板にも訂正した文を書き込みました。*****

という文があります、
これが問題でして。

これを記述すると、
またソースの中で指摘している、ブロック(if文)が無視されてしまいます。

これで、
よろしいでしょうか?

あらためて、
ご教示を願います。


11:[回答] J [2004/01/05 13:31 ]

>6
でバギンスさんがおっしゃっているように
$icon1[$#icon1]=$master;を生かすと
@icon1の最後の要素masterを$master(ai.gif)で上書きしているので、
フォームより取得している$myiconの値がmasterではなくai.gifになってしまい。
当然
if ($myicon  eq 'master'){
の結果は「偽」になりますのでそのif文内の処理はされないですよね。
それが答えじゃないんですか?
それとも他に問題あるんでしょうか?


12:[お知らせ] J [2004/01/05 13:32 ]

↑バギンズさんのHNが間違っておりました。
 大変申し訳ありませんでした。


13:[完了] chirumiru [MAIL] [URL] [2004/01/05 15:36 ]

、…、
chirumiruです、
はずかしいです。

やっと、気付きました。

一つ一つの処理に目を奪われて、
全体を見つめることを、
忘れてました。
、というより、
できませんでした。

バキンズさん、
ご教示ありがとうございました、
そして、
それをこちら側で十分吟味せずに再質問したこと、
まことに申し訳ありません。

以後、気をつけますので、
またのおりは、
よろしくねがいます。

薫さん、gunさん、
こちらが質問しながら、
その内容の間違いに気付いていなかったこと、
ご指摘ありがとうございます。

Jさん、
あきれずに再度、
ご教示いただき、
まことにありがとうございます。
(以上スレッド順)

今回は、
みなさんのご協力により、
どうにか解決しました。
重ねてありがとうございました。

この教訓を、
今後もいかしていきたいと思います。

それではよいお年を!

「、っつーか、
悔しいことにコンピュータは間違わないんだよなぁ、
…」

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World