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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3957閲覧

PHP 編集後のファイル書き込みについて

terutin

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/07/02 14:07

前提・実現したいこと

PHPで簡易掲示板を作成しているのですが、編集機能において編集し差し替えた後のテキストファイルの中身とブラウザの表示が、差し替えた文が2文表示されてしまいうまくいかない状態です。
例

上記の画像の状態で「a」を「b」と「comment」を「編集したよ」と変更し送信ボタンを押すと

1 a これはテストです
2 b 編集したよ
3 a test
4 b 編集したよ

と表示されてしまいます。
実現したい状態としてはこの4行目を表示させたくないです。
よろしければコードミスなどを教えていただきたいです。

該当のソースコード

php

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>mission_3-4</title> 6 <style> 7 form { 8 margin-bottom: 20px; 9 } 10 </style> 11 </head> 12 <body> 13 14 <?php 15 $filename = "mission_3-4.txt"; 16 17 //投稿機能 18 19 //フォーム内が空でない場合に以下を実行する 20 if (!empty($_POST['name']) && !empty($_POST['comment'])) { 21 22 //入力データの受け取りを変数に代入 23 $name = $_POST['name']; 24 $comment = $_POST['comment']; 25 26 //日付データを取得して変数に代入 27 $postedAt = date("Y年m月d日 H:i:s"); 28 29 //ファイルの存在がある場合は投稿番号+1、なかったら1を指定する 30 if (file_exists($filename)) { 31 $num = count(file($filename))+1; 32 } else { 33 $num = 1; 34 } 35 36 //書き込む文字列を組み合わせた変数 37 $newdata = $num . "<>" . $name . "<>" . $comment . "<>" . $postedAt; 38 39 //ファイルを追記保存モードでオープンする 40 $fp = fopen($filename,"a"); 41 42 //入力データのファイル書き込み 43 fwrite($fp,$newdata . "\n"); 44 fclose($fp); 45 } 46 47 //削除機能 48 49 //削除フォームの送信の有無で処理を分岐 50 if (!empty($_POST['dnum'])) { 51 52 //入力データの受け取りを変数に代入 53 $delete = $_POST['dnum']; 54 55 //読み込んだファイルの中身を配列に格納する 56 $delCon = file($filename); 57 58 //ファイルを書き込みモードでオープン+中身を空に 59 $fp = fopen($filename,"w"); 60 61 //配列の数だけループさせる 62 foreach ($delCon as $line) { 63 64 //explode関数でそれぞれの値を取得 65 $deldata = explode("<>",$line); 66 67 //削除番号と行番号が一致しなければ書き込み 68 if ($delete !== $deldata[0]) { 69 70 //入力データのファイル書き込み 71 fwrite($fp,$line); 72 } 73 } 74 fclose($fp); 75 } 76 77 //編集選択機能 78 79 //編集フォームの送信の有無で処理を分岐 80 if (!empty($_POST['edit'])) { 81 82 //入力データの受け取りを変数に代入 83 $edit = $_POST['edit']; 84 85 //読み込んだファイルの中身を配列に格納する 86 $editCon = file($filename); 87 88 //配列の数だけループさせる 89 foreach ($editCon as $line) { 90 91 //explode関数でそれぞれの値を取得 92 $editdata = explode("<>",$line); 93 94 //投稿番号と編集対象番号が一致したらその投稿の「名前」と「コメント」を取得 95 if ($edit == $editdata[0]) { 96 97 //投稿のそれぞれの値を取得し変数に代入 98 $editnumber = $editdata[0]; 99 $editname = $editdata[1]; 100 $editcomment = $editdata[2]; 101 102 //既存の投稿フォームに、上記で取得した「名前」と「コメント」の内容が既に入っている状態で表示させる 103 //formのvalue属性で対応 104 } 105 } 106 } 107 108 //編集実行機能 109 110 //編集か新規投稿か判断 111 if ((!empty($_POST['name'])) && (!empty($_POST['comment'])) && (!empty($_POST['editNO']))) { 112 113 //入力データの受け取りを変数に代入 114 $editNO = $_POST['editNO']; 115 116 //読み込んだファイルの中身を配列に格納する 117 $ret_array = file($filename); 118 119 //ファイルを書き込みモードでオープン+中身を空に 120 $fp = fopen($filename,"w"); 121 122 //配列の数だけループさせる 123 foreach ($ret_array as $line) { 124 125 //explode関数でそれぞれの値を取得 126 $data = explode("<>",$line); 127 128 //投稿番号と編集番号が一致したら 129 if ($data[0] == $editNO) { 130 131 //編集のフォームから送信された値と差し替えて上書き 132 fwrite($fp,$editNO . "<>" . $name . "<>" . $comment . "<>" . $postedAt . "\n"); 133 } else { 134 135 //一致しなかったところはそのまま書き込む 136 fwrite($fp,$line); 137 } 138 } 139 fclose($fp); 140 } 141 ?> 142 143 <form action="mission_3-4.php" method="post"> 144 <input type="text" name="name" placeholder="名前" value="<?php if(isset($editname)) {echo $editname;} ?>"><br> 145 <input type="text" name="comment" placeholder="コメント" value="<?php if(isset($editcomment)) {echo $editcomment;} ?>"><br> 146 <input type="text" name="editNO" value="<?php if(isset($editnumber)) {echo $editnumber;} ?>"> 147 <input type="submit" name="submit" value="送信"> 148 </form> 149 150 <form action="mission_3-4.php" method="post"> 151 <input type="text" name="dnum" placeholder="削除対象番号"> 152 <input type="submit" name="delete" value="削除"> 153 </form> 154 155 <form action="mission_3-4.php" method="post"> 156 <input type="text" name="edit" placeholder="編集対象番号"> 157 <input type="submit" value="編集"> 158 </form> 159 160 <?php 161 $filemei = "mission_3-4.txt"; 162 //表示機能 163 164 //ファイルの存在がある場合だけ行う 165 if (file_exists($filemei)) { 166 167 //読み込んだファイルの中身を配列に格納する 168 $array = file($filemei); 169 170 //取得したファイルデータを全て表示する(ループ処理) 171 foreach ($array as $word) { 172 173 //explode関数でそれぞれの値を取得 174 $getdata = explode("<>",$word); 175 176 //取得した値を表示する 177 echo $getdata[0] . " " . $getdata[1] . " " . $getdata[2] . " " . $getdata[3] . "<br>"; 178 } 179 } 180 ?> 181 </body> 182</html> 183

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、端的になぜこのような現象が起こっているかについてですが
17行目からの投稿機能が送信が押された場合に必ず実行されてしまうため、新規投稿が実行された後に108行目の編集機能も実行されてそのような現象が起こっています。

