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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

1729閲覧

時間の足し算

van-0215

総合スコア89

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/01/23 07:39

編集2017/01/25 01:11

以前moriss.jsというグラフ描写ライブラリの使い方がよくわからず、質問させて頂きました。

今回は、値の管理についてです。質問は2つあります。
現在、勉強時間の管理サイトを作成しております。そこでmorris.jsを用いて、グラフを記述しております。

データは、データベースから以下のプログラムで取り出しております。

PHP

1<?php 2//データベース接続 3$flag=1; 4$befo= '2000-10-10';//(初期値) 5$time = '00:00:00'; 6echo "var day_data = ["; 7 8 if($data[1] == $_SESSION['id']){//ログインユーザとデータの書き込みユーザーが一致したら 9 10 /*カンマの処理*/ 11 if($flag==0){//二回目のデータ以降 12 echo ","; 13 }else{ 14 $flag=0; 15 } 16 17 /*一番最初の日*/ 18 if($befo==='2000-10-10'){//初期値だったら 19 $befo=$data[2];//日付 20 $time=$data[3]; 21 } 22 23 /*同じ日付*/ 24 elseif($data[2]===$befo){ 25 $source_times = explode(":", $time);//足される方分解 26 $add_times = explode(":", $data[3]);//足す方分解 27 $time = date("H:i:s", mktime($source_times[0] + $add_times[0], $source_times[1] + $add_times[1], $source_times[2] + $add_times[2])); 28 echo "{'date': '" .$befo. "', 'time': '" .$time. "'}"; 29 } 30 31 /*違う日付*/ 32 elseif($data[2]!=$befo){ 33/*本来このしたの echo でデータを格納する予定*/ 34 //echo "{'date': '" .$befo. "', 'time': '" .$time. "'}"; 35 $befo=$data[2];//次の日付 36 $time=$data[3]; 37 } 38 } 39} 40echo "];"; 41echo "new Morris.Line({"; 42echo "element: 'graph',"; 43echo "data: day_data,"; 44echo "xkey: 'date',"; 45echo "ymax: '24',"; 46echo "ymin: '0',"; 47echo "ykeys: ['time'],"; 48echo "labels: ['勉強時間'],"; 49echo "smooth: false,"; 50echo "parseTime: false,"; 51echo "resize: true"; 52echo "});"; 53echo "</script>"; 54?>

データベースの構造はこのようになっています。
イメージ説明

上記のプログラムをブラウザで表示した場合以下のようなグラフができます。
イメージ説明

ここで質問です。
!!現在グラフのX軸に同一の日付が複数有り【1日にどれだけ勉強したか】が一目でわからない状態です。
→ 日付が同じなら時間を足したい。

そのため上記プログラムでは【値の取得】部分で、勉強ログが
・同じ日付か
・別の日付か
で分岐をして、同じ日付なら 00:00:00 という初期時間に勉強ログで見つけた時間を足していくようにしました。
しかしながら分岐がおかしいのか時間の足し算がおかしいのか表示さえされなくなってしまいました。

どこがおかしいのでしょうか?

また、
DBへの保存データですが、上記で示したテーブル構造ごとそれぞれ以下のような値が入っております。
イメージ説明

実行SQL文に関しては、DBへの接続・テーブルを選択後、
while ($data = mysql_fetch_array($quryset)){
として、後に
if($data[1] == $_SESSION['id']){ //つまりテーブルでのdata1と今見たいuserのIDが一致したら
という条件を置き、それをmorris.js用に保存しております。

<追記>
上記プログラムにカンマ処理を加えました。

データが一個の場合は以下のようなグラフになります。

イメージ説明

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

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

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

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

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

Lhankor_Mhy

2017/01/23 08:12 編集

PHPの出力例をご提示できますか? なんとなくですが、カンマが抜けてるような気がしてます。
van-0215

2017/01/23 11:42

初心者なもので、出力例というのがよくわかりません。 このphpはmoriss.jsというグラフ描写のjsライブラリを使いグラフを表示する際に必要なデータをDBから持ってくるものです。なので出力例というのは上に画像で示したグラフだと思っています。 もし宜しければ要員として考えていただいているカンマの位置を教えてくれませんか?
Lhankor_Mhy

2017/01/24 10:18

問題が起きている現象を再現しないコードの提示はよろしくないですね…… たとえ誰かが原因を見つけたとしても「ここには書いてないだけで実際にはちゃんと記述されているんだろう」と思われるのではありませんか。    たとえば、コードを見て私は「全部違う日付だったらたぶんひとつも出力されないと思うけど、まあきっとどこかで上手くやっているんだろう」と思っています。
guest

回答2

0

ご質問の内容はmoriss.jsの使い方というよりプログラミングの基礎の問題です。
一応直すべき箇所を提示させて戴きます。

以下のような構造になっているという仮定で解決策を提示します。

php

1<?php 2//データベース接続 3$flag=1; 4$befo= '2000-10-10';//(初期値) 5$time = '00:00:00'; 6echo "var day_data = ["; 7while ($data = mysql_fetch_array($quryset)){ 8 // ... if($data[1] == $_SESSION['id'])に続く本文かいてるところ 9} 10echo "];"; 11echo "new Morris.Line({"; 12echo "element: 'graph',"; 13... 続く

今現在はループの中でjsonの配列を作成しようと考えているかと思います。
しかし以下3つの問題があります。
・最初のデータが必ず出力される
・異なる日付が続くと出力されない
・同じ日付が3つ以上現れた場合複数出力される
※言い換えれば、最初のデータ以降は同日が2連続で現れた場合に2日目以降のみが処理される

とこんな具合なので動くわけはございません…。

これを正しくするっていうのが難しいので…SQLでSUMしましょう。
全データ取ってきてループで除こうというするのが問題をややこしくしています。
・$_SESSION['id']に登録されてるIDでクエリの件数を制限
・日付でGROUP BYして時間数をSUMしましょう

SQL

1SELECT date, SUM(hours) as hourstotal FROM テーブル WHERE user_id={ここにID}

投稿2017/01/25 03:07

haru666

総合スコア1591

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

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

0

ループが抜けている気がしますが、補足にあるようにカンマが抜けてる気がしますね、、、

php

1echo "{'date': '" .$befo. "', 'time': '" .$time. "'},"; # 最後のカッコの後のカンマを追加

投稿2017/01/23 12:02

takeshi

総合スコア264

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

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

van-0215

2017/01/24 09:24

まずはじめに回答ありがとうございます。 カンマについてですが、上記に記しているプログラムは、全体の一部分で、他の場所で記述しております。 わかりにくくてすみません。 もしも他に時間の足し算ができない原因になりそうな部分がありましたら教えてください。
takeshi

2017/01/26 06:31

28行目が生きてて、34行目がコメントになっていないのは、デバッグ用のコードだからでしょうか? ここをそのまま動かしてるというオチはないですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問