前提・実現したいこと
ここに質問の内容を詳しく書いてください。
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー