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

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

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

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

Q&A

解決済

3回答

2507閲覧

PHP投稿日時がでない

xyg000

総合スコア7

PHP

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

0グッド

0クリップ

投稿2016/11/08 04:31

編集2016/11/08 04:38

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

###発生している問題・エラーメッセージ

投稿日時がでないです。

###該当のソースコード

<html> <head><title>#</title></head> <body> <p>test</p> <form method=`POST` action=`<?php print($_SERVER['PHP_SELF']) ?>`> <input type=`text` name=`personal_name`><br><br> <textarea name=`contents` rows=`8` cols=`40`> </textarea><br><br> <input type=`submit` name=`btn1` value=`投稿する`> </form> <?php if($_SERVER[`REQUEST_METHOD`] == `POST`){ writeData(); } readData(); function readData(){ $keijban_file = 'keijiban.txt'; $fp = fopen($keijban_file, 'rb'); $date = `$year年$mon月$day日($week) $hour時$min分$sec秒`; if ($fp){ if (flock($fp, LOCK_SH)){ while (!feof($fp)) { $buffer = fgets($fp); print($buffer); } flock($fp, LOCK_UN); }else{ print('ファイルロックに失敗しました'); } } fclose($fp); } function writeData(){ $personal_name = $_POST['personal_name']; $contents = $_POST['contents']; $contents = nl2br($contents); $data = `<hr>\r\n`; $data = $data.`<p>投稿日時:`.$date.`</p>\r\n`; $data = $data.`<p>投稿者名:`.$personal_name.`</p>\r\n`; $data = $data.`<p>`.$contents.`</p>\r\n`; $data = $data.`<p>匿名:</p>\r\n`; $keijban_file = 'keijiban.txt'; $fp = fopen($keijban_file, 'ab'); if ($fp){ if (flock($fp, LOCK_EX)){ if (fwrite($fp, $data) === FALSE){ print('ファイル書き込みに失敗しました'); } flock($fp, LOCK_UN); }else{ print('ファイルロックに失敗しました'); } } fclose($fp); } ?> </body> </html> ###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

PHP今日からはじめるど初心者です。すみません

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

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

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

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

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

natady

2016/11/08 04:33

