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

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

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

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

Q&A

1回答

3073閲覧

phpで編集機能をやりたい

mio-mio7_

総合スコア10

PHP

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

0グッド

1クリップ

投稿2018/11/23 01:45

編集2018/11/23 01:48

編集機能をつけたい

編集機能を
1.編集したい投稿の番号を送信すると、投稿フォームに編集したい投稿が表示される機能
2.名前とコメントを書きかえたら、その新しい内容をファイルに書き込む機能
の2つで実装したいと考えています。今のところ両方できてないです。

html部分も間違っている可能性があります。

発生している問題

ブラウザ、テキストファイルともに追記、削除はできるが編集ができない。

該当のソースコード

php

1<html> 2 3 4<head> 5 <meta http-equiv='content-type' charset='UTF-8'> 6</head> 7 8 9 <form action="2-410.php" method="post"> 10 11 12 <input type="text" placeholder="名前" value="<?php echo "$newname" ?>" name="name"><br> 13 14 <input type="text" placeholder="コメント" value="<?php echo "$newcoment" ?>" name="coment"><br> 15 16 <input type="hidden" value="<?php echo "{$_POST['edit']}" ?>" name="blank"> 17 18<input type="submit" value="送信"><br><br> 19 20 <input type="text" placeholder="削除対象番号" name="delete"> 21 22<input type="submit" value="削除"><br> 23 24 <input type="text" placeholder="編集対象番号" name="edit"> 25 26<input type="submit" value="編集"> 27 28</form> 29 30 31</html> 32 33 34 35 36<?php 37 38touch('mission_2-4_10.txt'); 39 40 41?> 42 43 44 45 46 47<?php 48 49 50date_default_timezone_set('Asia/Tokyo'); 51 52$filename = 'mission_2-4_10.txt'; 53 54$lines = file($filename); 55 56$number = 1 + count($lines); //タイムゾーン、変数の定義 57 58 59?> 60 61 62<?php 63 64 65if((!empty($_POST['name']) or !empty($_POST['coment'])) and empty($_POST['delete']) and empty($_POST['edit'])) 66 67{ 68 69$fp = fopen($filename, "a"); 70 71fwrite($fp, $number."<>".$_POST['name']."<>".$_POST['coment']."<>".date("Y年m月d日 H:i:s"). "\n"); 72 73fclose($fp); 74 75} 76 77 78//名前か、コメントが入力された時に投稿番号、名前、コメント、日時をテキストファイルにどんどん下に追記していく 79 80 81elseif(empty($_POST['name']) and empty($_POST['coment']) and !empty($_POST['delete']) and empty($_POST['edit'])) 82 83{ 84 85$lines = file($filename); 86 87$number = 1 + count($lines); 88 89 90//更新された変数を定義し直す 91 92$fq = fopen($filename, "w"); 93 94//ファイルを空にする 95 96foreach($lines as $line) 97 98{ 99 100$portion = explode( "<>", $line); 101 102//ファイルの行を<>で分割し、配列に格納 103 104if($portion[0] !== $_POST['delete']) 105 106{ 107 108fwrite($fq, "$line"); 109 110 111 112} 113 114 115 116 117} 118 119//投稿番号が削除対象番号と異なるとき、テキストファイルに1行ずつ書き込む 120 121fclose($fq); 122 123//ファイルを閉じる 124 125} 126 127 128 129 130 131 132 133 134 135elseif(empty($_POST['name']) and empty($_POST['coment']) and empty($_POST['delete']) and !empty($_POST['edit'])) 136 137{ 138 139$lines = file($filename); 140 141$number = 1 + count($lines); 142 143//更新された変数を定義し直す 144 145 146$fr = fopen($filename, "r"); //テキストファイルを読み込む 147 148 149foreach($lines as $line) 150 151{ 152 153$portion = explode( "<>", $line); 154 155//ファイルの行を<>で分割し、配列に格納 156 157if($portion[0] == $_POST['edit']) 158 159{ 160 161$portion[1] = $newname; 162 163$portion[2] = $newcoment; //投稿番号が編集対象番号の時、名前とコメントを定義 164 165} 166 167} 168 169fclose($fr); 170 171} 172 173 174 175elseif(!empty($_POST['name']) and !empty($_POST['coment']) and empty($_POST['delete']) and !empty($_POST['blank'])) 176 177{ 178 179$lines = file($filename); 180 181$number = 1 + count($lines); 182 183//更新された変数を定義し直す 184 185$fs = fopen($filename, "r+"); 186 187foreach($lines as $line) 188 189{ 190 191$portion = explode( "<>", $line); 192 193//ファイルの行を<>で分割し、配列に格納 194 195if($portion[0] == $_POST['edit']) 196 197{ 198 199fwrite($fs, $number."<>".$_POST['name']."<>".$_POST['coment']."<>".date("Y年m月d日 H:i:s"). "\n"); 200 201} 202 203} //投稿番号が編集対象番号の時、新しい名前、コメントを上書き 204 205fclose($fs); 206 207} 208 209$lines = file($filename); 210 211$number = 1 + count($lines); 212 213//更新された変数を定義し直す 214 215foreach($lines as $line) 216 217{ 218$portion = explode( "<>", $line); 219 220echo "<pre>". $portion[0]." ". $portion[1]." ". $portion[2]." ". $portion[3]." ". $portion[4]. "</pre>" ; 221} 222 223//テキストファイルの1行1行をブラウザ上に表示 224 225 226?>

試したこと

細かいミスは直したりしましたが、内容を変えるようなことは原因がわからないので、できなかったです。

