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

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

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

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

Q&A

解決済

3回答

324閲覧

編集機能の実装について

takakuni

総合スコア19

PHP

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

0グッド

1クリップ

投稿2019/03/14 03:43

編集2019/03/15 01:47

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
PHPで掲示板の編集機能システムを作っています。
編集番号を入力すると元の内容が投稿用のフォーム内に表示されるようになっています。
編集番号から値を受け取った場合にのみ、hiddenで編集番号が投稿フォームの下にあるような形です。
条件分岐として、hiddenに値があるときに、指定した番号と一致する投稿番号を上書き保存するような仕様にしたいです。

該当のソースコード

新規登録と上書き処理がごちゃごちゃな状態です。

php

1if ($_SERVER['REQUEST_METHOD'] == 'POST') { 2 $value = $_POST['mode']; 3 switch( $value ){ 4 case "insert": 5 $name = $_POST['name']; 6 $comment = $_POST['comment']; 7 $time = date('Y年m月d日 H時i分s秒'); 8 if(!empty($edit)){ 9 $ediCon = file($filename); 10 $fp = fopen($filename, "w"); 11 for ($j = 0; $j < count($delCon); $j++) { // ループの初期化、変数delConの要素数より少ない分ループを行う。行った後はループを1足す。 12 $delData = explode("<>", $delCon[$j]);// コメントデータ$j行目を1つ取り出した情報を<>で分割した上で変数ediDataに格納 13 if ($ediData[0] == $edit) { //コメントデータの最初は「コメント番号」なのでそれと入力された対象番号を比較、同じ場合 14 $ediDatalist = $edidata[0]."<>".$name."<>".$comment."<>".$time."\n"; 15 fwrite($fp, $ediDatalist); //書き込み 16 } 17 } 18 } 19 if (file_exists($filename)) { 20 $fp2 = fopen('count_keiziban.txt','r'); 21 $num_text = fgets($fp2); 22 fclose($fp2); 23 $number = (int)$num_text; 24 $number += 1; 25 } else { 26 $number = 1; 27 } 28 $fp2 = fopen('count_keiziban.txt','w'); 29 fwrite($fp2, $number); 30 fclose($fp2); 31 32 // $datalist = $number."<>"."\t".$name."<>"."\t".$comment."<>"."\t".$time."\n"; 33 $datalist = $number."<>".$name."<>".$comment."<>".$time."\n"; 34 $fp = fopen($filename, 'a'); // 変数filenameを追記モードで開き、変数fpに代入 35 fwrite($fp, $datalist); // 変数fpに変数datalistに書き込まれたデータを代入 36 fclose($fp); // 変数をfpを閉じた。

投稿番号の受け取り

php

1 case "edit": 2 $edit = $_POST["edit"]; 3 $ediCon = file($filename); 4 for ($j = 0; $j < count($ediCon); $j++) { 5 $ediData = explode("<>", $ediCon[$j]); 6 if ($ediData[0] == $edit){ 7 $ediName = $ediData[1]; 8 $ediComment = $ediData[2]; 9 } 10 }

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <title>keiziban</title> 6 </head> 7 <body> 8 <form action="" method="post"> 9 名前: <input type="text" name="name" value="<?php echo $ediName ?>"> 10 コメント: <input type="text" name="comment" value="<?php echo $ediComment ?>"> 11 <input type="hidden" name="hidden" value="<?php echo $edit ?>"> 12 <button type="submit" name="mode" value="insert">登録する</button> 13 14 削除対象番号:<input type="number" name="delete"> 15 <button type="submit" name="mode" value="delete">削除する</button> 16 17 編集対象番号:<input type="number" name="edit"> 18 <button type="submit" name="mode" value="edit">編集する</button> 19 </form> 20<?php 21 if (file_exists($filename)) { 22 $datalists = file($filename); 23 foreach ($datalists as $line) { 24 $data = explode("<>", $line); 25 echo '番号:'.h($data[0]).'<br />'; 26 echo h($data[2]).'<br />'; 27 echo 'By:'.h($data[1]).'<br />'; 28 echo '投稿日時'.h($data[3]).'<br />'; 29 echo '<hr />'; 30 } 31 }else{ 32 echo "コメントが1件もありません"; 33 } 34 ?> 35 <p><?php echo "$ediName" ?></p> //試し書き 36 <p><?php echo "$ediComment" ?></p> //試し書き 37 </body> 38</html>

試したこと

ファイル関数に、ついて調べましたが、一部を変更することがあまり出てこなくて、変更する場合にも文字列の長さが均等でないといけないと書いてあり、必要なことは、ファイルを一度からにしてそこからまた書き込むことということはわかったのですがイメージがつかず今に至ります。

調べて書き直した結果、全て追記保存になってしまう仕様になりました。

php

1case "insert": 2 $name = $_POST['name']; 3 $comment = $_POST['comment']; 4 $time = date('Y年m月d日 H時i分s秒'); 5 $hidden = $POST['hidden']; 6 7 if (file_exists($filename)) { 8 $fp2 = fopen('count_keiziban.txt','r'); 9 $num_text = fgets($fp2); 10 fclose($fp2); 11 $number = (int)$num_text; 12 $number += 1; 13 } else { 14 $number = 1; 15 } 16 $fp2 = fopen('count_keiziban.txt','w'); 17 fwrite($fp2, $number); 18 fclose($fp2); 19 20 $datalist = $number."<>".$name."<>".$comment."<>".$time."\n"; 21 if ($hidden){ 22 $datalists = file($filename); 23 $fp = fopen($filename, 'w'); 24 25 foreach ($datalists as $datalist) { 26 $ediData = explode("<>", $datalists); 27 if ($ediData[0] == $hidden){ 28 fwrite($fp, $hidden."<>".$name."<>".$comment."<>".$time); 29 } else { 30 $fp = fopen($filename, 'a'); // 変数filenameを追記モードで開き、変数fpに代入 31 fwrite($fp, $datalist); // 変数fpに変数datalistに書き込まれたデータを代入 32 33 } 34 } 35 } else { 36 $fp = fopen($filename, 'a'); // 変数filenameを追記モードで開き、変数fpに代入 37 fwrite($fp, $datalist); // 変数fpに変数datalistに書き込まれたデータを代入 38 } 39 fclose($fp); // 変数をfpを閉じた。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2019/03/14 04:17

聞きたいことは何でしょうか
takakuni

2019/03/14 04:21

聞きたことは、編集機能を実装するために、上書き保存するための編集後の内容を書き込む方法が知りたいです。
m.ts10806

2019/03/14 04:47

答えるのはやぶさかではないですが、珍しい機能でもないですし、過去質問探した方がいいかもしれないですね。「簡易掲示板」と称してテキストファイルに内容を保存する課題についての質問が多く挙がってますし、質問者さんがやろうとしていることが既に実装済みのものもあるかもしれません。
takakuni

2019/03/15 01:48

調べ直した結果このような形で行き詰ってしまいました。 何か、助言をいただけると幸いです。
guest

回答3

0

直接解決になるか分かりませんが、「試したこと」のコード、1箇所おかしいですね。
$POST['hidden']
ではなく
$_POST['hidden']です。
この間違い、結構良くあります。
学習段階では特にこの間違いは勿体無いのでPHPマニュアルからコピペして使うようにすると良いです。

そもそもが変数未定義のなどのエラーになっていそうに思います。
学習段階・開発途中段階では必ずエラー表示Onにしてください。

ただ、スーパーグローバル変数を直接使うより今はfilter_input()を使ったほうが良いです(参考記事
シンプルに書けますし検証フィルタを使えば入力チェックにもなります。

投稿2019/03/15 01:54

m.ts10806

総合スコア80850

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

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

0

ちょっと動きが微妙かもしれませんが参考までに。。

1.編集番号を入力し、元の内容を投稿用フォーム内に表示。
2.再度編集ボタンを押下
3.ファイルを読み込み、編集番号と同じであればpostされたデータを上書き

PHP

1case "edit": 2 $edit = $_POST["edit"]; 3 $ediCon = file($filename); 4 for ($j = 0; $j < count($ediCon); $j++) { 5 $ediData = explode("<>", $ediCon[$j]); 6 if ($ediData[0] == $edit){ 7 $ediName = $ediData[1]; 8 $ediComment = $ediData[2]; 9 } 10 } 11 12 // 編集番号取得 13 $hidden = filter_input(INPUT_POST, 'hidden'); 14 15 // 編集番号(hidden)があれば・・ 16 if ( $hidden ) { 17 $name = filter_input(INPUT_POST, 'name'); 18 $comment = filter_input(INPUT_POST, 'comment'); 19 $time = date("Y/m/d H時i分s秒"); 20 21 $contents = file($filename); 22 $fp = fopen($filename, 'w'); 23 24 foreach($contents as $content) { 25 $parts = explode("<>", $content); 26 27 // 編集番号と同じだったらpostされたデータに上書き 28 if ( $parts[0] == $edit ) { 29 fwrite($fp, $name."<>".$comment."<>".$time."\n"); 30 } else { 31 // 違う場合はそのまま書き込み 32 fwrite($fp, $content); 33 } 34 } 35 fclose($fp); 36 37 // 元のページに戻る?? 38 header('Location:'.$_SERVER['REQUEST_URI']); 39 exit; 40 } 41

投稿2019/03/14 06:19

mayoi_maimai

総合スコア1583

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

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

0

ベストアンサー

個別の機能がよくわかっていない状態で機能を追加するのは中々無理があるので、
まずは「ファイルの一部を変更して保存しなおす」という機能だけを出来るだけシンプルに作って理解してみてはいかがでしょうか?

ファイル関数に、ついて調べましたが、一部を変更することがあまり出てこなくて、変更する場合にも文字列の長さが均等でないといけないと書いてあり、必要なことは、ファイルを一度からにしてそこからまた書き込むことということはわかったのですがイメージがつかず今に至ります。

流れとしては

  1. ファイルの内容を変数に読み込む
  2. 読み込んだ変数を使って更新後のファイルのデータ変数を作る(or 変数を書き換える)
  3. 変数をファイルに上書きする

使っている関数は違いますが例えばこんな感じです。
この内容が理解できないようであれば、もっと複雑な掲示板で実装することは難しいので、上記の1-3がどう実行されているか確認してみて下さい。

1<>"1行目" 2<>"2行目" 3<>"3行目"

というデータ(data.txt)があって、2行目のデータを書き換えるだけのPHP

PHP

1 2$lines = file("data.txt",FILE_IGNORE_NEW_LINES); 3foreach($lines as $line){ 4 $fields = explode("<>",$line); 5 //2行目の時だけ書き換える 6 //ここでは2行目を決め打ちだが、実際はPOSTから取得したIDで判定する 7 if($fields[0] === "2"){ 8 $fields[1] = "更新された2行目"; 9 } 10 //出力用の配列に格納 11 $newLines[] = implode("<>",$fields); 12} 13 14//ファイルへの書き込み fwriteを使ってもいいです 15file_put_contents("data.txt",implode(PHP_EOL,$newLines)); 16

実行後にdata.txtが以下に更新されます

1<>"1行目" 2<>更新された2行目 3<>"3行目"

投稿2019/03/14 06:10

tanat

総合スコア18713

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問