WEB相談室

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

タイトル:削除ボタンを押しても、何も変わりません。

0:[投稿] kk [2004/02/03 22:45 ][環境:winXP AnHTTPD]

いつもお世話になっています。
本当にいきづまってしまって、かなり泣きそうです。
フォームによる入力は正常に動くのですが・・・。
ぜひどこが誤りか解析しお教え頂けませんか?
汚いソースで申しわけないですが
載せますので、宜しくお願いします>_<

#!/bin/perl

$LOGPATH = './koumoku_log/koumoku';

#=======================メインプログラム============
loadFormdata();

if($FORM{'add'} eq "addkoumoku"){
    addKoumoku();
}elsif(exists $FORM{'del'}){
    deleteKoumoku();
}

#================フォームデータ取得・復元============
sub loadFormdata{
    if($ENV{'REQUEST_METHOD'} eq 'POST') {
    read(STDIN,$query,$ENV{'CONTENT_LENGTH'});
    }
    else {
        $query = $ENV{'QUERY_STRING'};
    }

    foreach $pair (split(/&/,$query)) {
        ($key,$value) = split(/=/,$pair);

        #文字のデコード
        $value =~ tr/+/ /;
        $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;

        $FORM{$key} = $value;
    }
}


#=================サーバー出力========================
print <<END;
Content-type: text/html

<html>
<head><title>●◎入力項目の追加と削除◎●</title>
<style type='text/css'>
body { font-size: 10pt }
td { font-size: 11pt }
</style>
</head>
<body>
<center>
<h2><B>入力項目の追加と削除</B></h2>
<B>入力項目登録フォーム</B>

<center>
<table bordercolor="#c8c8c8" cellspacing="2" cellpadding="3" border="1">
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
<tr>
<td bgcolor="#fffa95"><center><B>項目名</B></center></TD>
</tr>
<tr>
<td><center><input name="koumoku"></center></td>
</tr>
<tr>
<td bgcolor="#fffa95"><center><B>フォームの種類</B></center>
</td>
</tr>
<tr>
<td><input type="radio" name="kind" value="text" checked> 一行テキスト<BR>
<input type="radio" name="kind" value="text2"> 複数行テキスト<BR>
<input type="radio" name="kind" value="option"> オプションメニュー</td>
</tr>
<tr>
<td bgcolor="#fffa95"><center><B>入力幅の設定</B></font>
</td>
</tr>
<tr>
<td><center><input size="10" type="text" name="size"></center></td>
</tr>
</table>
<br>
<input type="hidden" name="add" value="addkoumoku">
<input type="submit" value="登録"><input type="reset" value="リセット"></DIV>
</FORM>

<HR>

<center><B>登録されている入力項目</B></center>
<table bordercolor="#c8c8c8" cellspacing="2" cellpadding="3" border="1"><TR>
<td align=middle bgcolor=#fffa95><B>項目名</B></td>
<td bgcolor=#fffa95><B>フォームの種類</B></td>
<td bgcolor=#fffa95><B>入力幅の設定</B></td>
<td bgcolor=#fffa95><B>削除</B></td></tr>
<tr>
END

#=======ファイルの読み込みと項目の切り出し========
$openfile = "$LOGPATH.dat";
if (-e $openfile){
    open(FILE,"<$LOGPATH.dat");
    eval{ flock(FILE,2)};
    while(@ln = <FILE>) {
        foreach $da (@ln) {
            ($a,$b,$c,$d) = (split(/    /,$da));
            foreach $data (split(/    /,$da)){
                chomp $data;
                printMain();
            }
        }
    }
}
print "</tr></table>";
close(FILE);

