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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

1回答

1083閲覧

時間表示について(format)

退会済みユーザー

退会済みユーザー

総合スコア0

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2020/06/17 06:24

編集2020/06/17 06:49

残業申請のシステムを作っています。
実際に稼働した時間外労働の時間の合計をテーブルの下に表示したいのですがformatがうまくいかず、分単位が表示されません。以下がコードです。

php

1<?php include('dbc.php');?> 2 3<?php 4$list = $pdo->prepare("SELECT * FROM テーブル名 WHERE name = '名前' ORDER BY id DESC; "); 5$list->execute(); 6$temp= $list->fetchall(); 7?> 8 9<!DOCTYPE html> 10<html lang="ja"> 11<head> 12 <meta charset="UTF-8"> 13 <link rel="stylesheet" type="text/css" href=css/stylesheet2.css> 14 <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet"> 15 16 <title>時間外申請済リスト</title> 17</head> 18<body> 19 <div class="container"> 20 <h1 class="title">~時間外勤務申請済リスト~</h1> 21 22 </div> 23 <table> 24 <tr> 25 <th>名前</th> 26 <th>予定日</th> 27 <th>予定開始時刻</th> 28 <th>予定終了時刻</th> 29 <th>承認</th> 30 <th>実施日</th> 31 <th>実施開始時刻</th> 32 <th>実施終了時刻</th> 33 <th>時間外稼働時間</th> 34 <th>件番</th> 35 <th>内容</th> 36 <th>総務印</th> 37 <th>編集</th> 38 <th>削除</th> 39 </tr> 40 41 <?php 42 foreach($temp as $data){ 43 ?> 44 <tr> 45 <?php printf("<td>%s</td>",$data['name']); ?> 46 <?php printf("<td>%s</td>",$data['yoteiday']); ?> 47 <?php printf("<td>%s</td>",$data['yoteistarttime']); ?> 48 <?php printf("<td>%s</td>",$data['yoteiendtime']); ?> 49 <?php printf("<td>%s</td>",$data['syounin']); ?> 50 <?php printf("<td>%s</td>",$data['jissiday']); ?> 51 <?php printf("<td>%s</td>",$data['jissistarttime']); ?> //残業を始めた時間 52 <?php printf("<td>%s</td>",$data['jissiendtime']); ?> //残業を終えた時間 53 <?php 54 $from = $data['jissiendtime']; 55 $to = $data['jissistarttime']; 56    //残業を終えた時間から残業を始めた時間を引いてその日の稼働時間をテーブルに表示 57 $result = date_diff(new DateTime($from), new DateTime($to))->format('%H:%I');  58 printf("<td>%s</td>",$result); 59    //その合計を$sumと定義 60 $sum += $result; 61 ?> 62 <?php printf("<td>%s</td>",$data['kenban']); ?> 63 <?php printf("<td>%s</td>",$data['naiyou']); ?> 64 <?php printf("<td>%s</td>",$data['soumuin']); ?> 65 <td><a class="fa fa-edit" href="update_form.php?id=<?php echo $data['id']?>"></a></td> 66 <td><a class="fa fa-trash delete" href="delete.php?id=<?php echo $data['id'] ?>"></a></td> 67 </tr> 68 <?php 69 } 70 ?> 71 </table> 72 </div> 73 </div> 74 75//$sumを表示 76 <div class="sum-time"> 77 <h1>合計時間外稼働時間</h1> 78 <?php 79 echo $sum; 80 ?> 81</div> 82 83</body> 84</html>

時単位のみが表示され、分単位の表示方法がわかりません。$resultのformatは動いているので大丈夫かと思ったのですがうまくいかないです。

試したこと

//$sumを表示 <div class="sum-time"> <h1>合計時間外稼働時間</h1> <?php $sum->format('%H:%I'); echo $sum; ?> </div>

わかる方がいらっしゃれば何卒お願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/17 08:03

jissiendtime と jissistarttime の形式やデータ型を示さないとなんとも言えんよ
guest

回答1

0

ベストアンサー

$result = date_diff(new DateTime($from), new DateTime($to))->format('%H:%I');
この行で $result には 01:59 のような文字列が入っているはずです ($data['jissistarttime']などが日付として正しく評価できる値なのであれば)

$sum += $result;
この行で $sum に足し算をしようとしていますが、文字列を足し算することはできないので数値型に変換されます。文字列を数値に変換するとき、文字の先頭から数字として解釈できるところまでが評価されます。:は数字として解釈できませんので 文字列の01数値の1 になります。
というのを続けていくと、各ループの処理中で : の前までの値だけが $sum に足されてゆき、「時単位のみが表示され」るという結果になります。

php

1<?php 2// 残業時間の合計 3$total_overtime = new DateTime('@0000000000'); 4foreach($temp as $data){ 5 // 残業を終えた時間から残業を始めた時間を引いてその日の稼働時間をテーブルに表示 6 $overtime_start = $data['jissistarttime']; 7 $overtime_end = $data['jissiendtime']; 8 $overtime = date_diff( 9 new DateTime($overtime_start), 10 new DateTime($overtime_end), 11 true 12 ); 13 14 // 残業時間の合計にこの日の残業時間を足す 15 $total_overtime->add($overtime); 16 17 echo '<tr><td>' . implode('</td><td>', [ 18 $data['name'], 19 $data['yoteiday'], 20 $data['yoteistarttime'], 21 $data['yoteiendtime'], 22 $data['syounin'], 23 $data['jissiday'], 24 $overtime_start, // 残業を始めた時間 25 $overtime_end, // 残業を終えた時間 26 $overtime->format('%H:%I'), 27 $data['kenban'], 28 $data['naiyou'], 29 $data['soumuin'], 30 '<a class="fa fa-edit" href="update_form.php?id=' . $data['id'] . '></a>', 31 '<a class="fa fa-trash delete" href="delete.php?id=' . $data['id'] . '></a>', 32 ]) . '</td></tr>'; 33} 34?>

検証していませんが、ループの部分はこんな感じでいいかと思います。足し算をする必要がある残業時間の合計 (変数名を $total_overtime に変えています) は、今回 DateTime にしていますが、 integer でもいいと思います。

あとは合計を出すときに echo $total_overtime->format() でお好きな出力フォーマットにするとよいです。

あと、何箇所か全角スペースが入っていますので、これは注意してください。

投稿2020/06/17 08:23

thyda.eiqau

総合スコア2982

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

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

退会済みユーザー

退会済みユーザー

2020/06/17 08:48

無事に解決しました!原因がわからなかったのですっきりしました。ご丁寧に教えていただきありがとうございます。スペースについてもご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問