作者: Penelotty
日時: 2003/1/26(22:08)
こんにちわ,(^-^)
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/</\&lt\;/g; $value=~s/>/\&gt\;/g; }
			else { $value=~s/<>/\&lt\;\&gt\;/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(“愛に御用心”管理人)