70063


# やっていること

テキストファイルに入力した内容を編集したい。

## 詳細な要件

同様に、指定された番号のものだけ編集できるようにする  
a.入力フォームとは別に、編集番号指定用フォームを用意する。項目は編集対象番号。  
b.POST送信にて編集番号を送信する。その際if文で編集フォームから値が送信された場合のみの処理に分岐させておく  
c.fileで配列化して読み込み、ループさせる  
d.explodeを使って投稿番号を取得する  
e.各投稿番号とPOSTで送信された編集番号を比較し、イコールの時の配列値を取得する  
f.(1)で用意した入力フォームに、取得した配列値を入力済み状態で表示させる  
g.その値をPOSTで送信して編集を行うが、編集かどうかわかるようにタグを用いて、編集モードかどうかを判別する  
h.編集内容の値が送信されたら、同じくc～dの処理を行い、eと同じように番号の比較を行って、イコールの時に配列値を取得するのではなく送信された値と差し替える  
i.差し替えた配列をテキストに上書き保存する

## つまっているところ

現在つまっているのが上記のf.になります。  
まずfの、下記のコードで２つ以上のコメントを投稿した状態で、編集用のフォームに数値を入力して編集ボタンを押すと投稿フォームにその数値に対応する値を表示するところまでやりたいです。現状それをやると、対応する値ではなくかならずidの最後の値がフォームに表示されてしまいます。これを直して編集フォームに入力した数値を押すと、投稿フォーム（名前と、コメント）にその数値に対応する値を表示させたいです。

# 全コード

[code]

    <?php
    // グローバル変数
    $file = "kadai_5.txt";
    $comment = $_POST["comment"];
    $name = $_POST["name"];
    
    // 投稿機能
    if (!empty($comment && $name)) {
     $date = date("Y/m/d H:i:s");
     $fp_all = fopen($file, "a");
     $data = file_get_contents($file);
     $file_data = explode("\n", $data);
     $count = count($file_data);
     fwrite($fp_all, $count++ . "<>" . $name . "<>" . $comment . "<>" . $date . "<>" . PHP_EOL);
     fclose($fp_all);
    }
    
    // ファイルの中身を配列化
    $file_arr = file($file);
    // echo '<pre>';
    // var_dump($file_arr);
    // echo '<pre>';
    
    
    //削除機能
    if (!empty($_POST["deleteId"])) {
     $delete = $_POST["deleteId"];
     $fp_write = fopen($file, "w");
     foreach ($file_arr as $file_txt) {
      $file_split = explode("<>", $file_txt);
      $id = $file_split[0];
      $name = $file_split[1];
      $comment = $file_split[2];
      $date = $file_split[3];
      if ($id == $delete) {
       // echo '<p>';
       echo "削除されました";
       // echo '<p>';
      } else {
       if ($id > $delete) {
        $id = $id - 1;
       }
       fwrite($fp_write, $id . "<>" . $name . "<>" . $comment . "<>" . $date . "<>" . PHP_EOL);
      }
     }
     fclose($fp_write);
    }
    // if (!empty($_POST['updateId'])) {
    //  $update = $_POST['updateId'];
    //  echo $update;
    // }
    // 編集機能
    if (!empty($_POST['updateId'])) {
     $update = $_POST['updateId'];
     // aにすると権限が消えない。
     $fp_write = fopen($file, "w");
     // echo $update;
     // $writeData = ($_POST['updateId'] ?: count($file_arr) + 1) . "<>" . $_POST['name'] . "<>" . $_POST['comment'];
     // echo gettype($writeData);
     // $hidden_update = $_POST["update"];
     $submit_type2 = $_POST["hiddeneditnum"];
     if (isset($_POST["name"])) {
      $name = $_POST["name"];
     }
     if (isset($_POST["comment"])) {
      $comment = $_POST["comment"];
     }
     // $fp3 = fopen("kadai_2-6.txt", "w");
     foreach ($file_arr as $file_txt) {
      $file_split = explode("<>", $file_txt);
      $id = $file_split[0];
      $name = $file_split[1];
      $comment = $file_split[2];
      $date = $file_split[3];
    
      // if ($id == $submit_type2) {
      if ($id == $update) {
       $file_split[0] = $id;
       $file_split[1] = $name;
       $file_split[2] = $comment;
       $file_split[3] = $date;
      }
      fwrite($fp_write, $id . "<>" . $name . "<>" . $comment . "<>" . $date . "<>" . PHP_EOL);
     }
     fclose($fp_write);
    }
    ?>
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
    
    <body>
     <form action="" method="post">
      名前：<input type="text" name="name" value="<?php if (!empty($_POST["updateId"])) {
                                                echo $name;
                                               } ?>" />
      コメント：<input type="text" name="comment" value="<?php if (!empty($_POST["updateId"])) {
                                                     echo $comment;
                                                    } ?>" />
      <input type="submit" value="送信" />
      <input type="hidden" name="updateId" value="<?php echo $_POST["updateId"]; ?>" />
     </form>
     <br>
     <form action="" method="post">
      削除id：<input type="number" name="deleteId" value="" />
      <button type="submit">削除</button>
     </form>
    
     <form action="" method="post">
      編集id：<input type="number" name="updateId" value="<?php if (!empty($_POST["updateId"])) {
                                                        echo $_POST["updateId"];
                                                       } else {
                                                        echo "";
                                                       } ?>" />
      <input type="hidden" name="update" value="<?php if (!empty($_POST["updateId"])) {
                                                 echo $_POST["updateId"];
                                                } else {
                                                 echo "";
                                                } ?>">
      <button type=" submit">編集</button>
     </form>
     <br>
    
     <?php
     foreach ($file_arr as $file_txt) {
      $file_split = explode("<>", $file_txt);
      $id = $file_split[0];
      $name = $file_split[1];
      $comment = $file_split[2];
      $date = $file_split[3];  
      print_r($id . "<>" . $name . "<>" . $comment . "<>" . $date);
      echo "<br>";
     }
     ?>
    </body>
    
    </html>
    
