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

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

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

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

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

HTML

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

Q&A

解決済

3回答

2936閲覧

phpの掲示板作成。postでの渡し方について。

yusuke_00

総合スコア20

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

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

HTML

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

0グッド

0クリップ

投稿2016/11/19 08:11

###前提・実現したいこと
前提

  • php7
  • apache
  • csv

掲示板を作成してるのですが、TextAreaに入力せずにも、更新毎に、前回書いたテキストが飛ばされてしまいます。
出力先は、csvで、追加していく形式です。

  • MVCを使っておらず、MVCを使って書く場合、どのあたりが、controllerなのでしょうか?
  • view(bulletin_board_top.html)に記述されています、phpは、別途で用意したほうが、良いのでしょうか?

また、こうした方が、良いなど、アドバイスを頂けると幸いです。

###view(bulletin_board_top.html)

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset="utf-8"> 5 <title>課題:掲示板</title> 6 </head> 7 <body> 8 <center> 9 <h1>課題:掲示板</h1> 10 </center> 11<?php 12echo "<center>"; 13echo "<table border=\"0\">"; 14 $ary = $_POST['records']; 15 foreach ($ary as $key => $value) { 16 echo "<tr>"; 17 echo "<td>No.</td>"; 18 echo "<td>".$ary[$key][0]."</td>"; 19 echo "<td>日時</td>"; 20 echo "<td>".$ary[$key][1]."</td>"; 21 echo "</tr>"; 22 echo "<tr>"; 23 echo "<td align=\"center\" colspan=\"4\">コメント</td>"; 24 echo "</tr>"; 25 echo "<tr>"; 26 echo "<td colspan=\"4\">".$ary[$key][2]."</td>"; 27 echo "</tr>"; 28 } 29echo "</table>"; 30echo "<center>"; 31?> 32<form action="BulletinBoard.php" method="post"> 33 <textarea name="comment" rows="8" cols="40"></textarea> 34 <input type="submit" name="submit" value="投稿"> 35</form> 36 37 </body> 38</html>

###BulletinBoard.php

php

