昨日こちらで自分の間違ったSQL文をご指摘頂き
時間計算の処理は実装する事が出来たのですが
その後の計算処理が終わった後、計算結果をDBに格納する処理で
再度躓いてしまったので、再度のご教授お願いします。
$sql = "SELECT SUM(ROUND(労働時間/100, 0)) + ROUND(SUM(MOD(労働時間,100)) / 60, 2) AS total
FROM 労働時間テーブル WHERE id = 'ログインしている人のID';";
$total_Time = pg_query($con, $sql);
$total_Time = pg_fetch_result($total_Time, 0, 'total');
// 確認のため、表示
echo $total_Time;
で値はきちんと表示されおります。
しかし、この後UPDATE文で
$sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';";
pg_query($con, $sql);
と打ち試しましたが、echoの時に表示された値がDBに格納されません。(>_<)
試しに
$sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';";
の'$total_Time'をSELECT文に変更したりもしましたが、echoの時に
表示されていた値とは違う値がDBに格納されるようになってしまいました。
どのように解決したらよいか、悩んでおります。
そもそもの考え方から間違っているのでしょうか?
ご教授の程、よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
PostgreSQLよりも、PHPの記述に問題があるような気がします。
たとえば、
$total_Time = pg_query($con, $sql);
$total_Time = pg_fetch_result($total_Time, 0, 'total');
の部分は、本来別ものの値を扱うのに、$total_Time という名前の変数を使いまわしていますが、
$res = pg_query($con, $sql);
$total_Time = pg_fetch_result($res, 0, 'total');
というように分けて書いたほうが混乱がありません。
本題ですが、echo $sql; はどうなっておりますでしょうか。
もし、$total_Timeで差し込んだ部分が、空になっているなら、
""内に直接変数を置いているため正常に認識されないのかもしれません。
$sqlは、あくまでも文字列ですので、
ここは、"もじれつ".$hensu のように . で文字列連結をするほうが安全です。
「総労働時間」列のデータ型が数値なら
$sql = "UPDATE 労働時間テーブル SET 総労働時間 = ".$total_Time." WHERE id = 'ログインしている人のID';";
文字列なら
$sql = "UPDATE 労働時間テーブル SET 総労働時間 = '".$total_Time."' WHERE id = 'ログインしている人のID';";
かと思います。
この回答への補足
copymaster様、calltella様
お世話になっております。
下記の通り、実行してみました。
// $resにログインしている人毎の労働時間を代入
$res = pg_query($con, "SELECT SUM(ROUND(work_time/100, 0)) + ROUND(SUM(MOD(work_time,100)) / 60, 2) AS total FROM work_time_tbl WHERE id = '$s_id'");
// $total_timeに総労働時間を代入
$total_Time = pg_fetch_result($res, 0, 'total');
// 総労働時間をDBに格納する
$sql = "UPDATE work_time_tbl SET total_work = '.$total_Time.' WHERE id = 'ログインしている人のID';";
pg_query($con, $sql);
echo $sql
としました。
$total_Timeに『10.00』という値が入っているとき
UPDATE work_time_tbl SET total_work = '.10.00.' WHERE id = '1';
と表示されました。
しかしDBには『0』が格納されてしまいました。
実際、$total_Timeに『10.00』という値が格納されているので
その値をそのままUPDATEのSETの部分に指定すれば、よいと考えているのですが
なぜ上手くいかないのでしょうか?
ご教授よろしくお願いします。
No.5
- 回答日時:
>$total_Timeに『10.00』という値が入っているとき
>UPDATE work_time_tbl SET total_work = '.10.00.' WHERE id = '1';
>と表示されました。
上記の「'.10.00.'」は「'10.00'」の間違いでしょ?
syntaxエラーでupdate文がロールバックされたため
値が更新できてないだけです。
marimari01様、ご返答ありがとうございます。
ご指摘通り、syntax errorでした(^_^;)
確認が足りませんでした…
おかげ様で処理を実現する事が出来ました。
No.4
- 回答日時:
>echoの時に表示された値がDBに格納されません
>DB上の型はINTEGERだったのですが、今はFLOAT型に変更
echoで表示した値と、格納値が違うというのは、「僅かな誤差が生じる」ということでしょうか?
FLOAT型は浮動小数点で広範囲の値を保持できますが、その一方で小数点以下の値に誤差が生じます。
もし小数点以下も何桁かを確実に保持したいなら、DECIMAL型を使うべきです。
chukenkenkou様、ご返答ありがとうございます。
echoで表示した値と、格納値が違うという問題もおかげ様で
解決する事が出来ました。
>もし小数点以下も何桁かを確実に保持したいなら、DECIMAL型を使う
大変参考になるご意見ありがとうございます。
ありがとうございました。
No.3
- 回答日時:
ちょっと教えてください。
(1)「総労働時間」のDB上の型って何ですか?
前回の質問を見ると4桁の整数だったのでintegerですか?
(2)UPDATE文の$total_Timeの前後にピリオドが一つずつありますが、この意味は?
以下憶測ですが、
integer型に小数点付のデータを入れようとしてupdateエラーになっていたりしませんか?
この回答への補足
marimari01様、ご返答ありがとうございます。
(1)DB上の型はINTEGERだったのですが、今はFLOAT型に変更致しました。
(2)total_Timeの前後にピリオドが一つずつありますが…
との事ですが、これは自分で実装した部分ではなく
先程教えて下さった方がこのように記載されていたので、同じ様に記載しました。
No.2
- 回答日時:
質問文を見る限りでは問題なさそうに見えますね。
UPDATE文の直後に
echo $sql;
でSQL文を確認されてみてはいかがでしょうか?
何かわかるかもしれませんよ。
この回答への補足
copymaster様、calltella様
お世話になっております。
下記の通り、実行してみました。
// $resにログインしている人毎の労働時間を代入
$res = pg_query($con, "SELECT SUM(ROUND(work_time/100, 0)) + ROUND(SUM(MOD(work_time,100)) / 60, 2) AS total FROM work_time_tbl WHERE id = '$s_id'");
// $total_timeに総労働時間を代入
$total_Time = pg_fetch_result($res, 0, 'total');
// 総労働時間をDBに格納する
$sql = "UPDATE work_time_tbl SET total_work = '.$total_Time.' WHERE id = 'ログインしている人のID';";
pg_query($con, $sql);
echo $sql
としました。
$total_Timeに『10.00』という値が入っているとき
UPDATE work_time_tbl SET total_work = '.10.00.' WHERE id = '1';
と表示されました。
しかしDBには『0』が格納されてしまいました。
実際、$total_Timeに『10.00』という値が格納されているので
その値をそのままUPDATEのSETの部分に指定すれば、よいと考えているのですが
なぜ上手くいかないのでしょうか?
ご教授よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DBから日付順に指定件数の削除...
-
列が存在しないと言われる
-
alter tableすると、処理が止ま...
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
エクセルVBAで5行目からオート...
-
ACCESSのクエリで集計で、先頭...
-
Accessでコードを入れると名前...
-
異なるサーバのDBデータ同士を...
-
テーブルの存在チェックについて
-
2つのテーブルAとBをマージ...
-
SQLServer2005のSQL文での別名...
-
FROM の中で CASE を使えるでし...
-
Access テキスト型に対する指定...
-
日本語のテーブル名、カラム名...
-
Accessでテーブルの値をテキス...
-
Accessフォームにクロス集計ク...
-
データがある場合のカラムの削除
-
アンドロイド おサイフケータイ...
-
INSERT INTO ステートメントに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
列が存在しないと言われる
-
0の除算
-
DBから日付順に指定件数の削除...
-
PostgreSQLで表結合+DELETEしたい
-
INSERTできるレコード数を制限...
-
constraint と index の違い
-
長いSQL文を実行するには?
-
COPY時のtimestamp型について
-
alter tableすると、処理が止ま...
-
複数キーワードでのあいまい検索
-
DB2でUNIQUE制約を削除したい
-
■一番最初に値が入っている(Nul...
-
Null値を無視してユニークにしたい
-
powergres(postgres)にalter文...
-
動的に生成したカラムを使ったF...
-
PostgreSQLで、元テーブルをコ...
-
DB2 「既存カラムへのnot null...
-
postgreSQLの日付を変数にする...
-
INSERTできない
-
INDEXの仕様
おすすめ情報