![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
投稿すると自動的にその投稿に対して記事番号なるものが割り当てられ、
その記事番号と自分で投稿時に決めた削除パスワードで
自分の投稿を削除する形式の掲示板なのですが
パスワードや記事番号が入力されていない場合には
〇〇〇が入力されていませんと表示されるにもかかわらず
存在しない記事番号が入力して削除しようとすると
「正常に削除いたしました」と表示されてしまいます。
(実際には存在しない記事番号なので何も削除されていないのですが)
そこで下記のようにの#~#の部分を追加で記述し、
記事番号が存在しない場合にエラーとなるようにしてみたのですが
これで本当にいいのか正直不安なのです。
正しいかチェックしていただけませんか?
@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);
No.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;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
fortranでプログラムを実行する...
-
Excelのエラーで困ってます。
-
sys/time.hのインクルードがで...
-
バッチからsqlplusの接続エラー...
-
適切な変換関数が存在しない???
-
visual C++ でビルドの中止がで...
-
Handlesについて
-
ビルド失敗 指定されたファイ...
-
HEWを使用しているのですが、こ...
-
VBScriptによるExecuteExcel4Ma...
-
SQLServerについて
-
Visual Studioのstrcpy_sについて
-
graph.hのヘッダーファイルの中...
-
コンパイルできません。
-
LPCWSTRとchar
-
RangeクラスのSelectメソッドが...
-
error C3867 関数呼び出しには...
-
ビルドが失敗してしまいます
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
適切な変換関数が存在しない???
-
fortranでプログラムを実行する...
-
Excelのエラーで困ってます。
-
Handlesについて
-
HEWを使用しているのですが、こ...
-
バッチからsqlplusの接続エラー...
-
デバッグ中のエラーのことで教...
-
VB2008で定数に色の設定をした...
-
コンパイルできません。
-
sys/time.hのインクルードがで...
-
multiple definitionというエラー
-
HANDLEの宣言でのエラー
-
BC30002: 型 'ListItem' が定義...
-
visual C++ でビルドの中止がで...
-
RightとLeft関数のライブ...
-
ビルド失敗 指定されたファイ...
-
Visual Studioのstrcpy_sについて
-
エクセルでマクロを実行すると...
おすすめ情報