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

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

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

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

HTML

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

Q&A

解決済

2回答

1053閲覧

php,htmlを用いて簡易掲示板を作成したいです

chimo

総合スコア55

PHP

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

HTML

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

0グッド

0クリップ

投稿2020/05/04 02:08

【やりたいこと】
①フォームの作成
②フォームから受け取ったデータをtxtファイルに表示させる
③txtファイルを読みこみ、値を変数に格納
④↑の変数を受け取り、フォームの下に表示

上記を実行すべく以下のようなコードをかきましたが、いくつか問題点が...

php

1<?php 2 3// メッセージを保存するファイルのパス設定 4define( 'FILENAME', './kadai_2_02.txt'); 5 6// タイムゾーン設定 7date_default_timezone_set('Asia/Osaka'); 8 9// 変数の初期化 10$now_date = null; 11$data = null; 12$file_handle = null; 13$split_data = null; 14$message = array(); 15$message_array = array(); 16 17//-------テキストファイルにデータを書き込む-------- 18 19if(file_exists(FILENAME)){ 20 $num = count(file(FILENAME)) + 1; //$num = count(file(FILENAME))でファイルの行数をカウントできる 21}else{ 22 $num = 1; 23} 24 25if( !empty($_POST['btn_submit']) ) { 26 27 if( $file_handle = fopen( FILENAME, "a") ) { //fopen関数で指定したファイルを開く 28 // タイムスタンプ 29 $now_date = date("Y-m-d H:i:s"); 30 31 // 書き込むデータを作成 32 $data = $num."<>".$_POST['view_name']."<>".$_POST['message']."<>".$now_date."\n"; 33 34 // 書き込み 35 fwrite( $file_handle, $data); //file_handleは書き込む対象となるファイル(●●.txt)を判別するためのパラメータ 36 37 // ファイルを閉じる 38 fclose( $file_handle); 39 } 40} 41 42//-------テキストファイルのデータを掲示板のフォーム下に表示-------- 43 44if( $file_handle = fopen( FILENAME,'r') ) { 45 46 while( $data = fgets($file_handle) ){ //fgets関数でファイルからデータを一行ずつ全て取得 47 48 //preg_split関数で文字列を特定の文字で分割する: 49 $split_data = explode(",",$data); 50 51 $message = array( 52 'view_name' => $split_data[2], 53 'message' => $split_data[4], 54 'post_date' => $split_data[6] 55 ); 56 array_unshift( $message_array, $message); 57 } 58 59 // ファイルを閉じる 60 fclose( $file_handle); 61} 62 63?> 64 65<!DOCTYPE html> 66<html lang="ja"> 67<head> 68<meta charset="utf-8"> 69<title>簡易掲示板</title> 70</head> 71 72<body> 73<h2>簡易掲示板(^-^*)</h2> 74 <form method="post"> 75 <div> 76 <label for="view_name">名前</label> 77 <input id="view_name" type="text" name="view_name" value=""> 78 </div> 79 <div> 80 <label for="message">メッセージ</label> 81 <textarea id="message" name="message"></textarea> 82 </div> 83 <input type="submit" name="btn_submit" value="書き込む"> 84 </form> 85<hr> 86<section> 87<?php if( !empty($message_array) ): ?> 88<?php foreach( $message_array as $value ): ?> 89<article> 90 <div class="info"> 91 <h2><?php echo $value['view_name']; ?></h2> 92 <time><?php echo date('Y年m月d日 H:i', strtotime($value['post_date'])); ?></time> 93 </div> 94 <p><?php echo $value['message']; ?></p> 95</article> 96<?php endforeach; ?> 97<?php endif; ?> 98</section> 99 100</body> 101</html>

【問題①】
上記のコードを実行すると
回答フォームのしたに「1970年01月01日 09:00」と表示されます。
しかし、テキストファイルにはきちんと投稿された時間と日時にタイムスタンプが表示されています。
なぜ「1970年01月01日 09:00」になるのでしょう???

【問題②】
メッセージフォームの上に以下のようなエラーが表示されます。

Notice: date_default_timezone_set(): Timezone ID 'Asia/Osaka' is invalid in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_01.php on line 7 Notice: Undefined offset: 2 in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_01.php on line 52 Notice: Undefined offset: 4 in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_01.php on line 53

おそらくhtmlコードの前にphpコードを書いているからかなとおもうのですが、htmlファイルにhtmlに関するコードを書いてphpファイルにphpに関するコードを書いて分けようとすると、phpファイルにおいてテキストファイルの内容を読み込んだ後その値を配列として変数に格納し、その変数をhtmlファイル側で使えなくなってしまう、つまり、アンケートフォームの下にコメントや名前、タイムスタンプを表示できなくなってしまいます。どのような順序でコーディングすればよいでしょうか?

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

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

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

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

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

guest

回答2

0

そもそも論、テキストにデータを保存するやり方は覚えたとしても何の役にも立たないので、「そういう操作の練習」をしているのでなければ、はじめからデータベースを採用してください。
処理が煩雑になるだけで、管理面にも難があり、良いところは皆無です。

投稿2020/05/04 02:21

m.ts10806

総合スコア80850

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

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

chimo

2020/05/04 02:25

現段階としてはそういう操作の練習です。後々MySQLを使用しますが今はそうできません。
m.ts10806

2020/05/04 05:46

