- ベストアンサー
記事削除機能の不具合について
- 投稿すると自動的に記事番号が割り当てられ、その記事番号と削除パスワードで自分の投稿を削除する掲示板の不具合について。
- パスワードや記事番号が入力されていない場合にエラーメッセージが表示されず、削除が正常に行われてしまう問題がある。
- 記事番号が存在しない場合にもエラーメッセージを表示するように追加で記述したが、正確な確認が必要か不安。
- みんなの回答 (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);
お礼
大変丁寧な説明など誠にありがとうございます。 先ほどご指摘していただいた構文で動作確認してみましたが、 投稿者が設定した削除パスワードでも、 管理用パスワード($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;
補足
再度ご指摘いただいた通りに書き直してみたところ 正常に稼働し、やりたいことがきちんとできました! 回答として書きたかったのですが、 一度書いてしまうともう投稿できませんでしたので 補足にてお礼を失礼いたします。 ありがとうございました!