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

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

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

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

Q&A

1回答

963閲覧

php mysqlを用いたカウントダウンの表記問題

GPE46232209

総合スコア14

PHP

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

0グッド

0クリップ

投稿2021/06/25 15:04

前提・実現したいこと

function showCountdown() の中にある
var dDays = diff2Dates / ( 1000 * 60 * 60 * 24 ); // 日数
diff2Dates = diff2Dates % ( 1000 * 60 * 60 * 24 );
var dHour = diff2Dates / ( 1000 * 60 * 60 ); // 時間
diff2Dates = diff2Dates % ( 1000 * 60 * 60 );
var dMin = diff2Dates / ( 1000 * 60 ); // 分
diff2Dates = diff2Dates % ( 1000 * 60 );
var dSec = diff2Dates / 1000; // 秒
var msg2 = Math.floor(dDays) + "日"
+ Math.floor(dHour) + "時間"
+ Math.floor(dMin) + "分"
+ Math.floor(dSec) + "秒";
という表記でどうしてもdDays の表記の日時が30日多く表記されてしまいます。
diff2Datesに関連する数値は基本作動しており、書き方としても大きな間違いはしてないと思います。
なので30日多く検出される原因を突き止めたいです。

該当のソースコード

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="uft8"> <title>time</title> <?php try { $db = new PDO('mysql:dbname=bulletinboard;host=127.0.0.1;charset=utf8','root', '' ); } catch (PDOException $e) { echo "データベース接続エラー :".$e->getMessage(); } $records = $db->query('SELECT * FROM chat WHERE id=9 '); $record = $records->fetch(); $day=0; $hour=0; //簡易タイマーPHP(指定した日時~日時までの期間だけ表示します) //設置するページの拡張子は必ず.phpとなっている必要があります。 //表示開始日時(この日時になったら表示されます) //※日時のフォーマットは必ず「2021-05-17 08:00:00」のようにしてください。 $startDate = $record['modified']; $datetime = date($startDate); list($year, $month, $day, $hour, $minute, $second) = preg_split('/[-: ]/', $datetime); function time_change($hour, $day, $month, $year) { if ($hour>24) { $hour-= 24; $day += 1; switch ($day>=28) { case $month = 1:{ if ($day>31) { $day-= 31; $month+= 1; } } break; case $month =2:{ if ($day>28) { $day-= 28; $month+= 1; } } break; case $month=3: case $month=5: case $month=7: case $month=8: case $month=10:{ if ($day>31) { $day-= 31; $month+= 1; } } break; case $month=4: { if ($day>30) { $day-= 30; $month+= 1; } } break; case $month=6:{ if ($day>30) { $day-= 30; $month+= 1; } } break; case $month=9:{ if ($day>30) { $day-= 30; $month+= 1; } } break; case $month=11: { if ($day>30) { $day-= 30; $month+= 1; } } break; case $month=12: { if ($day>31) { $day-= 31; $month-= 11; $year+=1; } } break; default: break; } } }; if($record['time_limit'] == '2hours'){ $hours= 02; $hour+= $hours; time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '6hours'){ $hours = 06; $hour+= $hours; time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '1day'){ $days = 01; $day += $days;time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '3day'){ $days = 03; $day += $days;time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '5day'){ $days = 05; $day += $days;time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '1week'){ $days = 07; $day += $days;time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '2week'){ $days = 14; $day += $days; time_change($hour, $day, $month, $year); } date_default_timezone_set('Asia/Tokyo');//タイムゾーン (日本以外の場合には適宜設定ください) //表示終了日時(この日時になったら非表示になります) //※日時のフォーマットは必ず「2021-05-17 08:00:00」のようにしてください。 $setdate = ("$year-$month-$day $hour:$minute:$second"); $endDate=date($setdate); //var diff2dates のデータ型を数値にして返すそのための if(date('Y-m-d H:i:s') >= $startDate && date('Y-m-d H:i:s') < $endDate){ ?> <script type="text/javascript"> function showCountdown() { var targetdate =new Date(<?php echo $year?>, <?php echo $month?>, <?php echo $day?>, <?php echo $hour?>, <?php echo $minute?>, <?php echo $second?>); var dnumTarget =targetdate.getTime(); var nowDate = new Date(); var dnumNow = nowDate.getTime(); //diff2Datesをミリ秒の直して表記させる var diff2Dates = dnumTarget - dnumNow; if( dnumTarget < dnumNow ) { // 期限が過ぎた場合は -1 を掛けて正の値に変換 diff2Dates *= -1; } var msg1 = "期限の<?php echo $endDate?>"; // 差の秒を、日数・時間・分・秒に分割 var dDays = diff2Dates / ( 1000 * 60 * 60 * 24 ); // 日数 diff2Dates = diff2Dates % ( 1000 * 60 * 60 * 24 ); var dHour = diff2Dates / ( 1000 * 60 * 60 ); // 時間 diff2Dates = diff2Dates % ( 1000 * 60 * 60 ); var dMin = diff2Dates / ( 1000 * 60 ); // 分 diff2Dates = diff2Dates % ( 1000 * 60 ); var dSec = diff2Dates / 1000; // 秒 var msg2 = Math.floor(dDays) + "日" + Math.floor(dHour) + "時間" + Math.floor(dMin) + "分" + Math.floor(dSec) + "秒"; // 表示文字列の作成 var msg; if( dnumTarget > dnumNow ) { // まだ期限が来ていない場合 msg = msg1 + "までは、あと" + msg2 + "です。"; } else { // 期限が過ぎた場合 msg = msg1 + "は、既に" + msg2 + "前に過ぎました。"; } // 作成した文字列を表示    document.getElementById("RealtimeCountdownArea").innerHTML = msg; } // 1秒ごとに実行 setInterval('showCountdown()',1000); </script> <?php } ?> </head> <body> <input type=button onclick="showCountdown();" > <p id="RealtimeCountdownArea"></p> <p></p> </body> </html>

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

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

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

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

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