#==================登録項目出力===================
sub printMain{
    $br ='br';
    if($data eq $br) {
        print "<td><form action=\"$ENV{'SCRIPT_NAME'}\" method=\"POST\">\n";
        print "<input type='image' src='./del.gif'>\n";
        print "<input type='hidden' name='del' value='$a'>\n";
        print "</form></td></tr><tr>";
    }else {
        print "<td>$data</td>";    
    }
}
print $lm;
#=================登録項目の追加===================
sub addKoumoku{
    if(exists $FORM{'koumoku'}){ #入力データがあれば
        open(FILE,">>$LOGPATH.dat") or die("ERROE: open log-file.");
        eval{ flock(FILE,2)};
        seek(FILE,0,2);
        print FILE "$FORM{'koumoku'}\t$FORM{'kind'}\t$FORM{'size'}\tbr\n";
        close(FILE);
    }
}
#=================登録項目の削除===================
sub deleteKoumoku{
    $koumoku = $FORM{'del'};
    
    open(DATA,"+<$LOGPATH.dat") or die("ERROE: open log-file.");
    while($lm = <DATA>) {
        foreach $k ($lm) {
            if($k =~ /$koumoku(.+)/){
            undef($k);
            #ファイルへ書き込み
            seek(DATA,0,0);
            print DATA $k;
            close(DATA);
            printMain();
            }
        }    
    }
}


1:[質問] kk [2004/02/03 23:03 ]

ちなみに、datファイルの中身はこんな風にならんでいます。
項目と項目の間はタブが入ってます。

    <<中身>>
あああ    text    かかか    br
いいい    text    ききき    br
ううう    text    くくく    br
えええ    text    けけけ    br
おおお    text    ここここここ    br


2:[回答] pugtoro [2004/02/04 01:33 ]

while($lm = <DATA>) {
       foreach $k ($lm) {
           if($k =~ /$koumoku(.+)/){
           undef($k);
           #ファイルへ書き込み
           seek(DATA,0,0);
           print DATA $k;
           close(DATA);
           printMain();
           }
       }    

ここがずいぶんトリッキーだね(w)。
もう少し見直した方がいいんじゃない??

スペース区切りの文字列が、$lm に入ってくると思うんだけど
これって、@arr = split("\s",$lm); とかやらなくてもいいの??
これやってから foreach $k (@arr) { ... } じゃないのかな??
なんでも一緒にやらないで別々にしてやるとミスが少ないよ。
・<DATA> から全て読み込んで、@data 配列に格納する処理
・@data 配列を1項目づつ読んで、中身を split() して
その中の部分文字列が /$koumoku/ とマッチしているかどうか
を判定する処理
・マッチしたとき、配列の該当行を splice で削除する処理
・マッチしなかったら DATA ファイルをクローズして printMain
する処理
・マッチしたら、@data 配列(splice で削除済み)をDATA
ファイルへ出力する処理
・printMain する処理

だよね。
箇条書きにして処理を見直してみる事が重要だよ。
手馴れた人は箇条書きの部分が頭の中で連想できるだけで、
慣れない人は紙に書いて・・・

慣れてくれば、こーゆー処理はおまじないみたいになってくる
から。

じゃね。


3:[保留] kk [2004/02/04 11:46 ]

pugtroさん、とっても汚いソースを見てくださって
しかもとても丁寧にご説明頂いてありがとうございます。

もう一度整理して考え直してみます^^


4:[質問] kk [2004/02/04 18:29 ]

お陰様でちゃんと出力することができました^^

しかし、ファイルにちゃんとその結果を書き込んで
くれません。なぜか部分部分で削除されてしまいます。
下の方で、FILEを書き込み用にして、SEEK関数の
ファイルポインタも先頭にしているのですが・・・。
たぶんその当たりが間違っていると思うのです。
でもどうがんばっても結果に変わりありません。
どうかもう一度お力を貸してください〜>_<

$LOGPATH ='./koumoku_log/koumoku';

$koumoku = 'れれ';
open(DATA,"$LOGPATH.dat") or die("ERROE: open log-file.");
    @lm = <DATA>;
    close DATA;
    foreach $lm (@lm) {
            if($lm =~ /$koumoku/){
                 undef $lm;
            }
            open(DATA,">$LOGPATH.dat") or die("ERROE: open log-file.");
            seek(DATA,0,0);
            print DATA "$lm";
            print "$lm";
            close DATA;
        }


5:[完了] kk [2004/02/04 19:59 ]

あら?またアンポンタンなことしてました。
すんません。解けました〜^-^

pugtoro さん
本当にありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World