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

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

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

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

Q&A

1回答

2168閲覧

php 簡易投稿版 投稿番号の表示方法

morimoritamori

総合スコア1

PHP

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

0グッド

0クリップ

投稿2020/11/23 02:45

phpの簡易投稿版を作成しているのですが、投稿番号を増えていくようにしたいのですが、10までは順調に進み、その後、投稿番号が10よりも多くならず表示されません。どこが間違っているのか教えていただきたいです。
投稿番号は(max(file($filename))+1)で表示しています。
手順は以下の通りです。
【「入力フォーム」「削除フォーム」と並べて「編集番号指定用フォーム」を用意・「編集対象番号」の入力と「編集」ボタンが1つある】
【POST送信で「編集対象番号」を送信。受信する際は、if文で既存の各フォームとはまた別に「編集フォーム」で処理を分岐させる】
【ファイル読み込み関数で、ファイルの中身を1行1要素として配列変数に代入する。 ファイルを開き、先ほどの配列の要素数(=行数)だけループさせる】
【ループ処理内:区切り文字「<>」で分割して、投稿番号を取得】
【同・ループ処理内:投稿番号と編集対象番号を比較。イコールの場合はその投稿の「名前」と「コメント」を取得】
【既存の投稿フォームに、上記で取得した「名前」と「コメント」の内容が既に入っている状態で表示させる】
【既存の投稿フォーム内に「いま送信された場合は新規投稿か、編集か(新規登録モード/編集モード)」を判断する情報を追加する】
投稿フォームが「新規投稿」と「編集」を兼ねているため「新規投稿か、編集か」を判断できるようにする必要がある。
作成の過程としてフォーム内に新しい項目(テキストボックス※)を用意して、そこに編集したい投稿番号が表示される状態にしておこう
(※これは最終的に利用者から見えないようにします)。
【編集内容が問題ない場合:投稿番号と編集対象番号を比較して、等しい場合は、ファイルに書き込む内容を送信内容に差し替える】
このフォ―ムから送信があった場合、
・上記テキストボックス内が空かどうか確認する:
・空でないときは、テキストファイルの中身を取り出し、各行の投稿番号を比較。
・一致した時のみ、編集のフォームから送信された値と差し替える。
・空のときは、通常の新規投稿として扱われるようにする。
【上記でフォームに追加した情報が、ブラウザから見えてしまう場合は、type属性をhiddenに変更して見えなくする】