んー。練習したとして役に立つ場面はないんですけどね。 ここで時間使うくらいならDBにしたほうが良いです。 DBもMySQLだけではないですし。
chimo

2020/05/04 14:32

それは重々承知ですし、私もそのようにした方がよいのではないかと一番初めの段階で提言したのですが、自分にとって少々やりにくい方法でも現場では目標を達成しなければいけないので、頑張りなさいとのことでした。課題通りに進めないと次のステップへ行けませんので非常に回りくどいですがテキストファイルを使用して掲示板をつくる⇒MySQLを用いて同じことを行う、で行きたいと思います...^-^;;;
m.ts10806

2020/05/04 14:41 編集

んー。「現場で」ならテキストにデータを保存する形式の課題を出すこと自体、かなり無駄な時間になると思います(実用的ではない)。10年くらい前で時間が止まってないですかね。まだJavaの基礎とかやったほうが役立つ場面は多いのではと。
chimo

2020/05/04 14:42

うーん。しかし今回はjavaを自分のペースで独学している時とは違って、企業のインターンに参加している形式ですので、従うしかないです^-^;;;
m.ts10806

2020/05/04 14:44

悩みますね。私なら「これ実務でどう活かせるんですか」って必ず確認すると思います。 もし自身でJavaの経験があるなら尚更ですね。 「PHPはこういうもの」って理解してしまう人がでると企業としても良くないはずなんですが。
m.ts10806

2020/05/04 14:45

それに、インターンで出てるなら先輩社員とかに聴くのが筋かと思います。 休みの質問受付窓口とかはないですか?
chimo

2020/05/04 14:50

窓口はありますし、質問はなるべくそこにするようにはしていますが、質問したい内容が煩雑になったときになかなか伝えにくいです。直接会ったりはできないので。teratailではソースコードを載せられるので、こちらでも質問させてもっらているという感じです...
m.ts10806

2020/05/04 14:54

teratailのほうが厳しい部分はありますよ。 相手は前提や背景を全く知らない赤の他人ですからね。 「そもそもなぜテキストに保存してるの?」というところから入らざるを得ません。(そして古い書籍を利用したそういう投稿が後を絶たないのを見てきている) 出題者には出題者の意図があります。 個人的には、 >自分にとって少々やりにくい方法でも現場では目標を達成しなければいけない は間違いだと思っています。指示者だとしたら特にですね。 実用的ではない、望まれない実装を教えても現場で使えない人材が量産されるだけなので、結果的に「目標達成」には至れないわけですから。 もちろん1つの目標を達成するための手段は1つではないですが、古い実装をしているなら話は別です。 XSSなどの最低限の対策もされてないようですし。
chimo

2020/05/04 14:57

そうですね...。ご意見ありがとうございます。見飽きるような質問してしまい申し訳ないです。
m.ts10806

2020/05/04 15:04

多くの質問者は自分の問題だけ見てるので、そこは仕方ない部分はあると思いますので謝る必要はないと思います。 ですが、「今直面している問題は世界ではじめて自身がぶちあたったか?」というのは考えてもらいたいと思ってます。 確かに「作りたいものをそのまま作ってる人」はいないでしょうけど、個々の問題については基本的に出尽くしているはずのものですからね。 エラーが出たらエラーを読み、ロジックが通らなければデバッグをし、機能が分からなければドキュメントを読む この3つさえ徹底すれば入門時期の問題のほとんどは質問しなくても解決できるものです。
guest

0

ベストアンサー

【問題1】
書き込むときには'<>' で分割しているのに読み込むときに ',' で分割しようとしています。なので意図しない値が入っています。

以下、該当部分の修正案です。

php

1 //preg_split関数で文字列を特定の文字で分割する: 2 $split_data = explode("<>",$data); 3 4 $message = array( 5 'view_name' => $split_data[1], 6 'message' => $split_data[2], 7 'post_date' => $split_data[3] 8 );

おかしいなと思うときは、

<?php echo $value['post_date']; ?>

みたいにデバッグプリントを出してみてください。

【問題2】

'Asia/Osaka' は、タイムゾーンとしてサポートされていないので 'Asia/Tokyo' に変更してください。

PHP: サポートされるタイムゾーンのリスト - Manual

なお、それ以下の原因は、問題1と同じです。

投稿2020/05/04 02:13

編集2020/05/04 02:48
Yasumichi

総合スコア1773

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

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

chimo

2020/05/04 04:18

うまくいきました!!本当にありがとうございます!一点だけ質問よろしいでしょうか?私的には、「番号、<>、名前、<>...」と分解されて配列としては[0]=番号、[1]=<>、[2]=名前、[3]=<>...って感じで割り振られると思ってたんですが、なぜ[1]=名前、[2]=メッセージ、[3]=投稿時間、で上手く動いたのでしょう?
Yasumichi

2020/05/04 04:20

explode("<>",$data) としてるので "<>" は区切り文字として認識されているので配列には展開されません。 この説明でご理解いただけますでしょうか。
chimo

2020/05/04 14:33

なるほど!そういうことでしたか!!完全に理解ができました!本当に助かりました!!有難うございました!!*^-^*
Yasumichi

2020/05/04 14:34

伝わって良かったです。今後ともよろしくお願いいたします。
chimo

2020/05/04 14:36

こちらこそ、宜しくお願い致します!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問