[/code]

# 試したこと

すみません、エラー文がないので検討がつきませんでした。

# 質問者のスキルレベル

Laravelはブログやメディア系のアプリならとりあえず作れるレベル、保守性は意識しない。  
ただpurePHPでの成果物作りはほぼ初心者（１週間ほど）です。

何かアドバイスあればよろしくお願いします。


CC BY-SA 4.0
2020-09-01T22:10:12.207
70059
2020-09-02T01:25:39.853
36424
question
php
PHP テキストファイルの編集機能を実装したい。


編集機能のifブロックの中でforで$nameと$commentにずっと代入していますね。  
そのため該当の$idが見つかってもfor分は止まらないため  
一番最後のデータの$nameと$commentが表示されてます。  
一時的な変数とビューで使う変数名は別で定義したほうが混乱せず使えると思います。

[code]

     foreach ($file_arr as $file_txt) {
      $file_split = explode("<>", $file_txt);
      $id = $file_split[0];
      $name = $file_split[1];    //$nameにいったん入れているがこの変数はforでぐるぐる
      $comment = $file_split[2]; //まわっているためforの最後のデータが入ってしまっている。
      $date = $file_split[3];
    
[/code]

あとは今回の質問とは関係ないですが、  
・PHPのエラーがないとの話ですがNoticeレベルのエラーは発生しているようです。  
・編集削除投稿の処理は並列で互いに干渉しないように排他的（elseifでつなげるとか、関数化してしまうとか）に書くとよいと思います  
・サニタイズされていないので<>のデータが入ってきたりするとデータが崩れます。  
・XSSの脆弱性があります。

ぜひ考慮してみてください。


CC BY-SA 4.0
2020-09-02T00:46:47.073
70063
2020-09-02T01:25:39.853
2020-09-02T01:25:39.853
22665
22665
70059
answer