seastar3

2021/06/25 21:48

switch の記述の整合性が合っていません。文法を確認してみましょう。 段落を整えて、等値判断は == を使います。
m.ts10806

2021/06/26 02:36

起きてる問題点スポットの回答はしてますが他にも突っ込みどころはたくさん。 コピペ継ぎ接ぎで作ってませんか? ある程度自身が説明できるようにはなっておかないと毎回誰かに助けを求めないと組めなくなります。
GPE46232209

2021/06/27 17:49

返答が遅くなりました。一からプログラムの基盤を作るとなると多大な時間の労になってしまうと考えて、考え方や作り方を学ぶためにコピペを最初はしています。ご指摘いただいたところを改善したらうまく作動しました!!ありがとうございます!! ほかの部分でも突っ込みたいところはあることは自分の中でも心当たりがある部分があるのですが、まずは大雑把に作ってそこから細かく作業に入るので今のところは気にしておりません。 ご指摘いただき本当にありがとうございました。
m.ts10806

2021/06/27 20:04

コピペ「だけ」では考え方も作り方も身に付きません。
GPE46232209

2021/06/28 15:34

すべてをコピペしているわけではないですよ。ある程度の誤差や内容の理解はある程度しているので、 コピペして「はい、終わり!!」という形は絶対にしていないです!!!
m.ts10806

2021/06/28 21:28

いやまぁ。説明調(もしくは課題の指示調)のコメントがそのまま残されてるので、あまり考えてるところが見受けられなかったのがそのように考えた要因です。
GPE46232209

2021/06/29 11:00

なるほどです。きおつけます!!
guest

回答1

0

JavaScriptの問題に思います。
Dateオブジェクトのmonthは0-11で指定されます(つまり、実際の月と1少ない)。

投稿2021/06/25 21:45

m.ts10806

総合スコア80765

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問