PHPで掲示板に編集機能をつけたいのですがそもそもどのように記入すればいいかわかりません?
下のコードの2個目のelseif(isset($_POST["delete"]) === true) の書き込みを変更するのはわかるのですが、ただ自分が初心者な事もあり、どこに何をつければいいのかが分かりません。
ここでも同じような質問がたくさんあったのでほぼすべて見てみましたが、自分とはコードの書き方が違っていて理解することが出来ませんでした。
教材の問題文は以下のようになっています。
Mission_3-4
掲示板に「編集機能」を付加しよう。指定された番号の投稿を編集できるようにする
問題文
※ミッションの解釈・補足:
編集の手順を分解すると、
・編集元のテキストを、投稿フォームに表示させる
・編集してから送信する
という2段階になる。そして、
・上記の送信をされた時点で、これは編集すべきものと判断できる「目印」が要る
・その目印が送られてきた場合は、編集として処理をする(それ以外は新規投稿として処理する)
事が必要。
順序だてて進めていこう。
ミッション要素の分解:
新しいフォーム作成 + 条件分岐 + テキストファイルの配列への読み込み + ループ処理 + 文字列の分割・取り出し + フォーム内でのプログラム実行 + フラグの考え方
【「入力フォーム」「削除フォーム」と並べて「編集番号指定用フォーム」を用意・「編集対象番号」の入力と「編集」ボタンが1つある】
【POST送信で「編集対象番号」を送信。受信する際は、if文で既存の各フォームとはまた別に「編集フォーム」で処理を分岐させる】
【ファイル読み込み関数で、ファイルの中身を1行1要素として配列変数に代入する。 ファイルを開き、先ほどの配列の要素数(=行数)だけループさせる】
【ループ処理内:区切り文字「<>」で分割して、投稿番号を取得】
【同・ループ処理内:投稿番号と編集対象番号を比較。イコールの場合はその投稿の「名前」と「コメント」を取得】
【既存の投稿フォームに、上記で取得した「名前」と「コメント」の内容が既に入っている状態で表示させる】
ここまで出来た状態で、プログラムを動かすと…
【既存の投稿フォーム内に「いま送信された場合は新規投稿か、編集か(新規登録モード/編集モード)」を判断する情報を追加する】
投稿フォームが「新規投稿」と「編集」を兼ねているため「新規投稿か、編集か」を判断できるようにする必要がある。
作成の過程としてフォーム内に新しい項目(テキストボックス※)を用意して、そこに編集したい投稿番号が表示される状態にしておこう
(※これは最終的に利用者から見えないようにします)。
【編集内容が問題ない場合:投稿番号と編集対象番号を比較して、等しい場合は、ファイルに書き込む内容を送信内容に差し替える】
このフォ―ムから送信があった場合、
・上記テキストボックス内が空かどうか確認する:
・空でないときは、テキストファイルの中身を取り出し、各行の投稿番号を比較。
・一致した時のみ、編集のフォームから送信された値と差し替える。
・空のときは、通常の新規投稿として扱われるようにする。
【上記でフォームに追加した情報が、ブラウザから見えてしまう場合は、type属性をhiddenに変更して見えなくする】
ミッションクリア条件
編集番号指定フォーム(編集対象番号入力欄と編集ボタン)が追加されていること
指定した編集番号の行がテキストファイル、ブラウザ表示、共に最新に更新されること
指定した編集番号が存在しない時は新規作投稿と同じ動きをすること ※このときの投稿番号は一番大きい数字にするのが一般的
php
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>mission_3-3</title> 6</head> 7 8<body> 9 <h3>削除機能付きWEB掲示板</h3> 10 11 <!--POST送信--> 12 13 <!--入力フォーム--> 14 <form action="" method="post"> 15 お名前 :<input type="str" name="name" placeholder="お名前"><br> 16 コメント:<input type="str" name="comment" placeholder="コメント"><br> 17 <input type="submit" name="submit" value="送信"><br> 18 </form> 19 20 <!--削除フォーム--> 21 <form action="" method="post"> 22 削除対象番号:<input type="number" name="delete_num" placeholder="数字を入力してください"><br> 23 <input type="submit" name="delete" value="削除"><br> 24 </form> 25 26<!--編集フォーム--> 27 <form action="" method="post"> 28 削除対象番号:<input type="number" name="edit_num" placeholder="数字を入力してください"><br> 29 <input type="submit" name="edit" value="編集"><br> 30 </form> 31 32 <?php 33 34 $name = ""; // null 35 $comment = ""; 36 $num = 1; // 初期値 37 $delete_num = null; // == 0 38 $filename="practice.txt"; 39 $edit_num = null; // == 0 40 41 if(isset($_POST["submit"]) === true) { #送信ボタンがクリックされたら ----- 42 43 # POST受信 44 $name = $_POST["name"]; 45 $comment = $_POST["comment"]; 46 $date = date("Y-m-d H:i:s"); 47 if(file_exists($filename)) { # ファイルが存在したら 48 $lines = file($filename); 49 $end_line = $lines[count(file($filename))-1]; //投稿番号取得 50 if(filesize($filename)!=0){ 51 $num = (int)substr($end_line, 0, 1)+1; 52 } else { 53 $num = count(file($filename))+1; 54 } 55 } 56 $submission = $num."<>".$name."<>".$comment."<>".$date; // 文字列の連結 57 58 # 入力データのファイル追記 59 $fp = fopen($filename,"a"); 60 fwrite($fp, $submission.PHP_EOL); 61 fclose($fp); 62 63 if(file_exists($filename)) { 64 $lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // ファイルの中身を配列に格納 65 foreach($lines as $line) { 66 $exploded_values = explode("<>", $line); // 文字列を "<>" 毎に分割 67 foreach($exploded_values as $exploded_value) { 68 echo $exploded_value."<br>"; // 分割した文字列毎に改行しながら表示 69 } 70 } 71 } 72 } elseif(isset($_POST["delete"]) === true) { #削除ボタンがクリックされたら ----- 73 74 # POST受信 75 $delete_num = $_POST["delete_num"]; 76 $delete_num = $delete_num -1; 77 78 if(file_exists($filename)) { # ファイルが存在したら 79 $lines = file($filename); // ファイルの中身を配列に格納 80 # 入力データのファイルからの削除 81 $fp = fopen($filename,"w"); 82 foreach($lines as $line) { 83 if(substr($line, 0, 1)!=$delete_num+1) { 84 fwrite($fp, $line); 85 } 86 } 87 fclose($fp); 88 } 89 90 if(file_exists($filename)) { 91 $lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // ファイルの中身を配列に格納 92 foreach($lines as $line) { 93 $exploded_values = explode("<>", $line); // 文字列を "<>" 毎に分割 94 foreach($exploded_values as $exploded_value) { 95 echo $exploded_value."<br>"; // 分割した文字列毎に改行しながら表示 96 } 97 } 98 } 99 } elseif(isset($_POST["delete"]) === true) { #編集ボタンがクリックされたら ----- 100 101 # POST受信 102 $delete_num = $_POST["delete_num"]; 103 $delete_num = $delete_num -1; 104 105 if(file_exists($filename)) { # ファイルが存在したら 106 $lines = file($filename); // ファイルの中身を配列に格納 107 # 入力データのファイルからの編集 108 $fp = fopen($filename,"w"); 109 foreach($lines as $line) { 110 if(substr($line, 0, 1)!=$delete_num+1) { 111 fwrite($fp, $line); 112 } 113 } 114 fclose($fp); 115 } 116 117 if(file_exists($filename)) { 118 $lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // ファイルの中身を配列に格納 119 foreach($lines as $line) { 120 $exploded_values = explode("<>", $line); // 文字列を "<>" 毎に分割 121 foreach($exploded_values as $exploded_value) { 122 echo $exploded_value."<br>"; // 分割した文字列毎に改行しながら表示 123 } 124 ?> 125 126</body> 127</html>
回答1件
あなたの回答
tips
プレビュー