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

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

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

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

Q&A

解決済

1回答

546閲覧

計算結果を加算していく方法

kens_Freelance

総合スコア10

PHP

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

0グッド

0クリップ

投稿2021/05/24 21:45

編集2021/05/25 23:27

ご教授お願いいたします。
勉強中ですので、質問内容がわかりにくいところがあれば
すみませんがご指摘いただけると幸いです。



【質問内容】

「開始」と「終了」ボタンを置き、

「開始」を押すとstart_timesテーブルに1件挿入し、表示
「終了」を押すとstop_timesテーブルに1件挿入し、表示

そして、開始と終了の時間差($time['0'])を表示

<ここまではできました>

やりたいことは、
この「時間差($time['0'])」をどんどん加算して
時間の合計を出したいと思っているのですが、
今のコードではどうやっても加算が思いつきません。

ご教授いただけるとありがたいです。

<form action="iframe_after.php" method="POST" target="iframe"> <button id="start_button" type="submit" name="start">開始</button> <button id="stop_button" type="submit" name="stop">終了</button> </form> <iframe src="iframe_before.php" name="iframe"></iframe> <?php if(isset($_POST['start'])) { $db->exec('INSERT INTO start_times SET start_time_date=NOW(), start_time=NOW()'); } else if(isset($_POST['stop'])) { $db->exec('INSERT INTO stop_times SET stop_time_date=NOW(), stop_time=NOW()'); } $start_times = $db->query('SELECT * FROM start_times WHERE start_time_date = CURRENT_DATE'); $stop_times = $db->query('SELECT * FROM stop_times WHERE stop_time_date = CURRENT_DATE'); while($start_time = $start_times->fetch()) { echo "開始" . $start_time['start_time_date'] . " " . $start_time['start_time'] . '<br>'; $stop_time = $stop_times->fetch(); echo "終了" . $stop_time['stop_time_date'] . " " . $stop_time['stop_time'] . '<br>'; $times = $db->query("SELECT TIMEDIFF('". $stop_time['stop_time'] ."' , '" . $start_time['start_time'] ."')" );// 時間差 $time = $times->fetch(); echo $time['0'] . '<br>' . '<br>'; } ?>

修正します。
アドバイスいただいた内容を参考にし、
「時間差($time['0'])」を加算していくのではなく
下記のコードのように開始時間と終了時間の差を
work_timesというテーブルに入れていくことにしました。
そして、そのテーブルの時間合計を取得して出力するまではできたのですが、
例えば、50秒の時間合計だったときに
09:00:50
というような表示になってしまいます。
これを直すにはどのようにすればいいでしょうか。

php.iniのタイムゾーンは
date.timezone = Asia/Tokyo
になっております。

<?php if(isset($_POST['start'])) { // 今日の日付のstart_timesテーブルのレコード数を取得 $start_times_table = $db->query('SELECT * FROM start_times WHERE start_time_date = CURRENT_DATE'); $start_times_records = $start_times_table->rowCount(); // 今日の日付のstop_timesテーブルのレコード数を取得 $stop_times_table = $db->query('SELECT * FROM stop_times WHERE stop_time_date = CURRENT_DATE'); $stop_times_records = $stop_times_table->rowCount(); // start_timesとstop_timesのレコード数が同じかどうか, 同じであればstart_timesにインサート if($start_times_records == $stop_times_records){ $db->exec('INSERT INTO start_times SET start_time_date=NOW(), start_time=NOW()'); } else { echo '<br>' . '一度開始が押されています。「終了」を押してください' . '<br><br>'; } } else if(isset($_POST['stop'])) { $db->exec('INSERT INTO stop_times SET stop_time_date=NOW(), stop_time=NOW()'); $starts = $db->query('SELECT * FROM start_times ORDER BY id DESC LIMIT 1'); $stops = $db->query('SELECT * FROM stop_times ORDER BY id DESC LIMIT 1'); $start = $starts->fetch(); $stop = $stops->fetch(); $db->exec("INSERT INTO work_times SET work_time_date = NOW(), work_time = TIMEDIFF( '". $stop['stop_time'] ."' , '" . $start['start_time'] ."' )"); } $work_times = $db->query('SELECT SUM(work_time) FROM work_times WHERE work_time_date = CURRENT_DATE'); $work_time = $work_times->fetch(); echo date('h:i:s', $work_time['SUM(work_time)']); // 今日のstart,stopのデータを1件ずつ交互に全て表示 $start_times = $db->query('SELECT * FROM start_times WHERE start_time_date = CURRENT_DATE'); $stop_times = $db->query('SELECT * FROM stop_times WHERE stop_time_date = CURRENT_DATE'); while($start_time = $start_times->fetch()) { echo "開始" . $start_time['start_time_date'] . " " . $start_time['start_time'] . '<br>'; $stop_time = $stop_times->fetch(); echo "終了" . $stop_time['stop_time_date'] . " " . $stop_time['stop_time'] . '<br>'; $times = $db->query("SELECT TIMEDIFF('". $stop_time['stop_time'] ."' , '" . $start_time['start_time'] ."')" );// 時間差 $time = $times->fetch(); echo $time['0'] . '<br>' . '<br>'; } ?>

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

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

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

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

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

m.ts10806

2021/05/24 23:58

phpMyAdminはツールなので本件とは直接関係ないと思います。
kens_Freelance

2021/05/25 01:14

ご指摘ありがとうございます。 削除いたしました。
m.ts10806

2021/05/25 01:19

あとDBは必要かもしれません 環境分かりませんが、MySQLとかPostgreSQLとか。 バージョンとテーブル定義もあったらなおよしです。やりようによってはSQLだけで一通り計算済ませてPHPは取得して表示するだけなんてことも可能には思いますが、定義によっては難しいかもしれません。 テーブル定義はCREATE TABLEで、可能ならサンプルデータをINSERTで提示されると手元で確認しやすいです。 phpMyAdminお使いでしたらエクスポート機能で対応できます。
退会済みユーザー

退会済みユーザー

2021/05/25 01:54

開始と終了、テーブルを分けるの? 開始、開始、開始、終了、なんてときもOK? 要件が曖昧な解釈ができるため、どういうデータ構造なのか、どう計算するのか、事例も添えてほしい。
kens_Freelance

2021/05/25 21:52

> m.ts10806さん 「SQLだけで計算を済ませて、PHPで取得する」というアドバイスから、開始と終了の時間差を新しいテーブルに入れて、そこから合計時間を取得することができました!とても参考になりました、ありがとうございます。 >m6uさん 開始、開始、終了のときに開始テーブルに挿入されないよう、if文を使用してできないようにしています。 たしかに、情報不足でしたすみません。 次回質問する際はそのあたりもしっかり説明します。 ありがとうございます。
m.ts10806

2021/05/25 22:58

>「SQLだけで計算を済ませて、PHPで取得する」というアドバイスから、開始と終了の時間差を新しいテーブルに入れて、そこから合計時間を取得することができました! 解決したのでしたら、それまでの経緯を詳細に回答として自己解決としてください。
kens_Freelance

2021/05/25 23:22

すみません、解決したとおもったのですが、合計時間をechoさせるとなぜか+9時間されてしまうので、そこがまだできておりません。質問内容を修正いたします。
m.ts10806

2021/05/25 23:37

加算が目的ならひとまず解決でいいのでは。 MySQL側のタイムゾーンも確認してください。 PHP側で演算しないなら取れた情報を出しているだけです
kens_Freelance

2021/05/26 02:12

わかりました、解決でしめさせていただきます。 MySQL側のタイムゾーンも日本になっておりました。 改めて質問させていただきます。
guest

回答1

0

自己解決

修正で、再度質問を追加しましたが
とりあえず加算は解決しましたので、新しい質問として
投稿いたします。
ありがとうございます。

投稿2021/05/26 02:13

kens_Freelance

総合スコア10

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

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

m.ts10806

2021/05/26 02:31

あの、「解決までの経緯を詳細に」と依頼したのですけど… あとから他の人が見てどう解決したのかわかる内容になってないと「ベストアンサー」の意味がないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問