【目的】
削除したいメッセージの番号をフォームから送信するとその番号と一致するメッセージがテキストファイルから削除され、ブラウザ上からも消える。
【コード】
php
1<?php 2 3// メッセージを保存するファイルのパス設定 4define( 'FILENAME', './kadai_2_02.txt'); 5 6// タイムゾーン設定 7date_default_timezone_set('Asia/Tokyo'); 8 9// 変数の初期化 10$now_date = null; 11$data = null; 12$file_handle = null; 13$split_data = null; 14$message = array(); 15$message_array = array(); 16$success_message = null; 17$error_message = array(); 18$delete = null; 19$del_con = null; 20$del_data = array(); 21 22//-------テキストファイルにデータを書き込む----------------------- 23 24if(file_exists(FILENAME)){ 25 $num = count(file(FILENAME)) + 1; //$num = count(file(FILENAME))でファイルの行数をカウントできる 26}else{ 27 $num = 1; 28} 29 30if( !empty($_POST['btn_submit']) ) { 31 32 //-----未入力のバリデーション--------- 33 if(empty($_POST['view_name'])){ 34 $error_message[] = '名前を入力してください!'; 35 } 36 37 if(empty($_POST['message'])){ 38 $error_message[] = 'メッセージを入力してください!'; 39 } 40 //------------------------------------- 41 42 if( $file_handle = fopen( FILENAME, "a") ) { //fopen関数で指定したファイルを開く 43 // タイムスタンプ 44 $now_date = date("Y-m-d H:i:s"); 45 46 // 書き込むデータを作成 47 $data = $num."<>".$_POST['view_name']."<>".$_POST['message']."<>".$now_date."\n"; 48 49 // 書き込み 50 fwrite( $file_handle, $data); //file_handleは書き込む対象となるファイル(●●.txt)を判別するためのパラメータ 51 52 // ファイルを閉じる 53 fclose( $file_handle); 54 55 //投稿が成功したことを示すメッセージ 56 $success_message = 'メッセージを送信しました'; 57 } 58} 59 60//-------テキストファイルのデータを掲示板のフォーム下に表示-------- 61 62if( $file_handle = fopen( FILENAME,'r') ) { 63 64 while( $data = fgets($file_handle) ){ //fgets関数でファイルからデータを一行ずつ全て取得 65 66 //preg_split関数で文字列を特定の文字で分割する: 67 $split_data = explode("<>",$data); 68 69 $message = array( 70 'view_name' => $split_data[1], 71 'message' => $split_data[2], 72 'post_date' => $split_data[3] 73 ); 74 array_unshift( $message_array, $message); 75 } 76 77 // ファイルを閉じる 78 fclose( $file_handle); 79} 80 81//--------指定されたメッセ―ジを削除する----------------------------- 82 83if(isset($_POST['delete'])){ 84 85 $delete = $_POST['deleteNo']; 86 $del_con = file(FILENAME); 87 88 for( $i=0; $i<count($del_con); $i++ ){ 89 $del_data = explode("<>", $del_con[$i]); 90 if($del_data[0] == $delete){ 91 array_splice($del_con,$i,1); //array_splice(配列、削除開始位置、削除する配列要素数←これ指定しないと削除開始位置から全部消える) 92 file_put_contents(FILENAME, implode("\n", $del_con)); 93 } 94 } 95} 96 97 98?> 99 100<!DOCTYPE html> 101<html lang="ja"> 102<head> 103<meta charset="utf-8"> 104<title>簡易掲示板</title> 105</head> 106 107<body> 108<h2>簡易掲示板(^-^*)</h2> 109 <?php if(!empty($success_message)):?> 110 <p class="success_message"><?php echo $success_message;?></p> 111 <?php endif; ?> 112 113 <?php if(!empty($error_message)):?> 114 <ul class="error_message"> 115 <?php foreach($error_message as $value):?> 116 <li>・<?php echo $value; ?></li> 117 <?php endforeach; ?> 118 </ul> 119 <?php endif; ?> 120 121 <form method="post"> 122 <div> 123 <label for="view_name">名前</label> 124 <input id="view_name" type="text" name="view_name" value=""> 125 </div> 126 <div> 127 <label for="message">メッセージ</label> 128 <textarea id="message" name="message"></textarea> 129 </div> 130 <input type="submit" name="btn_submit" value="書き込む"> 131 </form> 132 133 <form method="post"> 134 <div> 135 <label for="deleteNo">削除番号</label> 136 <input id="deleteNo" type="text" name="deleteNo" value=""> 137 </div> 138 <input type="submit" name="delete" value="削除する"> 139 </form> 140 141<hr> 142 143<section> 144 <?php if( !empty($message_array) ): ?> 145 <?php foreach( $message_array as $value ): ?> 146 <article> 147 <div class="info"> 148 <h2><?php echo $value['view_name']; ?></h2> 149 <time><?php echo date('Y年m月d日 H:i', strtotime($value['post_date'])); ?></time> 150 </div> 151 <p><?php echo $value['message']; ?></p> 152 </article> 153 <?php endforeach; ?> 154 <?php endif; ?> 155</section> 156 157</body> 158</html>
【やったこと】
★似たような投稿が(https://teratail.com/questions/137315)にいくつか紹介されていましたので全て確認してみました。
★初め、 if('del_data[0]' == $delete) のdel_data部分にクオートを付けずに実行すると、クオートを付けないとエラーになりますという旨のエラーメッセージが出てきたのでクオートを付けましたところエラーはでなくなりました。が、メッセージはブラウザからもテキストファイルからも削除されません。
【頂いた解答をもとに$del_data[0]にコードを変更した後のエラー】
Notice: Undefined offset: 1 in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_04.php on line 70 Notice: Undefined offset: 2 in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_04.php on line 71 Notice: Undefined offset: 3 in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_04.php on line 72
このエラーがくりかえし表示され、テキストファイルからは該当のメッセージが削除されますがブラウザには削除したメッセ―ジも残りませんし、
Emily 2020年05月04日 13:21 Yes,please 1970年01月01日 09:00 1970年01月01日 09:00 1970年01月01日 09:00
↑のように名前や投稿日時、メッセージの他にも「1970年01月01日 09:00 」と関係ない日時が各投稿に対して三回ずつ繰り返されます。
回答2件
あなたの回答
tips
プレビュー