コードはバッククオート3つ(```)で囲むと見やすくなります。
kei344

2016/11/08 04:45

コードを部分的にコードブロックに入れるのではなく、全体を```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
guest

回答3

0

php

1$date = "$year$mon$day日($week) $hour$min$sec秒";

この$yearなどの変数は定義されていますでしょうか?

また、 投稿日時は現在時刻でよろしければ次のように書くと良いでしょう。

php

1$datetime = new DateTime(); 2$date = $datetime->format('Y年m月d日 H時i分s秒');

日時を表すDateTimeクラスのインスタンスを生成し、DateTimeクラスで定義されているformatメソッドを実行することで、保持している時刻(この場合サーバの現在時刻)を文字列として出力しています。

DateTimeクラスについてまとめられている記事を見つけましたのでご覧ください。

投稿2016/11/08 04:42

編集2016/11/08 04:50
natady

総合スコア606

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

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

0

以下の処理のことでしょうか。$yearや$monなどがどこにも定義されていないので、やりたいことがよくわかりませんが...

php

1$date = "$year$mon$day日($week) $hour$min$sec秒";

日付はdate関数を使えば、出力形式(フォーマット)を指定したりできます。

以下に現在時刻を出力する例を載せておきます。

php

1<?php 2$today = date("Y年m月d日 H時i分s秒"); 3var_dump($today); 4 5// 曜日は数字で出力されていますので、自分で文字に置き換える必要がある 6$now = strtotime("now"); 7$week = array('日','月','火','水','木','金','土'); 8$today = date('Y年m月d日', $now) . "(" . $week[date('w', $now)] . ") " .date ('H時i分s秒', $now); 9var_dump($today);

投稿2016/11/08 04:47

popobot

総合スコア6586

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

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

0

ベストアンサー

変数には「スコープ」というものがあります。
簡単に言うと、その変数が有効な範囲、と言うような意味で。
一番わかりやすいのは関数(function)の中と外では別のスコープとなります。
つまり、functionの外で使われている変数をfunctionの中で使おうとしても、出来ないという事です。

PHP

1$val = 'a'; 2echo $val; 3function view() { 4 echo $val; 5} 6view();

このような記述をした場合、イメージ的には2行目のechoと4行目のechoで、2回「a」が出力され、「aa」となるように見えますが。
functionの内外ではスコープが異なるので、4行目のechoで出力しようとしている$valは、1行目で宣言した$valとは「別の変数」となります。
その為、4行目の$valは初めて使われる変数であり、中身が空の為、実際の出力は「a」と一度だけ出力される形になります。(2行目のechoによる「a」だけ出力される)

今回の場合、投稿日時として出そうとしている変数$dateがfunctionの外で使われている為、このままだと参照できません。

PHP

1$date = "$year$mon$day日($week) $hour$min$sec秒"; 2/** 中略 **/ 3 4function writeData(){ 5 /** 中略 **/ 6 $data = $data."<p>投稿日時:".$date."</p>\r\n";

これを解決する方法は2つありまして、
1.変数をfunctionの引数に指定して取り込む
2.グローバル変数として宣言する
となります。
1つ目については、質問文のソースコードにあるwriteData()関数に$dateという引数を用意し、このfunctionをコールするときに引数を指定します。

PHP

1$date = "$year$mon$day日($week) $hour$min$sec秒"; 2/** 中略 **/ 3 4function writeData($date){ 5 /** 中略 **/ 6 $data = $data."<p>投稿日時:".$date."</p>\r\n"; 7 /** 中略 **/ 8} 9 10writeData($date)

ただ、今回の場合、この$dateがreadData()の関数の中で使われているモノなので、そうするとreadData()の中でwriteData()を呼び出す必要がある等、おかしなことになります。
私なら、readData()でもwriteData()でもどちらでも使うのであれば、functionの外で$dateを宣言し、readData()もwriteData()も、等しく引数を持つようにすると思います。

PHP

1$date = "$year$mon$day日($week) $hour$min$sec秒"; 2 3function readData($date) { 4 /** 中略 **/ 5} 6function writeData($date) { 7 /** 中略 **/ 8} 9readData($date); 10writeData($date);

もう一つ、グローバル変数を使う、と言う方法を使えば、一応解決も出来ますが、個人的にはグローバル変数はお勧めしません。
どこでだれが値を書き換えたかわかりにくくなり、ぐっちゃぐちゃになりやすいから、と言うのが主な理由です。
どうしても使ってみたい場合は、マニュアルを参照ください。(回答文最初の「スコープ」という文字がリンクになっています)

で、さらに今回の場合、この$dateで使われている$yearや$week等の変数が、いったいどこから来ているのだろうという疑問もあります。
実は提示いただいたソースコード以外にもコードがあり、そこで定義されていたりするのかもしれませんが、初心者さんであればそういう事でもなく、どこかのサイトにあったサンプルをコピペでもしたのかなと思えます。

のでついでに書くと、PHPで現在日時を表示する方法はいくつもありますが、最も単純なのはdate()関数を使う事です。
今回のような形で$dateを構築したいのであれば、

PHP

1$date = "$year$mon$day日($week) $hour$min$sec秒"; 2$date = date("Y年m月d日(D) H時i分s秒");

と言うような形になります。
ただ、これだと曜日が(Mon)とかの英字表記になるので、これを日本語にするには、
1.曜日を数値で取得する
2.その数値に応じた日本語表記の配列を準備しておく
3.取得した曜日(数値)をインデックスとして、配列から日本語表記を取得する
と言う形になります。

まとめると

PHP

1$weekDayList = array('日', '月', '火', '水', '木', '金', '土'); 2$weekDay = $weekDayList[date('w')]; 3echo date("Y年m月d日($weekDay) H時i分s秒").PHP_EOL;

こんな感じです。

この調子だと恐らく他にも色々ありそうな気がしますが、今後は一つずつ別の質問を立てていただければ、それぞれ適切な回答者さんが答えてくれると思います。

頑張ってください。

投稿2016/11/08 05:01

kunai

総合スコア5405

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問