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

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

ただいまの
回答率

88.77%

php掲示板作成について。

解決済

回答 2

投稿 編集

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

yusuke_00

score 20

前提・実現したいこと

  • php7.0.12にて、掲示板作成をしてる
  • 出力先はcsvである。
  • コメントを未入力の場合のエラー表示が何故か出来ない。コメント入力してもechoでエラーを表示してしまう。
  • csvにて、最後尾のnoというカラムの取得について、いまいちわからない。
  • 現在、以下の3ファイルから構成している。
    ・BulletinBoard.php(csvを操作する)
    ・controller.php(BulletinBoard.phpから受け取った値をhtmlに出力)
    ・bulletin_board_top.html(view)

BulletinBoard.php

<?php
date_default_timezone_set('Asia/Tokyo');
$timestamp = time() ;
$now_day = date("Y/m/d H:i:s",$timestamp);

// 書き込み
if (isset($_POST['comment'])) {
  $comment = $_POST['comment'];
  $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 {
}

// csv表示
$filepath ="../csv/test.csv";
$file = new SplFileObject($filepath);
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $line) {
  if (!is_null($line[0])) {
    $records[] = $line;
  }
}
if (isset($records)) {
  $_POST['records'] = $records;
}

$err_msg = (isset($comment)) ? true : false;
$_POST['err_msg'] = $err_msg;
include('../template/BulletinBoard/bulletin_board_top.html');
?>

controller.php

<?php
if (isset($_POST['records'])) {
  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>";
}

if (isset($err_msg)) {
  $err_msg = $_POST['err_msg'];
  if ($err_msg == true) {
    echo "";
  }else {
    echo "コメントを入力してください。";
  }
}
?>

bulletin_board_top.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>課題:掲示板</title>
  </head>
  <body>
    <center>
      <h1>課題:掲示板</h1>
      <?php include("../lib/controller/controller.php"); ?>
      <form action="BulletinBoard.php" method="post">
        <textarea name="comment" rows="8" cols="40"></textarea>
        <input type="submit" name="submit" value="投稿">
      </form>
    </center>
  </body>
</html>
test.csv
1,"2016/11/20 22:26:51",コメント1
1,"2016/11/20 22:40:49",コメント2
1,"2016/11/20 22:42:12",コメント3
1,"2016/11/20 22:42:16",コメント4

試したこと

BulletinBoard.phpにあります、書き込みの処理の時issetでコメントが入ってるか、どうかを判断する際

