質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

984閲覧

PHPで掲示板の削除機能をつけたい(指定した番号以外を上書き)

MakotoIshizawa

総合スコア32

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/09/09 06:56

数日前に同じ質問をし、一旦は解決しました。
指定した番号以外も削除されるようになってしまいました。
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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ぱっとみ

php

1 $fp = fopen( $filename, "w" ); 2 if ( flock( $fp, LOCK_EX ) ) { 3 foreach ( $ret_array as $value ) { /*ループ*/ 4 $bangou = explode( "<>", $value ); /*<>で分割し投稿番号取り出す*/ 5 6 if ( $deleteNO != $bangou[ 0 ] ) { /*もし読み込んだ番号と送信した番号が違ったら*/ 7 8 fwrite( $fp, $value ); /*ファイルに書き込む*/ 9 flock( $fp, LOCK_UN ); //ロック開放 10 } 11 fclose( $fp ); 12 } 13 }

foreach処理でflockfcloseをしてはいけないと思う(ifの最後でやるべきでは)

投稿2019/09/09 07:06

rururu3

総合スコア5545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MakotoIshizawa

2019/09/09 07:23

書き込む直前ということでしょうか
rururu3

2019/09/09 07:27

flock(解除)とfcloseは基本的にファイル操作終了したときに行うものです foreachではファイル書き込み操作をしてるのでflockはまだしも(とはいえしたらだめ)fcloseはしてはいけません
MakotoIshizawa

2019/09/09 07:37

なるほど。ありがとうございます。やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問