• ベストアンサー

掲示板を全削除機能にしたいのですが

現在使っている掲示板は投稿を個別に削除は出来るのですが、一括削除は出来ません。一括削除だけしたいのですが、一括削除できる定型文のようなものはあるのでしょうか?よろしくお願いします。(Iモード用BBSです。本CGIスクリプトのメンテ部分です。) sub mainte { my($del) = (0); if($form{'pass'} ne $mainte_pass){ &error ("bad password."); } $out_val{'pass'} = $form{'pass'}; if($form{'id'}){ # delete if(&lock($log_file, 5)){ open (IN, "< $log_file") or &error ("can't open $log_file to read. $!"); open (OUT, "> $log_file.$$") or &error ("can't open $log_file.$$ to write $!"); $del = 0; while(<IN>){ if(/^$form{'id'}\t/){ $del = 1; next; }else{ print OUT $_; } } close IN; close OUT; if($del){ rename $log_file, "$log_file.bak"; rename "$log_file.$$", $log_file; chmod 0666, $log_file; $msg = qq|$form{'id'}番の投稿を削除しました。<BR>\n <A href="$out_val{'cgi_name'}">戻る</A>|; &error($msg); }else{ unlink "$log_file.$$"; $msg = qq|$form{'id'}番の投稿は存在しません。<BR>\n <A href="$out_val{'cgi_name'}">戻る</A>|; &error($msg); } } }else{ if(&lock($log_file, 5)){ open (IN, "< $log_file") or &error ("can't open $log_file to read. $!"); while(<IN>){ ($id, $time, $name, undef, $title ) = split "\t"; $out_val{'del_list'} .= qq|$id, $time, $name, $title<BR>\n|; } &page_out($mainte_page); } } unlock($log_file); return 1; }

質問者が選んだベストアンサー

  • ベストアンサー
  • oodaiko
  • ベストアンサー率67% (126/186)
回答No.2

できればお使いの掲示版スクリプトの名前(と出来ればダウンロード先URLも) お書き下さい。そうすればもう少し詳しくお答え出来ると思います。 この掲示版の管理者による削除方式は 1:削除したい記事の番号がわかっている場合: その番号を削除番号入力フォーム (例えば <input type="text",name="id" maxlength="10" size="3"> など) に入力してからメンテナンスモードへの submitボタン(おそらくvalueは「削除」だと思いますが) を押すとそのまま指定した番号の記事が削除され 2:削除したい記事の番号がわからない場合: 削除番号入力フォームに入力せずそのままメンテモードに移行すると 記事の番号、タイトル等の一覧表を(おそらく削除ボタン付で)出力し、 削除したい記事のボタンをチェックしてからsubmitボタンを押すと チェックした記事が削除される。 と言う方式のようですが、違うのであれば補足して下さい。 そして一括削除をしたいと言うことは (A):1の場合は複数の番号をまとめて指定すると指定した番号の記事を一括して削除する。 (B):2の場合は複数の記事の削除ボタンをチェックするとそれらの記事をまとめて削除する。 ということをしたいのでしょうか。 (B)の方をやろうとすると cockyさんが書かれているように、入力処理のルーチンも いじらないと一括削除は出来ないと思います。 とりあえず(A)のほうだけを出来ればよいのならこのサブルーチンをいじるだけでも 対応できると思います。 ただしそのような改造をすると(B)のほうがおかしくなるおそれがあります。

mitsy
質問者

補足

すみません。しばらく留守していたもので、返事が遅くなりました。申し訳ありません。これは本に付いていたCDに入っていたものです。書かれていたように削除番号入力フォームに番号を入れて削除できるものです。ですが無入力でsubmitボタンを押すと、画面は変わらず、そのままで変わらないようにスクリプトができています。私とすれば単にログを消したいだけですので、削除番号入力フォームの中に全てを意味するような語句を入力すれば出来るのかなとか、あるいは、別フォームを作ってIDを全てクリアすると言う形なのかなーとか思いまして・・・。ちなみに(A):1の場合の複数の番号ですが、カンマくぎりで数字を羅列したり、ALLなどと入れてみたのですが、エラーになります。(A):1の方法でやるとすると、いくらかは簡単でしょうか?よろしくお願いします。

その他の回答 (1)

  • cocky
  • ベストアンサー率57% (232/402)
回答No.1

一括削除をするということは、Formから同じnameで複数の値が入った形(例;「bbs.cgi?id=1&id=2&id=3」)で削除対象となる記事番号が渡されるということでしょうか? であれば、URL decodeするルーチンでそういった値を処理できるようにしておかないといけないので、実現はそんなに簡単ではありません。 CGI.pmを使っているのであれば、上記の例のような形でデータが渡された場合でも @delete_id = $query->param( 'id' ); といった形で配列にデータを入れることができるので、あとはforeachでループを回せばいいだけの話なんですが。