前提・実現したいこと
掲示板に「編集機能」を付加しよう。指定された番号の投稿を編集できるようにする
1、「入力フォーム」「削除フォーム」と並べて「編集番号指定用フォーム」を用意・「編集対象番号」の入力と「編集」ボタンが1つある】
2,【POST送信で「編集対象番号」を送信。受信する際は、if文で既存の各フォームとはまた別に「編集フォーム」で処理を分岐させる】
3,【ファイル読み込み関数で、ファイルの中身を1行1要素として配列変数に代入する。 ファイルを開き、先ほどの配列の要素数(=行数)だけループさせる】
4,【ループ処理内:区切り文字「<>」で分割して、投稿番号を取得】
5,【同・ループ処理内:投稿番号と編集対象番号を比較。イコールの場合はその投稿の「名前」と「コメント」を取得】
6,【既存の投稿フォームに、上記で取得した「名前」と「コメント」の内容が既に入っている状態で表示させる】
7,【既存の投稿フォーム内に「いま送信された場合は新規投稿か、編集か(新規登録モード/編集モード)」を判断する情報を追加する】
投稿フォームが「新規投稿」と「編集」を兼ねているため「新規投稿か、編集か」を判断できるようにする必要がある。
作成の過程としてフォーム内に新しい項目(テキストボックス※)を用意して、そこに編集したい投稿番号が表示される状態にしておこう
(※これは最終的に利用者から見えないようにします)。
8.【編集内容が問題ない場合:投稿番号と編集対象番号を比較して、等しい場合は、ファイルに書き込む内容を送信内容に差し替える】
このフォ―ムから送信があった場合、
・上記テキストボックス内が空かどうか確認する:
・空でないときは、テキストファイルの中身を取り出し、各行の投稿番号を比較。
・一致した時のみ、編集のフォームから送信された値と差し替える。
・空のときは、通常の新規投稿として扱われるようにする。
9,【上記でフォームに追加した情報が、ブラウザから見えてしまう場合は、type属性をhiddenに変更して見えなくする】
ミッションクリア条件
編集番号指定フォーム(編集対象番号入力欄と編集ボタン)が追加されていること
指定した編集番号の行がテキストファイル、ブラウザ表示、共に最新に更新されること
指定した編集番号が存在しない時は新規作投稿と同じ動きをすること ※このときの投稿番号は一番大きい数字にするのが一般的
発生している問題・エラーメッセージ
この課題で、似たような質問している方のを参考に7番まではできたのですが、8番目の「投稿番号と編集対象番号を比較して、等しい場合はファイルに書き込む内容を送信内容に差し替える」というところが出来ません。
エラーメッセージ
該当のソースコード
`<!DOCTYPE html>
<html lang="ja"> <head> <meta charset="UTF-8"> <title>mission_3-4</title> </head> <body> <?php //投稿処理 $name=$_POST["name"]; $str=$_POST["str"]; $date=date("Y/m/d,H:i:s"); $filename="mission_3-4.txt"; //$fp=fopen($filename,"a"); $lines=(file($filename,FILE_IGNORE_NEW_LINES)); $lastline=$lines[count($lines)-1]; $num=explode("<>",$lastline)[0]+1; $text=$num."<>".$name."<>".$str."<>".$date.PHP_EOL; if($name=="" && $str==""){;} elseif($name==""){;} elseif($str==""){;} elseif(!empty($name) && !empty($str)) { if($_POST["edit_n"]!="") { $filename="mission_3-4.txt"; $fp2=fopen($filename,"w"); $lines=(file($filename,FILE_IGNORE_NEW_LINES)); $lastline=$lines[count($lines)-1]; $num=explode("<>",$lastline)[0]+1; //if($num==$edit_n) fwrite($fp2,$edit_n."<>".$name."<>".$str."<>".$data.PHP_EOL); fclose($fp2) ; } elseif($_POST["edit_n"]==""){ $fp=fopen($filename,"a"); fwrite($fp,$text); fclose($fp);} } //削除 $delete=$_POST["delete"]; if(!empty($_POST["delete"])){ $delcon=file($filename); for($i=0; $i<count($delcon) ; $i++) {$deldata=explode("<>",$delcon[$i]); if($deldata[0]==$delete) {array_splice($delcon,$i,1); file_put_contents($filename,implode("",$delcon)); } } } //編集フォーム 元の内容を表示させる if(isset($_POST["edit"])){ $edit=$_POST["edit"]; $edit2=file($filename); for($i=0; $i<count($edit2); $i++) {$editdata=explode("<>",$edit2[$i]); if($editdata[0]==$edit) {$newname=$editdata[1]; $newcomment=$editdata[2]; //var_dump($editdata); } } }//if終わり ;?><?php if(file_exists($filename)) {$lines=file($filename,FILE_IGNORE_NEW_LINES); $line=explode("<>",$text); foreach($lines as $text){ echo str_replace("<>"," ",$text)."<br>";} ;} ;?> </body> </html><form action="mission_3-4.php" method="post"> 入力フォーム:<br> <input type="text" name="name" placeholder="名前" value="<?php if(!empty($_POST["edit"])){ echo $newname;}?>"><br> <input type="text" name="str" placeholder="コメント" value="<?php if(!empty($_POST["edit"])){ echo $newcomment;}?>"><br> <input type="submit" value="送信"> </form> <form action="mission_3-4.php" method="post"> 削除フォーム: <input type="text" name="delete" placeholder="削除対象番号"> <input type="submit" value="削除"> </form> <form action="mission_3-4.php" method="post"> 編集フォーム: <input type="text" name="edit" placeholder="編集対象番号"> <input type="submit" value="編集"> <input type="text" name="edit_n" value="<?php if(!empty($_POST["edit"])){echo $edit;}?>"> </form>
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー