電子書籍の厳選無料作品が豊富!

投稿すると自動的にその投稿に対して記事番号なるものが割り当てられ、
その記事番号と自分で投稿時に決めた削除パスワードで
自分の投稿を削除する形式の掲示板なのですが
パスワードや記事番号が入力されていない場合には
〇〇〇が入力されていませんと表示されるにもかかわらず
存在しない記事番号が入力して削除しようとすると
「正常に削除いたしました」と表示されてしまいます。
(実際には存在しない記事番号なので何も削除されていないのですが)

そこで下記のようにの#~#の部分を追加で記述し、
記事番号が存在しない場合にエラーとなるようにしてみたのですが
これで本当にいいのか正直不安なのです。
正しいかチェックしていただけませんか?


@new=();
open (IN,"$file") || error("システムエラー","ファイル「$file」を開くことができません。");
while($data = <IN>) {
$flag=0;
($no,$res,$date,$cntr,$email,$tall,$weight,$age,$sub,$com,$live,$select,$photo,$pw) = split(/<>/,$data);
if ($FORM{'pass'} eq "$ad_pass") {
foreach $del (@DEL) {
if ($no eq "$del") { $flag=1; last; }
}
}
else {
if ($FORM{'del'} eq "$no") {
if (!($pw)) { &error("入力エラー","指定された記事には削除キーが設定されていません。"); }
if (crypt($FORM{'pass'},$pw) ne "$pw") { &error("入力エラー","パスワードが間違っています。"); }
$flag=1;
}
#記事番号が存在しない時、エラーを表示追加
if ($FORM{'del'} ne "$no") {
if (crypt($FORM{'pass'},$pw) ne "$pw") { &error("入力エラー","記事番号が存在しません。記事番号を確認して入力し直してください。"); }
}
#ここまで
}
if ($flag == 0) { push(@new,$data); }
}
close (IN);

A 回答 (1件)

while文の中にチェックするためのif文が入っている時点で、間違っていると思います。

ざっとプログラムを読んだ感じだと、ファイルの最初に出てくる記事のID、パスワードと一致しない場合にエラーを出すようになっているように見えます。つまり、最初に出てくる記事のIDと違うものを入れた場合にたまたまエラーになります。

自分だったら削除の有無を示すフラグを追加して、全部の記事を調べたあとに削除フラグが立っていなかったらエラーにします。実行させていないので、微妙にバグがあるかもしれませんが、コードにすると下記のとおりです。
変更箇所の前後にコメントをつけています。

@new=();
open (IN,"$file") || error("システムエラー","ファイル「$file」を開くことができません。");
# 記事が削除されたことを示すフラグを追加
$article_removed = 0;
# ここまで
while($data = <IN>) {
$flag=0;
($no,$res,$date,$cntr,$email,$tall,$weight,$age,$sub,$com,$live,$select,$photo,$pw) = split(/<>/,$data);
if ($FORM{'pass'} eq "$ad_pass") {
foreach $del (@DEL) {
if ($no eq "$del") {
$flag=1;
last;
}
}
} else {
if ($FORM{'del'} eq "$no") {
if (!($pw)) {
&error("入力エラー","指定された記事には削除キーが設定されていません。");
}
if (crypt($FORM{'pass'},$pw) ne "$pw") {
&error("入力エラー","パスワードが間違っています。");
}
$flag=1;
}
}
# $flag==1の時は記事が削除されるので、$article_removedの値を1に変更
# 元のプログラムを次のように変更。
if ($flag == 0) {
push(@new,$data);
} else {
$article_removed = 1;
}
#ここまで
}
# $article_removedが0のままだったら指定された記事番号が無いのでエラー
if (!$article_removed) {
&error("入力エラー","記事番号が存在しません。");
}
# ここまで
close (IN);

この回答への補足

再度ご指摘いただいた通りに書き直してみたところ
正常に稼働し、やりたいことがきちんとできました!
回答として書きたかったのですが、
一度書いてしまうともう投稿できませんでしたので
補足にてお礼を失礼いたします。
ありがとうございました!

補足日時:2012/02/12 20:48
    • good
    • 0
この回答へのお礼

大変丁寧な説明など誠にありがとうございます。
先ほどご指摘していただいた構文で動作確認してみましたが、
投稿者が設定した削除パスワードでも、
管理用パスワード($ad_pass)でも削除することができなくなってしまいました。

質問に書きました構文の前には以下のような構文があるのですが・・・。


if($FORM{'del'} eq ""){ &error("入力エラー","記事番号が入力されていません。"); }
if ($FORM{'del'} eq "") {
if ($FORM{'pass'} eq "$ad_pass") { $FORM{'page'}=""; &del; }
else { &enter; }
}

if ($FORM{'ch'}) {
if ($FORM{'ch'} eq "e") { &edit; }
}
elsif ($FORM{'m'} eq "admin") {
if ($furiwake eq "mobile") {
&header;
print "<form action=\"$e_script\" method=\"$method\">";
&m_title("管理処理");
print "記事No.$FORM{'del'}を編集します。パスワードを入力、処理を選択してください。$hr";
if ($FORM{'type'}) { print "<input type=\"hidden\" name=\"type\" value=\"$FORM{'type'}\">"; }
print "<input type=\"hidden\" name=\"m\" value=\"admin\">";
print "<input type=\"hidden\" name=\"del\" value=\"$FORM{'del'}\">";
print "<input type=\"hidden\" name=\"id\" value=\"$id\">";
print "Pass.<input type=\"password\" name=\"pass\" value=\"\" size=\"8\">$br";
print "<select name=\"ch\">";
print "<option value=\"e\">修正";
print "<option value=\"d\">削除";
print "</select>";
print "<input type=\"submit\" value=\"認証\">";
print "$hr";
print "$emoji[0]<a href=\"$script?id=$id$t_type\" $ackey=\"0\">トップに戻る</a>$br$br";
print "</form>";
&footer;
exit;
}
elsif ($furiwake eq "pc") { &error("入力エラー","使い方が間違っています。"); }
}

&lock;

お礼日時:2012/02/11 10:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!