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

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

ただいまの
回答率

89.12%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,342

yusuke_00

score 20

前提・実現したいこと

前提

  • php7
  • apache
  • csv

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

  • MVCを使っておらず、MVCを使って書く場合、どのあたりが、controllerなのでしょうか?
  • view(bulletin_board_top.html)に記述されています、phpは、別途で用意したほうが、良いのでしょうか?
    また、こうした方が、良いなど、アドバイスを頂けると幸いです。

view(bulletin_board_top.html)

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>課題:掲示板</title>
  </head>
  <body>
    <center>
      <h1>課題:掲示板</h1>
    </center>
<?php
echo "<center>";
echo "<table border=\"0\">";
  $ary = $_POST['records'];
  foreach ($ary as $key => $value) {
    echo "<tr>";
      echo "<td>No.</td>";
      echo "<td>".$ary[$key][0]."</td>";
      echo "<td>日時</td>";
      echo "<td>".$ary[$key][1]."</td>";
    echo "</tr>";
    echo "<tr>";
      echo "<td align=\"center\" colspan=\"4\">コメント</td>";
    echo "</tr>";
    echo "<tr>";
      echo "<td colspan=\"4\">".$ary[$key][2]."</td>";
    echo "</tr>";
  }
echo "</table>";
echo "<center>";
?>
<form action="BulletinBoard.php" method="post">
  <textarea name="comment" rows="8" cols="40"></textarea>
  <input type="submit" name="submit" value="投稿">
</form>

  </body>
</html>

BulletinBoard.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);


foreach ($file as $line) {
  if (!is_null($line[0])) {
    $records[] = $line;
    $last_no = $line[0];
  }
}

if (isset($_POST['comment'])) {
  $comment = $_POST['comment'];
  $file = fopen("../csv/test.csv", "a");
  $c_records = array(
    $last_no,
    $now_day,
    $comment
  );
  if($file){
    var_dump(fputcsv($file, $c_records));
  }
  fclose($file);
}else{
 //エラー文言
}

$_POST['records'] = $records;
include('../template/BulletinBoard/bulletin_board_top.html');
?>

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

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

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


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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/20 17:04

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

    キャンセル

  • 2016/11/20 17:17

    toutouさん、コメントありがとうございます。

    > また、foreachでの表示をcsv書き込み後の処理に変えたのですが、foreachで回してるのに関わらず、var_dumpで見ても、nullです。。。

    ざっと見た感じだと、以下の処理も書き込み処理のあとにしないとだめかと
    $filepath ="../csv/test.csv";
    $file = new SplFileObject($filepath);
    $file->setFlags(SplFileObject::READ_CSV);

    キャンセル

  • 2016/11/20 17:41

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

    キャンセル

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/20 17:10

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

    キャンセル

  • 2016/11/20 17:18

    具体的にどこが無駄と言うか、全体的な構造がちょっと「?」な感じというか・・・
    強いて言えばPHPの最初の6行以外全部、ですかね。

    そもそも何をやりたいのか、処理の流れをプログラムではなくまず「箇条書きの言葉」で書くと自分も分かりやすいし、質問時にも回答者に対して親切かと思います。
    現在のソースを見ても、「結局何がしたいんだろう? 何が目的でこうしたんだろう?」って思う部分が散見されます。

    キャンセル

  • 2016/11/20 17:35

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

    キャンセル

-1

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

isset($_POST['comment'])


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

それと

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/20 16:42

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

    説明不足で申し訳ございません。

    キャンセル

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

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る