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

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

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

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

HTML

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

Q&A

解決済

1回答

1887閲覧

入力フォームから送信した値をもう一度入力フォームに表示したいです

chimo

総合スコア55

PHP

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

HTML

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

0グッド

1クリップ

投稿2020/05/08 05:43

編集2020/05/08 10:00

【コード】

php

1<?php 2 3// メッセージを保存するファイルのパス設定 4define( 'FILENAME', './kadai_2_05.txt'); 5 6// タイムゾーン設定 7date_default_timezone_set('Asia/Tokyo'); 8 9// 変数の初期化 10$now_date = null; 11$data = null; 12$file_handle = null; 13$split_data = null; 14$message = array(); 15$message_array = array(); 16$success_message = null; 17$error_message = array(); 18$delete = null; 19$del_con = null; 20$del_data = array(); 21 22//----------------テキストファイルにデータを書き込む----------------- 23 24if(file_exists(FILENAME)){ 25 $num = count(file(FILENAME)) + 1; //$num = count(file(FILENAME))でファイルの行数をカウントできる 26}else{ 27 $num = 1; 28} 29 30if( !empty($_POST['btn_submit']) ) { 31 32 //-----未入力のバリデーション--------- 33 if(empty($_POST['view_name'])){ 34 $error_message[] = '名前を入力してください!'; 35 } 36 37 if(empty($_POST['message'])){ 38 $error_message[] = 'メッセージを入力してください!'; 39 } 40 //------------------------------------ 41 42 if( $file_handle = fopen( FILENAME, "a") ) { //fopen関数で指定したファイルを開く 43 // タイムスタンプ 44 $now_date = date("Y-m-d H:i:s"); 45 46 // 書き込むデータを作成 47 $data = $num."<>".$_POST['view_name']."<>".$_POST['message']."<>".$now_date."\n"; 48 49 // 書き込み 50 fwrite( $file_handle, $data); //file_handleは書き込む対象となるファイル(●●.txt)を判別するためのパラメータ 51 52 // ファイルを閉じる 53 fclose( $file_handle); 54 55 //投稿が成功したことを示すメッセージ 56 $success_message = 'メッセージを送信しました'; 57 } 58} 59//----------------指定した番号のメッセージを削除-------------------- 60if(isset($_POST['delete'])){ 61 62 $delete = $_POST['deleteNo']; 63 $del_con = file(FILENAME); 64 65 for( $i=0; $i<count($del_con); $i++ ){ 66 $del_data = explode("<>", $del_con[$i]); 67 if($del_data[0] == $delete){ 68 array_splice($del_con,$i,1); //array_splice(配列、削除開始位置、削除する配列要素数←これ指定しないと削除開始位置から全部消える) 69 file_put_contents(FILENAME, implode("\n", $del_con)); 70 } 71 } 72} 73 74//----------------指定した番号のメッセージを編集-------------------- 75 76//送られてきた番号と等しい番号にある配列の値を取得 77$edit = $_POST['editNo']; 78$edit_con = file(FILENAME); 79 80if(isset($_POST['edit'])){ 81 foreach($edit_con as $line){ 82 $edit_data = explode("<>",$line); 83 if($edit_data[0] == $edit){ 84 $edit_no = $edit_data[0]; 85 $edit_name = $edit_data[1]; 86 $edit_message = $edit_data[2]; 87 } 88 } 89} 90 91//編集を行う 92if(isset($_POST['edit'])){ 93 $fp=fopen(FILENAME,'w'); 94 95 foreach($edit_con as $ed){ 96 $data = explode("<>",$ed); 97 if($data[0]==$edit){ 98 fwrite($fp,$edit_no."<>".$edit_name."<>".$edit_message."\r\n"); 99 } 100 } 101} 102 103//-------テキストファイルのデータを掲示板のフォーム下に表示-------- 104 105if( $file_handle = fopen( FILENAME,'r') ) { 106 107 while( $data = fgets($file_handle) ){ //fgets関数でファイルからデータを一行ずつ全て取得 108 109 //preg_split関数で文字列を特定の文字で分割する: 110 $split_data = explode("<>",$data); 111 112 $message = array( 113 'view_name' => $split_data[1], 114 'message' => $split_data[2], 115 'post_date' => $split_data[3] 116 ); 117 array_unshift( $message_array, $message); 118 } 119 120 // ファイルを閉じる 121 fclose( $file_handle); 122} 123 124?> 125 126//------------------------------<HTML>----------------------------------- 127 128<!DOCTYPE html> 129<html lang="ja"> 130<head> 131<meta charset="utf-8"> 132<title>簡易掲示板</title> 133</head> 134 135<body> 136<h2>簡易掲示板(^-^*)</h2> 137 <?php if(!empty($success_message)):?> 138 <p class="success_message"><?php echo $success_message;?></p> 139 <?php endif; ?> 140 141 <?php if(!empty($error_message)):?> 142 <ul class="error_message"> 143 <?php foreach($error_message as $value):?> 144 <li><?php echo $value; ?></li> 145 <?php endforeach; ?> 146 </ul> 147 <?php endif; ?> 148 149 <form method="post"> 150 <div> 151 <label for="view_name">名前</label> 152 <input id="view_name" type="text" name="view_name" value=""> 153 </div> 154 <div> 155 <label for="message">メッセージ</label> 156 <textarea id="message" name="message"></textarea> 157 </div> 158 <input type="submit" name="btn_submit" value="書き込む"> 159 </form> 160 161 <form method="post"> 162 <div> 163 <label for="deleteNo">削除番号</label> 164 <input id="deleteNo" type="text" name="deleteNo" value=""> 165 </div> 166 <input type="submit" name="delete" value="削除する"> 167 </form> 168 169 <form method="post"> 170 <div> 171 <label for="editNo">編集番号</label> 172 <input id="editNo" type="text" name="editNo" value=""> 173 </div> 174 <input type="submit" name="edit" value="編集する"> 175 <input type="hidden" name="execute_edit" value="<?php if(isset($editNo)){echo $editNo;} ?>"> 176 </form> 177 178<hr> 179 180<section> 181 <?php if( !empty($message_array) ): ?> 182 <?php foreach( $message_array as $value ): ?> 183 <article> 184 <div class="info"> 185 <h2><?php echo $value['view_name']; ?></h2> 186 <time><?php echo date('Y年m月d日 H:i', strtotime($value['post_date'])); ?></time> 187 </div> 188 <p><?php echo $value['message']; ?></p> 189 </article> 190 <?php endforeach; ?> 191 <?php endif; ?> 192</section> 193 194</body> 195</html>