<html lang="ja"> <head> <meta charset="UTF-8"> <title>mission3-5</title> </head> <body> <?php $edit = $_POST["edit"]; if(isset($edit)) { // ここは編集番号よりデータを求める所
// データ件数分処理 $filename = "mission3-5.txt"; $lines = file($filename); foreach($lines as $row) { // <>で分割して配列に $bbsRowData = explode("<>", $row); // 編集対象番号のときはデータをセットする if($bbsRowData[0] == $_POST["edit"]) { $editNumber = $bbsRowData[0]; $editName = $bbsRowData[1]; $editComment = $bbsRowData[2]; // 即抜ける break;}}} ?> <form action="" method="post"> <span>【 投稿フォーム 】</span><br> <span>名前:    </span> <input type="text" name="name" value="<?php echo $editName; ?>"><br> <span>コメント:  </span> <input type="text" name="comment" value="<?php echo $editComment; ?>"><br> <span>パスワード: </span> <input type="text" name="password"><br> <input type="submit" value="送信"> <span>【 削除フォーム 】</span><br> <span>投稿番号:  </span> <input type="number" name="delete"><br> <span>パスワード: </span> <input type="text" name="password"><br> <input type="submit" value="削除"> <span>【 編集フォーム 】</span><br> <span>投稿番号:  </span> <input type="number" name="edit"><br> <span>パスワード: </span> <input type="text" name="password"><br> <input type="submit" value="編集"><br>
<?php $name = $_POST["name"]; $delete = $_POST["delete"]; $comment = $_POST["comment"]; $edit = $_POST["edit"]; $dates = date('Y年m月d日 H時i分s秒'); $filename = "mission3-5.txt"; echo "----------------"."<br>"."<br>"; if(empty($name)){ echo "Error:name is empty"; } elseif(empty($comment)){ echo "Error:comment is empty"; } elseif(empty($password)){ echo "Error:password is empty"; } echo "<br>"."<br>"."----------------"."<br>"; echo "----------------------"."<br>"."[投稿一覧]"."<br>"; if(!empty($name) && !empty($comment)){ $p = fopen($filename,"a"); $total = (max(file($filename))+1)."<>".$name."<>".$comment."<>".$dates.PHP_EOL; fwrite($p,$total); fclose($p); $lines = file($filename); foreach($lines as $line){ $contents = explode("<>",$line); $postnumber = $contents[0]; $fullnamer = $contents[1]; $commenter = $contents[2]; $dater = $contents[3]; echo $postnumber; echo $fullnamer; echo $commenter; echo $dater."<br>";} } elseif(isset($delete)){ $delcon=file($filename); //file関数で開くテキストファイルの指定 $fp=fopen($filename,"w"); for($j=0; $j<count($delcon); $j++){ $deldata=explode("<>",$delcon[$j]); if($deldata[0] != $delete){ fwrite($fp,$delcon[$j]); }else{ fwrite($fp, ""); } } $lines = file($filename); foreach($lines as $line){ $contents = explode("<>",$line); $postnumber = $contents[0]; $fullnamer = $contents[1]; $commenter = $contents[2]; $dater = $contents[3]; echo $postnumber; echo $fullnamer; echo $commenter; echo $dater."<br>";} } ?>
</form>
</body>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/11/23 02:59

質問したい気持ちは良くわかりますが、大変読みづらいため回答がつきにくいかもしれません。コードの箇所を https://teratail.com/help/question-tips のMarkdownの使い方を参考に、ファイル単位に<code>で括ってファイル名も添えてください。日本語による説明も、改行を適切に加えて、段落を分けて、読みやすさを改善してくださるようお願いします。
morimoritamori

2020/11/23 03:42

ご指摘ありがとうございます。 この掲示板を使うのにも慣れておらず不快にさせてしまい申し訳ありません。 今一度自分の中で何がわかっていないか、回答してもらうためにはどのような情報が必要かを考え直し、これからは質問していきたいと思います。 この度は、ご回答、ご指摘、そして時間をとっていただきありがとうございました。
takasima20

2020/11/23 04:39

max に与える前に投稿番号だけにしないとまずいんじゃ? 今は投稿データ全部を与えてますよね。 さらにいうと、型を数値にしとかないと。 自分なら、現在の最大投稿番号をファイルでもつかなあ。
guest

回答1

0

掲示板データファイルの仕様がわからないため推測で助言します。

投稿番号って何でしょうか。
投稿を編集したり削除したりできるようですが、
編集によって、同じ投稿番号の投稿をフォーム受信した投稿内容で上書きするのは察しが付きますが、
削除した場合に欠番になるのか、最初から番号を振り直すのか、どちらの前提でいますか?

投稿番号を採番するのに、「投稿件数+1」を使ってしまうと、
例えば12345があって4が削除されると1235になり、投稿件数+1は5になるので
次の投稿は12355になって都合が悪いですね。

かと言って「最初から振り直す」と、
例えばAさんが3番を編集していて反映させる際に、
Bさんが2番を削除して投稿番号を振り直してしまうと
そもそもの3番が2番に繰り上がってしまいます。
もともと4番だったところに3番を更新しようとしたものが書き込まれてしまう可能性が出てきます。

こういう細かいことまで気にして、仕様を明確にして、
仕様をまっとうするように処理を作ることで初めて機能します。
なので、最初に戻って、
投稿番号って何でしょうか。
ここをしっかり考えてください。

投稿2020/11/23 03:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

morimoritamori

2020/11/23 03:26

回答ありがとうございます。 ご指摘の通り、投稿件数+1を使っているとうまく表示ができなかったため、投稿を 投稿番号<>名前<>コメント<>日時にわけ、それをexplodeで<>ごとに分割し、その配列の0番目を投稿番号としています。そしてその投稿番号を$postnumberとして、次の投稿番号を、それの最大値+1とすれば期待した動きになるのかと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問