質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.54%

削除機能のニュアンスを変更したいです。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 695

takakuni

score 12

前提・実現したいこと

削除機能について実装したいです。
一応、削除機能としては備わっているのですが、自分の幅を広げるために、ニュアンスを変更した形でも実装したいと考えています。
ここに質問の内容を詳しく書いてください。
簡易掲示板の作成中です。
今備わっている、削除機能は、削除番号を指定し、指定された番号に基づいて上書き(削除しました)と表示されるものになっています。

この、機能をファイルの内容を取り出して、ファイルを一度空にして、行ごとにファイルに書き込んでいく(ただし削除番号と一致する場合は書き込まない)ような機能に変更したいです。

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $value = $_POST['mode'];
        switch( $value ){
            case "insert":
                $name = $_POST['name'];
                $comment = $_POST['comment'];
                $time = date('Y年m月d日 H時i分s秒');
                if (file_exists($filename)) {
                    $number = count(file($filename))+1;
                    } else {
                    $number = 1;
                } // ファイルがあれば、番号は+1した値を代入、なかったら、番号は1
                $datalist = $number."<>"."\t".$name."<>"."\t".$comment."<>"."\t".$time."\n";
                $fp = fopen($filename, 'a'); // 変数filenameを追記モードで開き、変数fpに代入
                fwrite($fp, $datalist); // 変数fpに変数datalistに書き込まれたデータを代入
                fclose($fp); // 変数をfpを閉じた。
            break;
            case "delete":
                $delete = $_POST["delete"]; // 変数deleteを宣言して投稿されたdeleteを代入する
                $delCon = file($filename); // delConを宣言する。変数のfilenameを配列化して代入
                $fp = fopen($filename, "w");    //php内で変数fpを宣言してファイルを作成、書き込みモードで開く
                for ($j = 0; $j < count($delCon); $j++) { // ループの初期化、変数delConの要素数より少ない分ループを行う。行った後はループを1足す。
                    $delData = explode("<>", $delCon[$j]); // 変数delDateを宣言して
                    if ($delData[0] != $delete) {
                        fwrite($fp, $delCon[$j]);
                     } else {
                        fwrite($fp, "消去しました。\n");
                     }
                 }
                 fclose($fp);
            break;
         }
    }
?>
<body>
<form action="" method="post">
    名前: <input type="text" name="name">
    コメント: <input type="text" name="comment">
    <button type="submit" name="mode" value="insert">登録する</button>

    削除対象番号:<input type="text" name="delete">
    <button type="submit" name="mode" value="delete">削除する</button>
    </form>
</body>
    <?php
      if (file_exists($filename)) {
       $datalists = file($filename);
       foreach ($datalists as $value) {
         list($number, $name, $comment, $time) = explode("<>", $value);
         echo h($number);
         echo h($name);
         echo h($comment);
         echo h($time);
         echo nl2br("\n");
       }
     }else{
       echo "コメントが1件もありません";
     }

     ?>

試したこと

削除番号の指定用フォームは作れていると思う
ファイル内容の取り出しはfile関数でできていると思う
一度ファイルを空にするのはfopen関数のwでできていると思う

行ごとにファイルに書き込んでいく(ただし削除番号と一致する場合は書き込まない)ような機能がよくわかっていないと思います。

https://teratail.com/questions/137315
一通り、この記事を読んだのですが、よくわかりませんでした。

追加で、

   if ($delDate[0] != $delete) {
                        fwrite($fp, $delCon[$j]);
                     } else {
                        fwrite($fp, "消去しました。\n");
                     }
                 }


の部分が自分でもよくわかっていないので教えていただきたいです。

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • takakuni

    2019/03/04 13:10

    delDataに変更しました!

    キャンセル

  • m.ts10806

    2019/03/04 13:11

    質問修正してからコメントいただけたらと・・。

    キャンセル

  • takakuni

    2019/03/04 13:14

    すいません。。順番間違えました。。。

    キャンセル

回答 1

checkベストアンサー

0

試してないですが、下記のような感じではないでしょうか。
※変数名を意味あるように修正しています。

$delCon = file($filename);
$fp = fopen($filename, "w");
for ($j = 0; $j < count($delCon); $j++) {
    $delData = explode("<>", $delCon[$j]);
    if ($delData[0] == $delete) continue;

    fwrite($fp, $delCon[$j]);
}
fclose($fp);

continue

ループ構造において現在の繰り返しループ の残りの処理をスキップし、条件式を評価した後に 次の繰り返しの最初から実行を続けるために使用されます

つまり、削除対象と一致すればスルーして次のデータ(レコードへ)
一致しなければ書き込み

https://teratail.com/questions/137315
一通り、この記事を読んだのですが、よくわかりませんでした。
追加で、...の部分が自分でもよくわかっていないので教えていただきたいです。

1行1行追っていくと良いです。その直前までコメントでかかれてますよね?同じように
※直前のコメントも正確ではないのでついでに追記してます

$delDate = explode("<>", $delCon[$j]);// コメントデータ$j行目を1つ取り出した情報を<>で分割した上で変数delDateに格納
if ($delDate[0] != $delete) { //コメントデータの最初は「コメント番号」なのでそれと入力された対象番号を比較、同じではない場合
    fwrite($fp, $delCon[$j]); //一致しないので削除対象ではないとして書き込み
} else {
    fwrite($fp, "消去しました。\n"); //一致しているものは消去データとして書き込み
}

つまり、私はだいぶ簡略化したコードにしましたが、さっと対応したいだけなら下記でも良いです

                $fp = fopen($filename, "w"); 
                for ($j = 0; $j < count($delCon); $j++) {
                    $delDate = explode("<>", $delCon[$j]);
                    if ($delDate[0] != $delete) {
                        fwrite($fp, $delCon[$j]);
                     } else { //何も書き込まない
                     }
                 }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/04 13:41

    「追加で」についての回答もしてますが、そちらは問題ないですか?
    機能についてはphpマニュアルも確認してくださいね

    キャンセル

  • 2019/03/04 13:43

    コメント欄を確認してわかりました!ありがとうございます!

    キャンセル

  • 2019/03/04 13:54

    理解が進んだようで何よりです。
    あわせて必ずPHPマニュアル確認してください。仕様は全てそこにあります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る