【実現したいこと:一度送信したメッセージを入力フォームに呼び戻し、編集したい】
入力フォームに名前とメッセージを入力して送信する
送信した値をテキストファイルへ記録
編集番号入力フォームへ編集したメッセージの番号を入力・送信
送信した番号と一致するメッセ―ジ・名前を取得し、入力フォームへ再表示して編集できるようにする

例えば、名前:はなこ メッセ―ジ:おはよう が送信されると、
テキストファイルへ「1<>はなこ<>おはよう<>投稿日時」と記録される。このメッセージを編集するために編集番号入力フォームに「1」を入力・送信すると、再度名前とメッセージの入力フォームへ「はなこ」「おはよう」が表示されて、編集できるようにしたいです。

ヒントだけでも良いので何かしらアドバイス頂けたら嬉しいです。

【試したこと】
「php 掲示板 編集」などで検索し、似たような質問をみてまねをしてコードをかいてみましたが、うまく実行されません。

【使用環境】
Windows10
FFFTP
サクラエディタ

【追記】
回答をうけてhidden属性を使用してコードを書き直しましたが、依然動きません。
以下がそのコードです。
★編集のHTML部分

html

1<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 2 <div> 3 <input type="hidden" name="hidden" value="<?php if(isset($editNo)){echo $editNo;} ?>"> 4 <label for="editNo">編集番号</label> 5 <input id="editNo" type="text" name="editNo" value=""> 6 </div> 7 <input type="hidden" name="execute_edit" value="<?php if(isset($editNo)){echo $editNo;} ?>"> 8 <input type="submit" name="edit" value="編集する"> 9 </form>