1<?php 2date_default_timezone_set('Asia/Tokyo'); 3$filepath ="../csv/test.csv"; 4$file = new SplFileObject($filepath); 5$file->setFlags(SplFileObject::READ_CSV); 6$timestamp = time() ; 7$now_day = date("Y/m/d H:i:s",$timestamp); 8 9 10foreach ($file as $line) { 11 if (!is_null($line[0])) { 12 $records[] = $line; 13 $last_no = $line[0]; 14 } 15} 16 17if (isset($_POST['comment'])) { 18 $comment = $_POST['comment']; 19 $file = fopen("../csv/test.csv", "a"); 20 $c_records = array( 21 $last_no, 22 $now_day, 23 $comment 24 ); 25 if($file){ 26 var_dump(fputcsv($file, $c_records)); 27 } 28 fclose($file); 29}else{ 30 //エラー文言 31} 32 33$_POST['records'] = $records; 34include('../template/BulletinBoard/bulletin_board_top.html'); 35?>

###test.csv

1,"2016/11/19 16:01:20",コメント1 2,"2016/11/19 16:17:44",hoge2 3,"2016/11/19 16:18:18",hoge3

###補足情報(言語/FW/ツール等のバージョンなど)
php7.0.12

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

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

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

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

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

guest

回答3

0

ベストアンサー

POST処理を更新すると、再度POST処理が動くので、重複して投稿されると思います。
以下のようにfclose()後ぐらいで、リダイレクトすると解決するかもしれません。

php

1 fclose($file); 2 // 自分自身にリダイレクトすることで、更新で再投稿されないようにする 3 header('Location: BulletinBoard.php'); 4 exit();

また、データ書き込み処理より先にデータを読み込んでしまっているので、投稿した内容が表示されないのもよくないですね...処理順を逆にした方がいいでしょう。まぁリダイレクト入れたら問題なくなりますが。


MVCを使っておらず、MVCを使って書く場合、どのあたりが、controllerなのでしょうか?

BulletinBoard.phpをMとCでわけるなら...CSV操作している処理をModelに、それ以外のModelの実行やデータをViewに渡す処理をControllerにする感じですかね。無理にわけなくてもいいと思いますけど...
他にCSVを操作する別のPHPがあり、そっちからも共通のModelでデータ処理をやるなら分けるといいかもしれませんね

投稿2016/11/19 08:50

編集2016/11/19 08:51
popobot

総合スコア6586

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

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

yusuke_00

2016/11/20 07:15

icchii様 ご回答ありがとうございます。 ```php fclose($file); // 自分自身にリダイレクトすることで、更新で再投稿されないようにする header('Location: BulletinBoard.php'); exit(); ``` を入れた所 ``` Cannot modify header information - headers already sent by ``` を吐いてしまいました。調べたのですが、検討がつかなく、、、 また、foreachでの表示をcsv書き込み後の処理に変えたのですが、foreachで回してるのに関わらず、var_dumpで見ても、nullです。。。 また、postで送る際もundefineです。 ```php <?php date_default_timezone_set('Asia/Tokyo'); $filepath ="../csv/test.csv"; $file = new SplFileObject($filepath); $file->setFlags(SplFileObject::READ_CSV); $timestamp = time() ; $now_day = date("Y/m/d H:i:s",$timestamp); if (isset($_POST['comment'])) { $comment = $_POST['comment']; echo "入った"; $file = fopen("../csv/test.csv", "a"); $c_records = array( 1, $now_day, $comment ); fputcsv($file, $c_records); fclose($file); header('Location: BulletinBoard.php'); exit(); }else { echo "comment err"; } foreach ((array)$file as $line) { if (!is_null($line[0])) { $records[] = $line; } } $_POST['records'] = $records; include('../template/BulletinBoard/bulletin_board_top.html'); ?> ``` アドバイスいただけましたら幸いです。
yusuke_00

2016/11/20 07:55

ありがとうございます。熟読してみます。
yusuke_00

2016/11/20 08:04

やはり、echoが原因でした。ありがとうございます。
popobot

2016/11/20 08:17

toutouさん、コメントありがとうございます。 > また、foreachでの表示をcsv書き込み後の処理に変えたのですが、foreachで回してるのに関わらず、var_dumpで見ても、nullです。。。 ざっと見た感じだと、以下の処理も書き込み処理のあとにしないとだめかと $filepath ="../csv/test.csv"; $file = new SplFileObject($filepath); $file->setFlags(SplFileObject::READ_CSV);
yusuke_00

2016/11/20 08:41

icchii様 早速のご回答ありがとうございます。 無事、書き込み→csv開くの流れにしましたら、動くようになりました。 ありがとうございます。
guest

0

何も記述しないで、更新した場合も、postで飛ばされてしまします

そりゃそうです。それが正常な動作です。

これはPHPには全く関係なくHTML(というかブラウザ)の話になるかと思いますが、
textareaが空の状態でsubmitボタンを押せば、「textareaは空っぽ」という情報がpost送信されるので。

コメント未記入の場合にpostさせたくないのならば、
Javascriptを使ってsubmitボタンを非アクティブにするとか、何か工夫が必要です。

投稿2016/11/20 07:49

zico_teratail

総合スコア907

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

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

yusuke_00

2016/11/20 07:55

早速のご回答ありがとうございます。 textareaは空っぽという情報が、送信されるのではなく、前回記述した内容がまた同じく飛ばされてしまいます。もちろん、textareaには、何も入っていません。。
zico_teratail

2016/11/20 08:06

ああ、なるほど。 それにはまずicchiiさんがご指摘なさっているとおり、書き込み処理や読み込み処理の順番がまずい感じがしますね。 それと、全体的にやらなくていいことをやりまくっているというか、やろうとしてることは超単純なのになぜそんな複雑な作りにするの?っていうツッコミどころが多くて指摘しきれません。 もっとシンプルに、順番を意識して、ゼロから作り直してみたら? あとHTML部分とPHP部分は完全に分離したほうがわかりやすくなりバグも減ると思う。 HTMLとPHPが混在したものをさらにincludeするとか落とし穴しか見えない。
yusuke_00

2016/11/20 08:10

早速のご返信ありがとうございます。 そうなのですね。。 順番を変え、htmlから、phpを分離し、再度やってみたいと思います。 具体的にどのへんが、無駄でしょうか、、?timezoneのセットは、ちょっと色々とありまして、、
zico_teratail

2016/11/20 08:18

具体的にどこが無駄と言うか、全体的な構造がちょっと「?」な感じというか・・・ 強いて言えばPHPの最初の6行以外全部、ですかね。 そもそも何をやりたいのか、処理の流れをプログラムではなくまず「箇条書きの言葉」で書くと自分も分かりやすいし、質問時にも回答者に対して親切かと思います。 現在のソースを見ても、「結局何がしたいんだろう? 何が目的でこうしたんだろう?」って思う部分が散見されます。
yusuke_00

2016/11/20 08:35

zico_teratail様 ありがとうございます。 試行錯誤してみたいと思います!
guest

0

コメントが記入されているかどうかを判別するのに

php

1isset($_POST['comment'])

というやり方では思ったとおりにならずにハマることがよくありますので薦めません。
issetではなくてstrlenなどで文字数が1以上かどうかを調べるとかが簡単なのでは。

それと

前回書いたテキストが飛ばされてしまいます。

の意味がわかりません。
飛ばされる=CSVに出力したものが上書きされる、という意味ですか?

投稿2016/11/20 07:38

zico_teratail

総合スコア907

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

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

yusuke_00

2016/11/20 07:42

zico_teratail様 ご回答ありがとうございます。 非常によいアドバイスありがとうございます。 strlenでやってみたいと思います。 前回htmlのtextareaに入力し、postで飛ばした内容が、何も記述しないで、更新した場合も、postで飛ばされてしまします。 説明不足で申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問