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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2757閲覧

PHP簡易掲示板にて最新投稿がechoで表示されない。

mo__fumi

総合スコア13

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/02/21 10:11

前提・実現したいこと

HTML,PHPを使用し簡易掲示板を作成しています。
bbs.phpで入力フォームに書いたものが、bbs.txtに保存され、さらに入力フォームの下に投稿したものが順番に表示される(古いものが上で新しいものは下にくる)という掲示板です。

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

bbs.txt内では最新の投稿が表示されているのですが、なぜかブラウザ上(bbs.php上?)では最新の投稿が表示されません。 参考画像: https://gyazo.com/d62d40eb705315823654aaceef77aa23 つまり、最初の「投稿1」を送信した時点では、フォームの下には何も表示されていない状態になります。

該当のソースコード

html

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="utf-8"> 5</head> 6 7<body> 8 <form action="bbs.php" method="post"> 9 User Name: <input type="text" name="userName"><br> 10 Comment: <input type="text" name="comment"><br> 11 <input type="submit"> 12 </form> 13 14</body> 15</html>

php

1 <?php 2 $fileName = "bbs.txt"; 3 $file = file($fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 4 5 foreach ( $file as $value ) { 6 $line = explode("<>", $value); 7 echo $value."<br />\n"; 8 } 9 10 $num = sizeof($file) + 1; 11 $userName = $_POST["userName"]; 12 $comment = $_POST["comment"]; 13 $time = date("Y/m/d"); 14 $write = $num. "<>". $userName. "<>". $comment. "<>". $time. "\n"; 15 16 $fp = fopen($fileName, "a"); 17 flock ($fp, LOCK_EX); 18 fwrite($fp, $write); 19 flock ($fp, LOCK_UN); 20 fclose($fp); 21 ?>

試したこと

理由が全くわからず、調べても該当するものを見つけることができなかったため、コードの順番が悪いのかと思いforeachを一番下に書いてみたり、echoではなくprintで表示してみたり、echo $valueではなくecho $writeと書いてみたり色々悪あがきをしてみたのですが改善しませんでした。

どなたかご教示宜しくお願いいたします。

補足情報(FW/ツールのバージョンなど)

MAMPを使いローカル環境で開発しています。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/02/21 11:06

余談だけど、投稿に「<>」とか、改行コードとか含んだら、破綻すると思う。
mo__fumi

2019/02/21 14:39

ご指摘ありがとうございます!こちらこういう課題でして、書き方は課題に沿って書きましたので、またメンターに聞いてみます^^;
guest

回答2

0

ベストアンサー

ファイルに書き込む前にechoしているのが原因なので順番を変えます。

php

1<?php 2 $fileName = "bbs.txt"; 3 $file = file($fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 4 5 $num = sizeof($file) + 1; 6 $userName = $_POST["userName"]; 7 $comment = $_POST["comment"]; 8 $time = date("Y/m/d"); 9 $write = $num. "<>". $userName. "<>". $comment. "<>". $time. "\n"; 10 11 $fp = fopen($fileName, "a"); 12 flock ($fp, LOCK_EX); 13 fwrite($fp, $write); 14 flock ($fp, LOCK_UN); 15 fclose($fp); 16 17 // $fileを再度読み込んでからecho 18 $file = file($fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 19 foreach ( $file as $value ) { 20 $line = explode("<>", $value); 21 echo $value."<br />\n"; 22 }

上記では手を加えていませんが、$_POSTで送信されてきた値をそのまま保存したり別の処理に使用したりするのは危険なので、必ずバリデーションや整形処理を行ってからされることをお勧めします。

投稿2019/02/21 10:33

cerfweb

総合スコア1899

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

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

mo__fumi

2019/02/21 11:00

ご回答ありがとうございます! $fileを再度読み込むという部分は目からウロコでした。JSを書いている際に同じものは何回も書かないほうがいいと教えられてきたのでついその癖で思い込みを・・・時と場合によるのですね。 また更なる改善点もご教示いただき感謝いたします。現状私の知識ではあまり理解できませんでした・・・しかしこの掲示板はまだまだ実装途中ですので仰って頂いたことも調べつつ進めていきます、ありがとうございました^^
guest

0

書き込んだ直後の表示バグと思いますが、
読み込んでから書き込んでるのが問題です

具体的にコメント記載しておきます
解決策は、書き込もうとしてる内容もechoすることかな

php

1 <?php 2 // ここでbbs.txtを読み込んでるので今投稿された内容は読み込まない 3 $fileName = "bbs.txt"; 4 $file = file($fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 5 6 foreach ( $file as $value ) { 7 $line = explode("<>", $value); 8 echo $value."<br />\n"; 9 } 10 11 // ここでbbs.txtに反映してる(ので投稿しようとしてるのはechoされない) 12 $num = sizeof($file) + 1; 13 $userName = $_POST["userName"]; 14 $comment = $_POST["comment"]; 15 $time = date("Y/m/d"); 16 $write = $num. "<>". $userName. "<>". $comment. "<>". $time. "\n"; 17 18 $fp = fopen($fileName, "a"); 19 flock ($fp, LOCK_EX); 20 fwrite($fp, $write); 21 flock ($fp, LOCK_UN); 22 fclose($fp);

投稿2019/02/21 10:20

rururu3

総合スコア5545

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

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

mo__fumi

2019/02/21 10:56

ご回答ありがとうございます! なるほど、やはり`foreach`は一番下に書くべきだったのですね。 確かに、全て読み込んでからechoしないと表示されませんよね・・・今後気をつけます。 私の知識不足で「書き込もうとしてる内容もechoする」の書き方がわからなかったのですが、もう一人の回答者cerfwebさんが実装してくださったものをみて理解できました^^; しかし、ヒントという形で示してくださりありがとうございました。もっと勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問