if(isset($_POST['comment']){
省略
  $err = "";
  $_POST['err'] = $err;
}else{
  $err = "コメントを入力してください";
  $_POST['err'] = $err;
}


をし、controllerのほうで、errをうけとり、表示したのですが、comment入力した際も、"コメントを入力してください"と出てしまう。
同じく、boolean型で処理し、controllerで処理するも、同じ結果に。

また、コメント書き込みの際に、noのカラムの最終番号を取得し、最終番号+1し、csvに追加していきたいのですが、良い方法が思いつきません。アドバイスをください。
以前
BulletinBoard.phpでの処理の流れを
ファイル読み取り→書き込み。としていて、ファイル読み取りの際、ラストnoを取得出来たのですが、
今回
書き込み→ファイル読み取り。の流れにしましたので、悩んでおります。

ご指導賜り願います。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+6

どうもこんにちは。

ここから回答

エラーを出したくないのに出てしまい、コメントが未入力でも書き込みがされてしまう。
そんなときに疑わなければならないのは書き込み処理を行っているところです。
というわけで書き込み処理がされている場所を見てみると

if (isset($_POST['comment'])) {
  $comment = $_POST['comment'];
  $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 {
}


このようになっています。
ここに入力チェックの処理がかけていることが今回のなぞのエラーメッセージの原因だと思われます。
そこで、こんな感じにすると、うまく入力チェックができると思います。

BulletinBoard.php

<?php
date_default_timezone_set('Asia/Tokyo');
$timestamp = time();
$now_day = date("Y/m/d H:i:s", $timestamp);

$err_msg = "";//エラーメッセージを格納する変数を定義

function isEmpty($msg)
{//内容が未入力かチェックする関数
    if (!is_array($msg)) {
        return (trim($msg) == '') ? false : true;
    } else {
        return (!empty($msg));
    }
}

// 書き込み
if (isset($_POST['comment'])) {
    $comment = $_POST['comment'];
    if (isEmpty($comment)) {
        $file = fopen("test.csv", "a");
        $c_records = array(
            1,
            $now_day,
            $comment
        );
        fputcsv($file, $c_records);
        fclose($file);
        header("Location: BulletinBoard.php");
        exit();
    } else {
        $err_msg = "内容が未入力です";//内容が未入力だったので、エラーメッセージを格納
    }
}

// csv表示
$filepath = "test.csv";
$file = new SplFileObject($filepath);
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $line) {
    if (!is_null($line[0])) {
        $records[] = $line;
    }
}
if (isset($records)) {
    $_POST['records'] = $records;
}

//下の3行はよくわからないのでコメントアウト
//$err_msg = (isset($comment)) ? true : false;
//$_POST['err_msg'] = $err_msg;
//include('bulletin_board_top.php');
?>

controller.php

<?php
if (isset($_POST['records'])) {
    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>";
/*
これも不要なのでコメントアウト
if (isset($err_msg)) {
    if ($err_msg == true) {
        echo "";
    } else {
        echo "コメントを入力してください。";
    }
}
*/
}

bulletin_board_top.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>課題:掲示板</title>
</head>
<body>
<center>
    <h1>課題:掲示板</h1>
    <?php include("controller.php"); ?>
    <form action="BulletinBoard.php" method="post">
        <p><?php echo $err_msg; ?></p><!-- ここでエラーメッセージを表示 -->
        <textarea name="comment" rows="8" cols="40"></textarea>
        <input type="submit" name="submit" value="投稿">
    </form>
</center>
</body>
</html>


試したことにある以下のコードですが、$_POSTなどのスーパーグローバル変数と呼ばれる特別な変数に値を代入することはしてはいけない行為です。

if(isset($_POST['comment']){
省略
  $err = "";
  $_POST['err'] = $err;
}else{
  $err = "コメントを入力してください";
  $_POST['err'] = $err;
}


間違っている箇所やわからないところがあるときは、コメントでお知らせください。
以上、ありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/21 02:23

    cae様
    こんな夜遅くに、非常に丁寧な回答心より感謝します。

    BulletinBoard.phpを実行する際、controllerをincludeしてないので、何も表示しません。。。
    まず、BulletinBoard.phpを実行することが、間違っていたのでしょうか、、?

    また、BulletinBoard.phpが、csvファイルから読み込み、$_POST['records']に代入するのは、なぜ良いのでしょう?
    こちらも、スーパーグローバル変数では。。?
    質問が多く申し訳ございません。
    ご教授賜り願います。

    キャンセル

  • 2016/11/21 02:34

    連投失礼します。
    BulletinBoard.phpにinclude入れたら、無事動きました。
    非常に助かりました。まだまだ勉強不足なので、これからも頑張りたいと思います。

    夜遅くにありがとうございました。
    では、失礼します。

    キャンセル

+1

// 「試したこと」の部分
// ]else{
// ↓
   }else{

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/20 23:47 編集

    早速のご返信ありがとうございます。
    では、
    BulletinBoard.phpで
    $_POST['err'] = "コメントしてください";
    の方が良いのでしょうか?

    この送られた'err'は、controller.phpにて、受け取り、
    ```php
    if(isset($_POST['err']){
    $err_msg = $_POST['err'];
    echo $err_msg;
    }
    ```
    と、行っておりました。

    キャンセル

  • 2016/11/20 23:49

    $_POSTに代入というのは行わないことが多いと思います。

    キャンセル

  • 2016/11/20 23:57

    なるほど、そういう事でしたか。
    少し、データの受け渡しについて、調べてみます。

    キャンセル

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

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

関連した質問

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