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

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

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

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

Q&A

解決済

2回答

534閲覧

投稿番号を削除する機能を実装したい

mk77

総合スコア8

PHP

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

0グッド

0クリップ

投稿2018/08/08 14:13

前提・実現したいこと

投稿番号の削除機能を実装したい。

ここに質問の内容を詳しく書いてください。
phpで指定した投稿番号を削除しファイルを更新する機能を実装したいです。
投稿番号の削除の機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Warning: fwrite(): supplied argument is not a valid stream resource in /home/tt-190.99sv-coco.com/public_html/mission_2-3.php on line 68 Warning: fclose(): supplied argument is not a valid stream resource in /home/tt-190.99sv-coco.com/public_html/mission_2-3.php on line 71

該当のソースコード

PHP

1<?php 2//フォームからの受け取り 3 $comment = $_POST['comment']; 4 $name = $_POST['name']; 5 $delete = $_POST['delete']; 6 7 8//ファイルの作成 9 $filename = 'mission_2-3_MasayaKokubo.txt'; 10 $fp_make = fopen($filename,'a'); 11 $fwrite = ($fp_make); 12 $fclose = ($fp_make); 13 14//ファイルへの追記変数 15 $fp_add = fopen($filename,'r+'); 16 17//日付けの変数 18 $date = date ('Y年m月d日H時m分s秒'); 19 20//投稿番号 21 $a = 0; 22 flock($fp_add,LOCK_EX); 23 while(fgets($fp_add) !== false){ 24 $a++; 25 } 26 $next = $a +1; 27 28 29 $conntent = $next.'<>'.$name.'<>'.$comment.'<>'.$date; 30 31 32//テキストファイルへの書き込み 33 if(!empty($comment) and !empty($name)){ 34 fwrite($fp_add,$conntent.PHP_EOL); 35 } 36 flock($fp_add,LOCK_UN); 37 fclose($fp_add); 38 39//ファイルを配列に格納 40 $files = file($filename); 41 42//配列を分割しループ 43 for($i = 0 ; $i <count($files); $i++){ 44 $line_ex = explode('<>',$files[$i]); 45 echo $line_ex[0]." "; 46 echo $line_ex[1]." "; 47 echo $line_ex[2]." "; 48 echo $line_ex[3]."<br>"; 49 } 50 51//投稿の削除 52 if(!empty($delete)){ 53 $fp_delete = fopen($filenamea,'w'); 54 for($j = 0; $j <count($files); $j++){ 55 $deldate = explode("<>",$files[$j]); 56 if($deldate[0] != $delete){ 57 fwrite($fp_delete,$files[$j]); 58 } 59 } 60 fclose($fp_delete); 61 } 62?> 63

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

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

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

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

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

m.ts10806

2018/08/08 20:36

折角エラーメッセージで原因を教えてくれているのだから、まずそのエラーメッセージで調べて、調べた結果試してみてください。おそらくこの内容だと質問するより調べた方が早いですし、もし、調べてやってみた結果解決に至ってないのでしたらその経緯や調べてやってみた内容も質問に記載してください。
m.ts10806

2018/08/08 20:38

あとファイル名はそのままWeb上で公開しても大丈夫なものですか?場合によってはこの質問は削除依頼を出してもらって、修正した内容で新たな質問を立ててもらった方がいいかもしれません。ご検討ください。
mk77

2018/08/08 23:58

ご指摘ありがとうございます。ただ、削除ボタンがどこを見ても発見できません。削除ボタンはどの変にありますか??基本的な質問ですみません
m.ts10806

2018/08/09 01:17

回答がついた質問は質問から削除依頼が出せませんので運営問い合わせで送ってください。
guest

回答2

0

ベストアンサー

ちゃんと構造設計してない雰囲気がしますね。

他の方の回答にもあるように、
データをファイルに蓄えるのは複数から同時タイミングでアクセスが有った場合に
いかに排他ロックをかけていたとしてもデータファイルの破損を招きやすいので、
学習のステップとして(リレーショナル)データベースの扱い方を学んでほしいところです。

それは置いといて、データファイルを読み書きして管理する方針を尊重するとします。
どうやらデータファイルには、改行コード PHP_EOL を境目として投稿を区別し、
番号、名前、コメント、日付時刻を「<>」を区切り文字列として連結していると。
当然番号はユニークでないといけないのだけど、
投稿を削除した場合に番号の管理はどうするのだろうかと。
普通は欠番にするよね。
例えば、1,2,3,4,5の番号を使っているときに、
AさんとBさんが観ています、
Aさんが5番を削除した場合に
削除する前から見ていたBさんが投稿を追加したら
Bさんの投稿は6番になってほしいけど、
どうやったら番号の一貫性を保てるのか。
Bさんが投稿したときに5番になっちゃって、
Aさんが削除した5番と違う5番になったりすると混乱のもとになるよね。
こういう細かいところまで配慮して、
例えば番号の発番を投稿データファイルとは別に番号ファイルを持ちましょうって考えてもいいかもしれない。
これが構造の設計。

ついでにいうと、
いわゆる簡易掲示板の話によく出てくる file()って、
ファイル名を与えるだけで配列に読み込んでくれる便利関数なのですが、
file
flagsとしてFILE_IGNORE_NEW_LINESを与えることで、
配列に読み込むときに自動的に末尾の改行コードを無視してくれ(除去してくれ)ます。
将来の実装で、
投稿の削除をするときの編集で、うっかり PHP_EOL の二度漬けにならないようにしましょう。

実用性を踏まえた上で検討する話として、
file()とかfile_get_contents()とかの読み込みって、
数百や数千のオーダーの投稿データを溜め込んでいる想定のときに
読み込みの一貫性を確保してくれるのかなぁ。
配列データとして読み込んで、加工して、再度ファイルに書き出すまで、
他の人のアクセスによって既にファイルが改変されている可能性もありうるよね。

それと、フォームの入力欄で、
もしも「<>」を含んだ文字列を入力されたらどうなるだろう。
プログラム内でつける区切り文字「<>」と
入力された文字列「<>」との区別はつかなくなるよね。
ちゃんと対策方法を考えないとね。
入力を受け付けないというのも手だし、
そういう入力があっても扱えるようにデータの持ち方を工夫したりもできる。
これも構造の設計、仕様の決め方次第。

そういう意味においても実用性のない「簡易掲示板」なんだよね、
データの読み込みや編集にかかる処理時間がどのくらいかかるか、
同時アクセスに耐えうるのかって話をすっ飛ばした、
この手の「簡易掲示板」でわかった気になってしまうと、
実用性の低いコードしかかけない人になってしまうかもしれません。

あと、これも構造の設計という点で一言。
投稿されたデータをファイルに保存する、という処理、
投稿データから指定番号の投稿を削除する、という処理、
投稿データを読み出して表示する、という処理、
など、「簡易掲示板」に関わる処理はいくつもありますが、
これ、全部一つのphpで実現しないといけないものなのかどうか、
というところも構造の設計。
自分の理解がまだちゃんと及んでいないうちは、
単機能で一つphpファイルを書く、ってのをやっても良いと思う。
それが複数合わさってもいいので。
一つのphpファイルで複数の処理をこなすこともできるけど、
自分の理解の早さに合わせてやれることをやったらいいと思うよ。

長くてすまん。

投稿2018/08/09 01:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ざっとしか追ってませんが、ファイル操作系のコマンドの利用方法がおかしいです。
open lock close の利用方法をおさらいしてください。

余談
個人的には、lock を使用するようなデータを扱うのであれば、データベースを使用したほうが楽だと思います。

投稿2018/08/08 23:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問