🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

6166閲覧

PHP 簡易掲示板 削除後の投稿番号

yuunyanu

総合スコア6

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2019/11/11 07:20

編集2019/11/11 08:11

前提・実現したいこと

phpを学び始めたばかりの初心者です。
前回質問した削除の実装はうまくいったのですが、削除した後に投稿すると番号がおかしくなってしまいます。

本来は2を削除して4を投稿した際に
1 (名前) (コメント) (投稿日) (投稿時間)
3 (名前) (コメント) (投稿日) (投稿時間)
4 (名前) (コメント) (投稿日) (投稿時間)
としたいのですが、

1 (名前) (コメント) (投稿日) (投稿時間)
3 (名前) (コメント) (投稿日) (投稿時間)
3 (名前) (コメント) (投稿日) (投稿時間)
となってしまいます。
ちなみにそのあとに3を削除すると、二つとも消えます。

投稿機能の方のカウントに問題があるのでは?と思い、$num++を入れてみたりしたのですがダメでした…
また、ほかの方の質問を探して取り入れてみたのですが、それでも解決できなかったため、質問させて頂きました。
どうか皆様のお力をお貸し頂きたいです。よろしくお願い致します。

該当のソースコード

<html> <body> <?php function h($str){ return htmlspecialchars($str,ENT_QUOTES,'UTF-8');} //投稿機能 if(!empty($_POST['name'])&&!empty($_POST['comment'])){ $textfile="mission_3.txt"; $fp=fopen($textfile,"a+"); $comment=$_POST['comment']; $name=$_POST['name']; $date=date("Y/m/d H:i:s"); $num=count(file($textfile))+1; $newDate=$num.'<>'.$_POST['name'].'<>'.$_POST['comment'].'<>'.$date."\n"; fwrite($fp,$newDate); fclose($fp);} //削除機能 if (!empty($_POST['send_delete'])) { $textfile="mission_3.txt"; $ret_array=file($textfile); $delete = $_POST['delete']; //指定した番号以外を書き込み $fp2=fopen($textfile,"w"); for ($j=0; $j<count($ret_array); $j++){ $delDate=explode("<>",$ret_array[$j]); if ($delDate[0]!==$delete){ fwrite($fp2,$ret_array[$j]);}} fclose($fp2);} ?> </br> <form action="" method="post"> [投稿フォーム]<br> <input type="text" name="name" placeholder="名前"><br> <input type="text" name="comment" placeholder="コメント"> <input type="submit" value="送信"><br><br> [削除フォーム]<br> <input type="text" name="delete" placeholder="削除対象番号"> <input type="submit" name="send_delete" value="削除"> </form> <?php //表示 $textfile='mission_3.txt'; if(file_exists($textfile)){ $array=file($textfile,FILE_SKIP_EMPTY_LINES); foreach($array as $word){ $words=explode('<>',$word); echo $words[0].' '.$words[1].' '.$words[2].' '.$words[3]."<br>";}} ?> </body> </html>

試したこと