補足情報(FW/ツールのバージョンなど)

URL:http://tt-662.99sv-coco.com/2-410.php

入れ子が読みにくいかもしれません。すいません。

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

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

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

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

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

guest

回答1

0

新規投稿用フォームと投稿編集用フォームを兼ねるつもりであれば、
フォームを表示する前に、
もしも編集アクションの場合のフォーム表示処理と
そうでないばあいの新規用フォーム表示処理との分岐が必要になります。

何も読み出していない変数をフォーム内要素に記述しても何も表示できませんから。

順番としては、

・新規投稿反映(保存)処理
・編集投稿反映(書換)処理
・削除処理
・編集用データ読出処理
・フォーム表示処理(新規・編集兼用)
・投稿一覧表示処理

という流れがスマートだろうと思うので、
見直しをかけてみてください。

《追記》
$numberという変数で投稿番号を発番していますが、
発番用にデータファイルから読み出した行数を使っていますね。

1<>~
2<>~
3<>~
4<>~
5<>~
がある状況で3を削除するとデータファイル上は
1
2
4
5
になりませんか? このときデータ行数は4なので$numberには5が入りそうですが、
ふつうにデータファイルに書き出してしまうと
1
2
4
5
5
になりますからダメですね。

$numberを作るには、面倒でも
各行データを解釈して投稿番号の最大値を求めて+1しましょう。

php

1$max_n = 0; 2foreach ($lines as $line) { 3 $portion = explode("<>", $line); 4 if (intval($portion[0]) > $max_n) { 5 $max_n = $portion[0]; 6 } 7} 8$number = $max_n + 1;

《追記2》
たまたま編集用番号が入力されていれば編集処理になってしまいかねないし、
たまたま削除用番号が入力されていれば削除処理になってしまいかねないので、
複数ボタンのあるFormで押されたボタンを判断する - Qiita
の「ボタンにname属性を利用する(nameが全てのボタンで同じ場合)」の事例
にあるようにtype="submit"の送信ボタンにもname="submit"などとして
押したボタンが何だったかを判定に加えるようにすると良いでしょう。
$_POST['submit']を参照することで、判定できます。

投稿2018/11/23 02:07

編集2018/11/23 06:04
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mio-mio7_

2018/11/23 02:19

回答ありがとうございます。 新規投稿用フォームと投稿編集用フォームを兼ねるつもりであれば、 フォームを表示する前に、 もしも編集アクションの場合のフォーム表示処理と そうでないばあいの新規用フォーム表示処理との分岐が必要になります。 について、一応投稿編集用のときだけ定義される変数を表示とすることで、新規投稿用の時はnullでなにも表示しなくなるとしたかったのですが、やはりifなどを使った方がよかったでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/23 02:31

フォームを共通化して使い回すのはよくある話なのですが、 未定義の変数を参照することがないように 変数の初期化だけは常にやっておいて、 アクションが編集の場合だけ変数に詰めるという流れがスマートかと。
mio-mio7_

2018/11/23 03:04

例えば、名前フォームの場合 value="<?php if($_POST['edit']) {echo "$newname";} ?>" ※$newnameは大きい分岐の三つ目で定義した編集したい行の名前の部分 という感じにしても、編集ボタンを押したときにフォームには何も表示しなかったです。 なにか考え方などが間違っているのでしょうか? 何度もすいません。
退会済みユーザー

退会済みユーザー

2018/11/23 03:21 編集

$newname = ''; if (編集アクションの場合) {  $newname = 読み出したデータ; } ってしておけば、 <input ~ value="<?php echo $newname; ?>" > などとHTMLフォーム記述箇所をシンプルにできますね。 (※便宜上インデントをわかりやすくするために全角空白を使いましたのでコピペの際はご注意を。)
mio-mio7_

2018/11/23 04:56

$newname = ''; if (編集アクションの場合) {  $newname = 読み出したデータ; } の部分をphpでhtml部分の上に書くと言うことでしょうか?
mio-mio7_

2018/11/23 04:59

あと、その場合$portion[1または2]は定義済みと考えていいのでしょうか?
mio-mio7_

2018/11/23 05:07

あと、処理の順番に関してですが、どの工程もifで分岐させてるので、順番とかはないと思うのですが、そういう順番にした方がよりらしくなるということでしょうか?また、順番にやっていく方法の場合、今のように単純に各過程をifで分岐させるのではない方法が必要だと思うのですが、どのような方法があるでしょうか? 最後は丸投げのようになってしまいましたが、自分でも考えたいと思います。
退会済みユーザー

退会済みユーザー

2018/11/23 05:46

何らかのアクション、 具体的には、編集反映処理後、削除処理後でも、 新規用フォーム表示処理と投稿一覧表示処理を行うもの、と仮定しての 順序の組み立てでした。 編集反映処理後には「反映しました」だけで フォーム表示も一覧表示もしないのであれば そうなるようにif()ブロックの組み立てをすればいいし、 同様に、削除処理後にも「削除しました」だけで フォーム表示も一覧表示もしないのであれば そうなるようにif()ブロックの組み立てをすればいいのです。 最終的にどういう画面遷移をさせたいのかが判然としなかったため、 処理後には新規用フォーム表示と一覧表示をするものかなと仮定して話を進めてました。 データファイルへの書き込みが伴う処理が行われようとも行われまいとも、 htmlコードを表示する場面で使う変数が未定義にならないように、 phpコード冒頭でif()ブロックの外側で変数の初期化(空文字列を詰める)くらいはやっておくと バチは当たらない(WarningやNoticeを避けられる)と思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問