こんにちわ,(^-^)
chirumiruです.
レスがつかないので,ソースを公開してみます.
sub init_form {
my ($charcode)=@_;
my (@parts, $query, $valiable, $value);
my ($method)=$ENV{'REQUEST_METHOD'};
$method=~tr/A-Z/a-z/;
if ($method eq 'post') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else {
$query=$ENV{'QUERY_STRING'};
}
@del=(); #削除するデータの番号を保存する.
@parts=split(/&/, $query);
foreach (@parts) {
($valiable, $value)=split(/=/);
$value=~tr/+/ /;
$value=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value, $charcode);
if ($valiable=='mycomment') {
if ($tag==0) { $value=~s/</\<\;/g; $value=~s/>/\>\;/g; }
else { $value=~s/<>/\<\;\>\;/g; $value=~s/<!--(.|\n)-->*//g; }
}
if ($valiable eq 'target') { push(@del, $value); }
$form{$valiable}=$value;
_______________
&init_form($kanjicode);
if ($myaction eq 'wri') { &wri_; }
if ($myaction eq 'dis') { &data_($block); }
if ($myaction eq 'del') { &del_; }
if ($myaction eq 'res') { &res_; }
&data_(0);
_______________
<td colspan=2><select name=myaction><option value=del>削除</select></td>
</tr>
<tr>
<td><input type=password name=pass size=8></td><td><input type=submit value=送信></td>
</tr>
</table>
</form>
#削除するデータは,“checkbox”で選ぶ.名前は“target”.
_______________
sub del_ {
open(PUCCHI, "$datfile") || die "can't open $datfile: $!";
@databank=<PUCCHI>;
close(PUCCHI);
if ($form{'pass'} eq '') { &error_("パスワードの未入力"); }
@wri=(); #削除される記事番号をためる.
foreach $x (0..$#del) {
foreach $z (0..$#databank) { #$dnoはデータ自信の番号.
($dno, $dtitle, $dname, $dcomment, $dmail, $dlink, $dcolor, $dtype, $dip, $dico, $ddel, $filler, $dtime)=split(/<>/, $databank[$z]);
if ($dno==$del[$x]) { last; }
}
if ($dtype==0) { #$dtype,親記事=そのパスワードだけをチェックして,子記事はすべて削除される.
#$dtype,“0”の時は親記事,それ以外の時は,その値を記事番号とするデータの子記事.
if ($ddel eq '') { &error_("このデータにパスワードは設定されていません!"); }
elsif (crypt($form{'pass'}, $salt) ne $ddel) { &error_("パスワードが一致しません!"); }
else { push(@wri, $dno);
for ($y=0; $databank[$y]; $y++) {
my ($cno, $ctitle, $cname, $ccomment, $cmail, $clink, $ccolor, $ctype, $cip, $cico, $cdel, $cfiller, $ctime)=split(/<>/, $databank[$y]);
if ($dno==$ctype) { push(@wri, $dno); }
}
}
}
else {
if ($ddel eq '') { &error_("このデータにパスワードは設定されていません!"); }
if (crypt($form{'pass'}, $salt) ne $ddel) { &error_("パスワードが一致しません!"); }
push(@wri, $dno);
}
}
#@wriにゴミがプッシュされる.
$flag=0;
open(PUCCHI, ">$datfile") || die "can't open $datfile: $!";
if ($lock) { if (!&lock_(PUCCHI, 1)) { &error_("can't lock\n"); } }
foreach $i (0..$#databank) {
my ($no, $title, $name, $comment, $mail, $link, $color, $type, $ip, $ico, $del, $filler, $time)=split(/<>/, $databank[$i]);
foreach $j (0..$#wri) {
if ($wri[$j]==$no) { $flag=1; last; }
}
if (!$flag) { print PUCCHI "$databank[$i]"; $flag=0; }
}
$filesize=tell(PUCCHI);
truncate(PUCCHI, $filesize);
close(PUCCHI);
if ($lock) { &lock_(PUCCHI, 0); }
}
現象としては,子記事を削除するときでも,そのデータ番号より若い,番号のデータが有れば削除をします.
http://hpcgi2.nifty.com/penelotty/pucchi2.cgi
^^^^^^^^^^^
↑
pucchi.cgiは暫定バージョンとして稼働中ですので,お間違えにならないよう,よろしく願います.
ご教示,よろしく願います.
http://homepage2.nifty.com/penelotty/index.html
それでは.
chirumiru(“愛に御用心”管理人)