同じような形で質問されているもの( https://teratail.com/questions/207044 )や、簡易掲示板の他の投稿(削除機能や編集機能の実装について質問している投稿)と見比べたり、外部のサイトで同じようなものを作成しているものを参考にしました。
$lines = file('keijiban.txt');
$lastLine = $lines[count($lines) - 1];
$num = explode('<>', $lastLine)[0];
のようなものも試しました。

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

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

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

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

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

m.ts10806

2019/11/11 07:29 編集

回答に移動
m.ts10806

2019/11/11 07:30

もし過去質問を参考にされたのでしたら、どの回答を確認してどのように試してみたのかを具体的に記載願います。
yuunyanu

2019/11/11 07:40 編集

コメントありがとうございます。 同じような形で質問されているもの( https://teratail.com/questions/207044 )や、簡易掲示板の他の投稿(削除機能や編集機能の実装について質問している投稿)と見比べたり、外部のサイトで同じようなものを作成しているものを参考にしました。
m.ts10806

2019/11/11 07:41

質問を編集して追記願います。
yuunyanu

2019/11/11 07:45

これで大丈夫でしょうか? teratailの使い方もあまり慣れていなくて…すみません。 間違っていたら仰ってください。
m.ts10806

2019/11/11 07:57

問題ないですが見ている質問が未解決のものでは、例え回答が正しいものであってもあまり参考にはならないかなと。 あくまでロジックの問題だと思っています。 あと、この質問の私の回答にコメントでヒントをつけています。 ただ私としては今のやり方を進めたとして面倒なことをやっているだけで、なんの役にも立たないので、参考にしている書籍からは早いところ手を切ったほうが良いです。 この簡易掲示板の質問をしている質問者がそのまま進めて成長した姿を見たことがありません
退会済みユーザー

退会済みユーザー

2019/11/11 08:02

これ、出典はどこのものでしょうか?
Y.H.

2019/11/11 09:15

レコードの物理削除じゃなくて論理削除方式にするとすっきりしそう :-)
guest

回答2

0

$num=count(file($textfile))+1;
で新規投稿の番号を生成するの、おかしいよね。
1,2,3,4があるところに、2を削除したら1,3,4なわけで、
そこに新規投稿があると4になるの?

改善方法は、とりあえず2つ。
1)
削除したときに、
投稿番号をすべて振り直して書き出すことによって、
投稿番号=行番号を保証する方法。
2)
削除によって投稿番号と行番号が食い違う前提で、
新たな採番をする際に使っていない番号を保証するために、
例えば投稿番号の最大値+1を使う方法に切り替える方法。
全行順次読み込んで、投稿番号を比較して最大値を求めるくらい、
サンプルコードを示さなくてもわかるよね?

なお、前者はおすすめできません。
投稿を表示している間に誰かか削除の操作をしてしまうと、意図しない投稿を削除することに繋がりますので。

投稿2019/11/11 13:21

編集2019/11/11 13:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

teratailによく投稿される「簡易掲示板」の話題
よく投稿されるということはそれだけ対応可能な回答が集まっているということになります。過去質問探るだけでも十分解決可能なヒントは見つかるのではないでしょうか。
(よく投稿され過ぎるので「またか」と質問を見もしない回答者が増えているのも事実です…)

それに同様の問題を見たことがあります。
私も回答したことがありますし、最近の質問でも見た記憶があります。
まずはどの質問のどの回答を参考にしたかを提示されたほうが良いです。

投稿2019/11/11 07:28

編集2019/11/11 07:31
m.ts10806

総合スコア80875

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

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

m.ts10806

2019/11/11 07:42 編集

こっそりこっちにヒントを書いておく。 件数を番号にしてるからそりゃ123で2を削除して13の状態投稿すれば「2件+1」で3になるよねという話。 一行ずつ見ていけばわかるはず。 「最終番号+1」も悪くはないが「投稿番号管理データ」を持っておくのが適切。 なぜなら123で3が削除された場合、次の番号は3でいいのかというところ。 やっぱりそんな面倒なことを考えなきゃいけないテキスト管理じゃなくデータベースだよね。
yuunyanu

2019/11/11 08:41

ありがとうございます! 他に試したことを思い出したので加筆したのですが、こちらも行数カウントなので成功しても123で3を削除→次の番号3になりますよね…ほかのやり方を探してみます。
m.ts10806

2019/11/11 13:25

>「投稿番号管理データ」を持っておくのが適切。 と書いていますよ私。 そこから持って来ればいいのでわざわざ投稿用のファイルを見なくて済みます。要はシーケンスを別ファイルで管理するわけです。 (※だからデータベースが良いと何度も)
m.ts10806

2019/11/14 21:19

一応、解決されたならどのように解決に至ったのかコメントいただけたらと(「質問するときのヒント」にもなぜそれが必要か書かれています)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問