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

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

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

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

Q&A

解決済

2回答

1520閲覧

フォームの値が消えなくて困っています

yuya1028

総合スコア7

PHP

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

0グッド

0クリップ

投稿2021/02/13 03:29

前提・実現したいこと

PHPで編集機能を作っています
どの投稿を編集するかを決める編集選択機能
送信された内容で、送信された番号に合う書き込みを上書きする、編集実行機能
を組み合わせることで編集機能を実現しようとしてます

またデータの保存はテキストファイルで以下のよう保存しています

1<>yuya<>完成<>2021/2/13 12:02:19 2<>yuya<>完成<>2021/2/13 12:02:46 3<>yuya<>完成<>2021/2/13 12:02:35

発生している問題

編集選択と編集実行を一通りできるのですが、
フォームに編集選択で選択した投稿番号が入ったままで、
一度でも編集機能を使うと新規投稿ができなくなってしまいます


2番の投稿を編集したので時間が更新されています

該当のソースコード

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>ミッション3</title> 6</head> 7 8 9<body> 10 <?php 11 $filename = "mission_3.txt"; 12 // 名前 13 $name = $_POST["name"]; 14 // コメント 15 $comment = $_POST["comment"]; 16 // 削除番号 17 $delete = $_POST["delete"]; 18 // 編集選択番号 19 $edit = $_POST["edit"]; 20 // 編集番号 21 $editnumber = $_POST["editnumber"]; 22 23 //投稿機能 24 if($name && $comment){ 25 // ファイル読み込み 26 $lines = file($filename,FILE_IGNORE_NEW_LINES); 27 // 日時取得 28 $date = date("Y/n/j G:i:s"); 29 if($editnumber){ 30 $fp = fopen( $filename, "w"); 31 // 配列の要素数(=行数)だけループさせる 32 // $iは$linesのインデックス番号として扱う 33 for ($i = 0; $i < count($lines); $i++){ 34 // 区切り文字「<>」で分割 35 $line = explode("<>", $lines[$i]); 36 // 投稿番号を取得 37 $num = $line[0]; 38 39 if ($num == $editnumber){ 40 $post =$num."<>".$name."<>".$comment."<>".$date; 41 fwrite($fp, $post.PHP_EOL); 42 }else{ 43 fwrite($fp, $lines[$i].PHP_EOL); 44 } 45 } 46 fclose($fp); 47 } 48 // 新規投稿 49 else{ 50 $fp = fopen( $filename, "a"); 51 // 投稿番号を取得する 52 if(file_exists($filename)){ 53 $lines = file($filename,FILE_IGNORE_NEW_LINES| FILE_SKIP_EMPTY_LINES); 54 $line = $lines[count($lines)-1]; 55 $num = substr($line,0,1); 56 $num++; 57 }else{ 58 $num = 1; 59 }// 投稿を作成する 60 $post =$num."<>".$name."<>".$comment."<>".$date; 61 fwrite($fp, $post.PHP_EOL); 62 fclose($fp); 63 } 64 } 65 66 // 削除機能 67 if($delete){ 68 // ファイルの中身を1行1要素として配列変数に代入 69 $lines = file($filename,FILE_IGNORE_NEW_LINES); 70 // ファイルを開き 71 $fp = fopen( $filename, "w"); 72 73 // 配列の要素数(=行数)だけループさせる 74 // $iは$linesのインデックス番号として扱う 75 for ($i = 0; $i < count($lines); $i++){ 76 // 区切り文字「<>」で分割 77 $line = explode("<>", $lines[$i]); 78 // 投稿番号を取得 79 $postnumber = $line[0]; 80 81 if ($postnumber != $delete){ 82 fwrite($fp, $lines[$i].PHP_EOL); 83 } 84 } 85 fclose($fp); 86 } 87 88 // 編集対象選択 89 if($edit){ 90 // ファイル読み込み 91 $lines = file($filename,FILE_IGNORE_NEW_LINES); 92 93 // 配列の要素数(=行数)だけループさせる 94 // $iは$linesのインデックス番号として扱う 95 for ($i = 0; $i < count($lines); $i++){ 96 97 // 区切り文字「<>」で分割 98 $line = explode("<>", $lines[$i]); 99 100 if ($line[0] == $edit){ 101 $editnumber = $line[0]; 102 $editname = $line[1]; 103 $editcomment = $line[2]; 104 break; 105 } 106 } 107 } 108 109 110 111 112 ?> 113 <form method="POST" action=""> 114 <input type="text" name="name" placeholder="名前" 115 value = "<?php echo $editname;?>"><br> 116 117 <input type="text" name="comment" placeholder="コメント" 118 value = "<?php echo $editcomment;?>"><br> 119 120 <input type="text" name="editnumber" 121 value = "<?php echo $editnumber;?>"> 122 <input type="submit" value="送信"><br><br> 123 </form> 124 125 <form method="POST" action=""> 126 <input type="text" name="delete" placeholder="削除対象番号"> 127 <input type="submit" value="削除"> 128 </form> 129 130 <form method="POST" action=""> 131 <input type="text" name="edit" placeholder="編集対象番号"> 132 <input type="submit" value="編集"> 133 </form> 134 135 136 <?php 137 // ブラウザに表示 138 $lines = file($filename,FILE_IGNORE_NEW_LINES); 139 foreach($lines as $line){ 140 $elements = explode("<>",$line); 141 for($i = 0 ; $i < count($elements); $i++){ 142 echo $elements[$i]; 143 } 144 echo "<br>"; 145 146 } 147 ?> 148</body> 149</html>

お手数ですが、ご回答のほどよろしくお願いいたします。

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

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

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

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

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

m.ts10806

2021/02/13 03:44

<> が含まれたコメントが送信された場合は考慮されないのでしょうか。
guest

回答2

0

編集に成功したあとに、編集に関わる変数の中身をクリアすれば、
編集の番号を表示することもないのでは? editnumberとかさ

投稿2021/02/13 03:49

編集2021/02/13 04:18
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuya1028

2021/02/13 07:21

初期化することで解決できました ありがとうございます
guest

0

ベストアンサー

一度でも編集機能を使うと新規投稿ができなくなってしまいます

別に今の作りでも「editnumberの入力を手動で空にする」で出来るのでは?

ひとまず「用が済んだら初期化」で良いかと。
(突っ込めばキリがないので)

投稿2021/02/13 03:59

m.ts10806

総合スコア80875

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

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

yuya1028

2021/02/13 07:21

初期化することで解決できました ありがとうございます
m.ts10806

2021/02/13 07:26

「質問への追記修正依頼」と「突っ込めばキリがない」部分は全く気になりませんか?
yuya1028

2021/02/14 01:20

追記修正依頼を見落としていました。申し訳ありません。 質問への追記・修正 →<.>が含まれたコメントが送信された場合、変わらず処理をするつもりです 「突っ込めばキリがない」部分について、補足説明があれば助かります
m.ts10806

2021/02/14 02:56

>変わらず処理を セパレータ文字列なのにそのまま受け入れたらデータ壊れますよ。 >補足説明 データがテキストな時点で無駄な処理てんこ盛り必要なので、要件から見直す必要があります。 覚えても使える技術にはなりません。
m.ts10806

2021/02/14 03:04

あと、デバッグとか今回みたいな変数の使いまわしで処理追いにくくなるので慣れないうちは画面分けるべき。 1ファイルでもできなくはないけど、スパゲティになるので、画面ごとにファイルも作って完全に分けたほうが良いです。
yuya1028

2021/02/14 12:00

m.ts10806さんが仰ったように要件から見直してみます また画面ごとにファイルも作ります。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問