★編集のPHP部分

php

1//----------------指定した番号のメッセージを編集-------------------- 2 3/***** ファイル編集 入力フォーム表示********/ 4 if (isset($_POST['edit'])){ 5 $file_edit = file(FILENAME);//テキストファイルを読みこむ 6 for($j = 0;$j <count($file_edit); $j++){//ループ処理 7 $editData1 = explode("<>",$file_edit[$j]);//投稿番号を取得 8 if($editData1[0] == ($_POST['editNo'])) { 9 $simEdit = $editData1; 10 } 11 } 12 } 13 14 /***** ファイル編集 ファイル書き込み********/ 15 if (isset($_POST['btn_submit']) && isset($_POST['hidden'])) { 16 17 $file_edit = file(FILENAME); 18 for($k = 0;$k <count($file_edit); $k++){ 19 $editData2 = explode("<>",$file_edit[$k]); 20 if($editData2[0] == ($_POST['hidden'])){ 21 $n = $_POST['hidden']; 22 $editData2[1] = $_POST['name']; 23 $editData2[2] = $_POST['comment']; 24 $file_edit[$m] = implode("<>", $editData2); 25 file_put_contents(FILENAME,implode("", $file_edit)); 26 } 27 } 28 }

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

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

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

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

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

Yasumichi

2020/05/10 07:04

HTML 部分と PHP の部分って同じファイルですか?それとも別のファイルですか?
chimo

2020/05/11 11:37

べつのファイルです!
Yasumichi

2020/05/11 11:51

HTML はフォームを表示しているだけで POST 先が、PHP の方であれば、 <?php echo $_SERVER['PHP_SELF']; ?> の代わりに PHP の相対アドレスを指定した方が良さそうです。
chimo

2020/05/13 02:55

コメントありがとうございます!一度調べてから取り組んでみます!!
guest

回答1

0

ベストアンサー

フォームの例えばinput要素のvalue属性に、
データベースなどから読みだした値を詰めるのと、
別途input要素のhidden属性で投稿番号を持たせるようにすれば、
編集対象の投稿番号とともに受け取れるのではないかと。

投稿2020/05/08 06:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chimo

2020/05/08 07:35

おそらくこういうことでしょうか </form> <!-- 編集用フォーム --> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> <input type="hidden" name="hidden" value="<?php echo($_POST['name3']);?>"> 編集番号:<br/><br/> <input type="text" name="name3" size="30" value="<?php echo($_POST['name3']);?> "/><br /> <input type="submit" name="edit"> </form> 参考:https://teratail.com/questions/230979
chimo

2020/05/08 07:39

このコードがそれぞれの行で何をやろうとしているのかが良くわからないです。hiddenやaction=<?php...?>は知らなかったのでそれについても調べてみましたが、やはり難しくて理解できませんでした。特に、最初の「<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">」と途中の「<input type="text" name="name3" size="30" value="<?php echo($_POST['name3']);?> "/><br />」が、コード意味・役割が分かりません...
Yasumichi

2020/05/08 09:01

hidden は、ブラウザーには表示しないけど、サーバーに送られるパラメーターを保持させます。 action は送信先ですが、<?php echo $_SERVER['PHP_SELF']; ?> の結果が入ることで自身の PHP ファイル名が代入されます。 ただ、以下のページで、$_SERVER['SCRIPT_NAME'] を代わりに使うか、そもそも空にするなど、提案されています。 $_SERVER['PHP_SELF']は危険? - [PHP + PHP] ぺんたん info https://pentan.info/php/php_self_security.html
m.ts10806

2020/05/08 10:06

「調べた」だけでは何を読んで難しかったのか分かりませんよ。 PHPマニュアル活用できるようになりましょう。日本語です。サンプルコードもあります。 説明も丁寧です。
chimo

