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

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

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

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

HTML

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

Q&A

解決済

2回答

2679閲覧

php掲示板作成について。

yusuke_00

総合スコア20

PHP

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

HTML

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

0グッド

0クリップ

投稿2016/11/20 14:22

編集2016/11/20 14:34

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

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

・BulletinBoard.php(csvを操作する)
・controller.php(BulletinBoard.phpから受け取った値をhtmlに出力)
・bulletin_board_top.html(view)

####BulletinBoard.php

php

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

####controller.php

php

1<?php 2if (isset($_POST['records'])) { 3 echo "<center>"; 4 echo "<table border=\"0\">"; 5 $ary = $_POST['records']; 6 foreach ($ary as $key => $value) { 7 echo "<tr>"; 8 echo "<td>No.</td>"; 9 echo "<td>".$ary[$key][0]."</td>"; 10 echo "<td>日時</td>"; 11 echo "<td>".$ary[$key][1]."</td>"; 12 echo "</tr>"; 13 echo "<tr>"; 14 echo "<td align=\"center\" colspan=\"4\">コメント</td>"; 15 echo "</tr>"; 16 echo "<tr>"; 17 echo "<td colspan=\"4\">".$ary[$key][2]."</td>"; 18 echo "</tr>"; 19 } 20 echo "</table>"; 21 echo "<center>"; 22} 23 24if (isset($err_msg)) { 25 $err_msg = $_POST['err_msg']; 26 if ($err_msg == true) { 27 echo ""; 28 }else { 29 echo "コメントを入力してください。"; 30 } 31} 32?>

####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 <?php include("../lib/controller/controller.php"); ?> 11 <form action="BulletinBoard.php" method="post"> 12 <textarea name="comment" rows="8" cols="40"></textarea> 13 <input type="submit" name="submit" value="投稿"> 14 </form> 15 </center> 16 </body> 17</html>

#####test.csv

csv

11,"2016/11/20 22:26:51",コメント1 21,"2016/11/20 22:40:49",コメント2 31,"2016/11/20 22:42:12",コメント3 41,"2016/11/20 22:42:16",コメント4

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

php

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

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

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

ご指導賜り願います。

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

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

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

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

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

guest

回答2

0

ベストアンサー

どうもこんにちは。
ここから回答

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

PHP

1if (isset($_POST['comment'])) { 2 $comment = $_POST['comment']; 3 $file = fopen("../csv/test.csv", "a"); 4 $c_records = array( 5 1, 6 $now_day, 7 $comment 8 ); 9 fputcsv($file,$c_records); 10 fclose($file); 11 header("Location:BulletinBoard.php"); 12 exit(); 13}else { 14}

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

BulletinBoard.php

PHP

1<?php 2date_default_timezone_set('Asia/Tokyo'); 3$timestamp = time(); 4$now_day = date("Y/m/d H:i:s", $timestamp); 5 6$err_msg = "";//エラーメッセージを格納する変数を定義 7 8function isEmpty($msg) 9{//内容が未入力かチェックする関数 10 if (!is_array($msg)) { 11 return (trim($msg) == '') ? false : true; 12 } else { 13 return (!empty($msg)); 14 } 15} 16 17// 書き込み 18if (isset($_POST['comment'])) { 19 $comment = $_POST['comment']; 20 if (isEmpty($comment)) { 21 $file = fopen("test.csv", "a"); 22 $c_records = array( 23 1, 24 $now_day, 25 $comment 26 ); 27 fputcsv($file, $c_records); 28 fclose($file); 29 header("Location: BulletinBoard.php"); 30 exit(); 31 } else { 32 $err_msg = "内容が未入力です";//内容が未入力だったので、エラーメッセージを格納 33 } 34} 35 36// csv表示 37$filepath = "test.csv"; 38$file = new SplFileObject($filepath); 39$file->setFlags(SplFileObject::READ_CSV); 40foreach ($file as $line) { 41 if (!is_null($line[0])) { 42 $records[] = $line; 43 } 44} 45if (isset($records)) { 46 $_POST['records'] = $records; 47} 48 49//下の3行はよくわからないのでコメントアウト 50//$err_msg = (isset($comment)) ? true : false; 51//$_POST['err_msg'] = $err_msg; 52//include('bulletin_board_top.php'); 53?>

controller.php

PHP

1<?php 2if (isset($_POST['records'])) { 3 echo "<center>"; 4 echo "<table border=\"0\">"; 5 $ary = $_POST['records']; 6 foreach ($ary as $key => $value) { 7 echo "<tr>"; 8 echo "<td>No.</td>"; 9 echo "<td>" . $ary[$key][0] . "</td>"; 10 echo "<td>日時</td>"; 11 echo "<td>" . $ary[$key][1] . "</td>"; 12 echo "</tr>"; 13 echo "<tr>"; 14 echo "<td align=\"center\" colspan=\"4\">コメント</td>"; 15 echo "</tr>"; 16 echo "<tr>"; 17 echo "<td colspan=\"4\">" . $ary[$key][2] . "</td>"; 18 echo "</tr>"; 19 } 20 echo "</table>"; 21 echo "<center>"; 22/* 23これも不要なのでコメントアウト 24if (isset($err_msg)) { 25 if ($err_msg == true) { 26 echo ""; 27 } else { 28 echo "コメントを入力してください。"; 29 } 30} 31*/ 32}

bulletin_board_top.php

PHP

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 <?php include("controller.php"); ?> 11 <form action="BulletinBoard.php" method="post"> 12 <p><?php echo $err_msg; ?></p><!-- ここでエラーメッセージを表示 --> 13 <textarea name="comment" rows="8" cols="40"></textarea> 14 <input type="submit" name="submit" value="投稿"> 15 </form> 16</center> 17</body> 18</html>

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

PHP

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

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

投稿2016/11/20 16:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yusuke_00

2016/11/20 17:23

cae様 こんな夜遅くに、非常に丁寧な回答心より感謝します。 BulletinBoard.phpを実行する際、controllerをincludeしてないので、何も表示しません。。。 まず、BulletinBoard.phpを実行することが、間違っていたのでしょうか、、? また、BulletinBoard.phpが、csvファイルから読み込み、$_POST['records']に代入するのは、なぜ良いのでしょう? こちらも、スーパーグローバル変数では。。? 質問が多く申し訳ございません。 ご教授賜り願います。
yusuke_00

2016/11/20 17:34

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

0

PHP

1// 「試したこと」の部分 2// ]else{ 3// ↓ 4 }else{ 5

投稿2016/11/20 14:32

kei344

総合スコア69400

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

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

yusuke_00

2016/11/20 14:35

早速のご回答ありがとうございます。 こちらの試したことの部分、直ガキで書いた為、入力ミスしてしましました。 誤解を招く、内容で申し訳ございません。 実際行った際は、問題ありませんでした。
kei344

2016/11/20 14:40

$_POST['err'] = $err; は何をしていて、何処に配置されるのかがわかりません。また、$_POSTに代入というのは行わないことが多いと思います。
yusuke_00

2016/11/20 14:49 編集

早速のご返信ありがとうございます。 では、 BulletinBoard.phpで $_POST['err'] = "コメントしてください"; の方が良いのでしょうか? この送られた'err'は、controller.phpにて、受け取り、 ```php if(isset($_POST['err']){ $err_msg = $_POST['err']; echo $err_msg; } ``` と、行っておりました。
kei344

2016/11/20 14:49

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

2016/11/20 14:57

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問