次にこれを直す方法についてですが、色々と書き方はあると思うので今のソースからあまり変えないで
わかりやすく直すとすると、108行目以降の編集実行機能は削除して「//編集か新規投稿か判断」を投稿機能の部分に持ってきます。
フォーム内が空じゃない場合でeditNOが空の場合は新規、editNOが空じゃない場合には編集と判断するようにしてみます。
(ネストを深くしたくないなどもあると思うので書き方等は良い感じで)

//投稿機能 //フォーム内が空でない場合に以下を実行する if (!empty($_POST['name']) && !empty($_POST['comment'])) { //入力データの受け取りを変数に代入 $name = $_POST['name']; $comment = $_POST['comment']; //日付データを取得して変数に代入 $postedAt = date("Y年m月d日 H:i:s"); // editNoがないときは新規投稿、ある場合は編集 ***ここで判断 if (empty($_POST['editNO'])) { // 以下、新規投稿機能 //ファイルの存在がある場合は投稿番号+1、なかったら1を指定する if (file_exists($filename)) { $num = count(file($filename)) + 1; } else { $num = 1; } //書き込む文字列を組み合わせた変数 $newdata = $num . "<>" . $name . "<>" . $comment . "<>" . $postedAt; //ファイルを追記保存モードでオープンする $fp = fopen($filename, "a"); //入力データのファイル書き込み fwrite($fp, $newdata . "\n"); fclose($fp); } else { // 以下編集機能 //入力データの受け取りを変数に代入 $editNO = $_POST['editNO']; //読み込んだファイルの中身を配列に格納する $ret_array = file($filename); //ファイルを書き込みモードでオープン+中身を空に $fp = fopen($filename, "w"); //配列の数だけループさせる foreach ($ret_array as $line) { //explode関数でそれぞれの値を取得 $data = explode("<>", $line); //投稿番号と編集番号が一致したら if ($data[0] == $editNO) { //編集のフォームから送信された値と差し替えて上書き fwrite($fp, $editNO . "<>" . $name . "<>" . $comment . "<>" . $postedAt . "\n"); } else { //一致しなかったところはそのまま書き込む fwrite($fp, $line); } } fclose($fp); } }

以上です。何かわからない部分があればコメントください。

投稿2019/07/02 14:48

razuma

総合スコア1313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

terutin

2019/07/02 15:19

なるほど!見落としていました...。 rezumaさんの回答を参考にし、投稿機能の途中に新規投稿か編集かを分岐するif文を追加したことで実現したい状態にすることができました。 夜分遅くに丁寧に回答していただいてありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問