2020/05/08 12:07

https://web-engine.hatenadiary.com/entry/2016/05/13/134134 このサイトを読みましたが結局valueにphpタグを組み込む意味が分かりませんでした。このサイトにでてくる「<input type="hidden" name="test" value="<?php echo $value; ?>">」ですが、「 var_dump( $_POST['test'] );」で結局何が出力されるか書いてくれてないので、あまり要点をつかめませんでした...。test=<?php echo $value; ?>という情報が送信されるのでしょうか?でも、だからといって何故それが「2020/05/08 16:35 」で私がここのコメントに記載したコードに使われているのかもピンときません...。
chimo

2020/05/08 12:10

>action は送信先ですが、<?php echo $_SERVER['PHP_SELF']; ?> の結果が入ることで自身の PHP ファイル名が代入されます。 このことがこのコードにどのような利点を与えているのかがいまいちピンとこないです...。自身のPHPファイルに値を送信しているということですか??
Yasumichi

2020/05/08 12:25

そのフォームから、「編集する」ボタンを押した際に送信する先が、そのフォームを持っている PHP なんですよね。ただ、正直、先ほど、書いたリンクを見る限り、利点はありません。
m.ts10806

2020/05/08 12:30

「PHPタグを組み込む意味」など「目的を達成するため」でしかないから調べても出てこないでしょうね。 コードは常に何かの目的を達成するために使われますから、「意味」は「目的を達成してるかどうか」です。 1つの目的を達成するための手段は1つではないので、「如何様にも書ける」のです。 「何の目的を達成しているか」を考えるのが大事ですよ。手段だけ見ないことです。あくまで道具です。
chimo

2020/05/08 12:39

んーーーー。そうですよね。ただ現場でどういう目的に適応されるのかを知りたかったんです。それが分かれば今自分が達成したい目的と照らし合わせて応用できるのではないかと思ったので。でも先ほどのせたurlのように調べてみたのですが、目的や使用する利点がわからないので使用するタイミングなども理解できないので、自身のコードでもどのように生かせばいいかわからない…って感じです...。
Yasumichi

2020/05/08 12:44

<? php ~ ?> の中に HTML を混ぜたくないが、HTML の一部に php の出力結果を使いたいって時には、便利な方法では、あります。
m.ts10806

2020/05/08 13:20

現場で。 フレームワークおよびテンプレートエンジンを利用するのでそもそもviewにPHPタグを書くことがありません。余程古い保守案件くらいでしょうね。
m.ts10806

2020/05/08 14:35 編集

「現場で」を求めるのは良いとして、それならテキストへのデータ保存で「kadai」なんて名前でやってること自体が時代錯誤もいいところなので、「目的や使用する利点がわからない」と仰るのでしたら、「テキストでデータを管理する目的や使用する利点」というアプリケーションの根本から考え直した方が先に繋がると思います。
退会済みユーザー

退会済みユーザー

2020/05/11 08:30 編集

phpコード側で受け取るデータとして、その場面で何が必要なのか、っていう視点で考えていただければ、 編集対象を特定するのに必要なデータをどうやって受け取るのか、 参考文献に書いてあるとおりの処理をやめて、自分の思うように壊してみてなぜダメなのか、 などと事例研究をいっぱいすればいいです。 (いわゆるアンチパターン事例集てきな。) 投稿番号4番を編集したい、っていうんなら、4番だよっていう指定をフォーム送信して、 編集投稿用フォームの中に投稿番号は4番ですよっていうデータも必要だし、 そこをユーザーが勝手に6番なんて書き換えては困るからhiddenで保持するわけだし。 そういう具体例を想定して、こういうふうになっちゃ破綻するから、こうしなければいけない、 って経験が積み上がっていくのだと思います。
chimo

2020/05/11 11:40

なるほど!今やっとhiddenの使い道が少しつかめた気がしました!!そこも踏まえて、参考コードをただまねるのではなく、一度最初から自分で何が必要か考えるところからスタートしてみます!アドバイスありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問