電子書籍の厳選無料作品が豊富!

昨日こちらで自分の間違った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に格納されるようになってしまいました。

どのように解決したらよいか、悩んでおります。
そもそもの考え方から間違っているのでしょうか?

ご教授の程、よろしくお願い致します。

A 回答 (5件)

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

ご教授よろしくお願いします。

補足日時:2007/04/11 13:45
    • good
    • 0

>$total_Timeに『10.00』という値が入っているとき


>UPDATE work_time_tbl SET total_work = '.10.00.' WHERE id = '1';
>と表示されました。

上記の「'.10.00.'」は「'10.00'」の間違いでしょ?
syntaxエラーでupdate文がロールバックされたため
値が更新できてないだけです。
    • good
    • 0
この回答へのお礼

marimari01様、ご返答ありがとうございます。

ご指摘通り、syntax errorでした(^_^;)
確認が足りませんでした…

おかげ様で処理を実現する事が出来ました。

お礼日時:2007/04/11 18:37

>echoの時に表示された値がDBに格納されません


>DB上の型はINTEGERだったのですが、今はFLOAT型に変更

echoで表示した値と、格納値が違うというのは、「僅かな誤差が生じる」ということでしょうか?

FLOAT型は浮動小数点で広範囲の値を保持できますが、その一方で小数点以下の値に誤差が生じます。
もし小数点以下も何桁かを確実に保持したいなら、DECIMAL型を使うべきです。
    • good
    • 0
この回答へのお礼

chukenkenkou様、ご返答ありがとうございます。

echoで表示した値と、格納値が違うという問題もおかげ様で
解決する事が出来ました。

>もし小数点以下も何桁かを確実に保持したいなら、DECIMAL型を使う
大変参考になるご意見ありがとうございます。

ありがとうございました。

お礼日時:2007/04/11 18:39

ちょっと教えてください。


(1)「総労働時間」のDB上の型って何ですか?
 前回の質問を見ると4桁の整数だったのでintegerですか?
(2)UPDATE文の$total_Timeの前後にピリオドが一つずつありますが、この意味は?

以下憶測ですが、
integer型に小数点付のデータを入れようとしてupdateエラーになっていたりしませんか?

この回答への補足

marimari01様、ご返答ありがとうございます。

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

補足日時:2007/04/11 15:35
    • good
    • 0

質問文を見る限りでは問題なさそうに見えますね。


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

ご教授よろしくお願いします。

補足日時:2007/04/11 13:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!