• ベストアンサー

UPDATE文について

昨日こちらで自分の間違った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';"; かと思います。

destonias
質問者

補足

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の部分に指定すれば、よいと考えているのですが なぜ上手くいかないのでしょうか? ご教授よろしくお願いします。

その他の回答 (4)

noname#246547
noname#246547
回答No.5

>$total_Timeに『10.00』という値が入っているとき >UPDATE work_time_tbl SET total_work = '.10.00.' WHERE id = '1'; >と表示されました。 上記の「'.10.00.'」は「'10.00'」の間違いでしょ? syntaxエラーでupdate文がロールバックされたため 値が更新できてないだけです。

destonias
質問者

お礼

marimari01様、ご返答ありがとうございます。 ご指摘通り、syntax errorでした(^_^;) 確認が足りませんでした… おかげ様で処理を実現する事が出来ました。

回答No.4

>echoの時に表示された値がDBに格納されません >DB上の型はINTEGERだったのですが、今はFLOAT型に変更 echoで表示した値と、格納値が違うというのは、「僅かな誤差が生じる」ということでしょうか? FLOAT型は浮動小数点で広範囲の値を保持できますが、その一方で小数点以下の値に誤差が生じます。 もし小数点以下も何桁かを確実に保持したいなら、DECIMAL型を使うべきです。

destonias
質問者

お礼

chukenkenkou様、ご返答ありがとうございます。 echoで表示した値と、格納値が違うという問題もおかげ様で 解決する事が出来ました。 >もし小数点以下も何桁かを確実に保持したいなら、DECIMAL型を使う 大変参考になるご意見ありがとうございます。 ありがとうございました。

noname#246547
noname#246547
回答No.3

ちょっと教えてください。 (1)「総労働時間」のDB上の型って何ですか?  前回の質問を見ると4桁の整数だったのでintegerですか? (2)UPDATE文の$total_Timeの前後にピリオドが一つずつありますが、この意味は? 以下憶測ですが、 integer型に小数点付のデータを入れようとしてupdateエラーになっていたりしませんか?

destonias
質問者

補足

marimari01様、ご返答ありがとうございます。 (1)DB上の型はINTEGERだったのですが、今はFLOAT型に変更致しました。 (2)total_Timeの前後にピリオドが一つずつありますが… との事ですが、これは自分で実装した部分ではなく 先程教えて下さった方がこのように記載されていたので、同じ様に記載しました。

  • calltella
  • ベストアンサー率49% (317/635)
回答No.2

質問文を見る限りでは問題なさそうに見えますね。 UPDATE文の直後に echo $sql; でSQL文を確認されてみてはいかがでしょうか? 何かわかるかもしれませんよ。

destonias
質問者

補足

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の部分に指定すれば、よいと考えているのですが なぜ上手くいかないのでしょうか? ご教授よろしくお願いします。