数日前に同じ質問をし、一旦は解決しました。
指定した番号以外も削除されるようになってしまいました。
file_put_contents()だと排他ロックが掛けられないとの指摘をうけ、fopenに書き換えました。
その書き方が間違っているせいか、目的が果たせなくなってしまいました。
コードは以下です。(削除部分について)
php
1<?php 2/*もしポストで送信されたら以下の処理を行いGET送信でリダイレクトする(更新時の二重書き込み防止)*/ 3if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) { /*もしPOSTで送信されたら*/ 4 5 /*フォームで送信された値を受け取り、テキストファイルに保存する。 6 その際1行ごとに「{番号}<>{名前}<>{コメント}<>{投稿された時間}」と言う形で保存する*/ 7 /*変数の定義*/ 8 $filename = "keijiban.txt"; /*保存するファイル*/ 9 $name = $_POST[ 'name' ]; /*投稿者の名前*/ 10 $comment = $_POST[ 'comment' ]; /*投稿するコメント*/ 11 $date = date( "Y-m-d H:i" ); /*投稿日時*/ 12 13 /*投稿番号の定義*/ 14 if ( file_exists( $filename ) ) { /*ファイルの存在確認。*/ 15 //最後の行にプラス1 16 $lines=file($filename); 17 $lastline= $lines[count($lines) - 1]; 18 $num = explode('<>',$lastline)[0]; 19 } else { /*ファイルが無かった場合変数の定義を1とする*/ 20 $num = 1; 21 } 22 //書き込み内容 23 $hozon = $num . "<>" . $name . "<>" . $comment . "<>" . $date . "\n"; 24 25 //投稿部分 26 if ( !empty( $_POST[ 'name' ] ) && !empty( $_POST[ 'comment' ] ) ) { /*もし名前とコメントが送信されたら*/ 27 $fp = fopen( $filename, "a" ); /*追記モードでファイルを開く*/ 28 if ( flock( $fp, LOCK_EX ) ) { /*ロックする*/ 29 fwrite( $fp, $hozon ); /*指定したファイルに追記モードで書き込み*/ 30 flock( $fp, LOCK_UN ); 31 } 32 fclose( $fp ); 33 } 34 //削除部分 35 if ( !empty( $_POST[ 'deleteNO' ] ) ) { /*もし、削除番号がポスト送信されたら*/ 36 $deleteNO = $_POST[ 'deleteNO' ]; /*削除番号の変数定義*/ 37 $ret_array = file( $filename ); /*ファイルを配列として読み込む*/ 38 39 $fp = fopen( $filename, "w" ); 40 if ( flock( $fp, LOCK_EX ) ) { 41 foreach ( $ret_array as $value ) { /*ループ*/ 42 $bangou = explode( "<>", $value ); /*<>で分割し投稿番号取り出す*/ 43 44 if ( $deleteNO != $bangou[ 0 ] ) { /*もし読み込んだ番号と送信した番号が違ったら*/ 45 46 fwrite( $fp, $value ); /*ファイルに書き込む*/ 47 flock( $fp, LOCK_UN ); //ロック開放 48 } 49 fclose( $fp ); 50 } 51 } 52 53 } 54 55 header( 'Location: keijiban.php' ); 56 exit; 57} 58?> 59<!doctype html> 60<html lang="ja"> 61<head> 62<meta charset="utf-8"> 63<title>簡易掲示板</title> 64</head> 65 66<body> 67<p> 68<form action="keijiban.php" method="post" > 69 <label for="name-field">お名前<span style="color: red;">【必須】</span><br> 70 </label> 71 <input type="text" name="name" id="name-field" required="required"> 72 </p> 73 <p> 74 <label for="comment">コメント<span style="color: red;">【必須】</span></label> 75 <br> 76 <textarea name="comment" cols="30" rows="3" id="comment" required="required"></textarea> 77 </p> 78 <input type="submit" value="投稿"> 79</form> 80<?php 81 82 83$filename = "keijiban.txt"; 84$ret_array = file( $filename ); 85foreach ( $ret_array as $value ) { 86 $bunkatu = explode( "<>", $value ); 87 foreach ( $bunkatu as $value2 ) { 88 echo $value2 . "<br>\n"; 89 } 90} 91?> 92<form action="keijiban.php" method="post"> 93 <P> 94 <label for="deleteNO" >削除対象番号</label> 95 <input type="text" name="deleteNO" id="deleteNO" > 96 </p> 97 <input type="submit" value=”削除”> 98</form> 99</body> 100</html>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/09 07:23
2019/09/09 07:27
2019/09/09 07:37