![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
昨日こちらで自分の間違った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で質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- PHP Q&Aサイトを作成していてURLの生成方法について迷っているのでアドバイスお願い致します 1 2023/08/10 16:42
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Excel(エクセル) RANK.EQとCOUNTIFSの組み合わせで同ポイントの場合、違う条件を加えて順位を付けたい。 1 2022/08/30 19:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
列が存在しないと言われる
-
alter tableすると、処理が止ま...
-
0の除算
-
constraint と index の違い
-
INSERTできるレコード数を制限...
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
「直需」の意味を教えてください
-
ACCESSでの改行コード
-
Accessでテーブル名やクエリ名...
-
Access テキスト型に対する指定...
-
Accessでコードを入れると名前...
-
セルの右クリックで出る項目を...
-
異なるサーバのDBデータ同士を...
-
作番ってどういう意味でしょうか?
-
Accessフォーム全レコードをPDF...
-
【至急】Accessのフィールドの...
-
ACCESSのクエリで集計で、先頭...
-
Accessで、固定アルファベット+...
-
ORACLEで一番最初の結果だけを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
列が存在しないと言われる
-
0の除算
-
constraint と index の違い
-
DBから日付順に指定件数の削除...
-
alter tableすると、処理が止ま...
-
PostgreSQLで表結合+DELETEしたい
-
INSERTできるレコード数を制限...
-
COPY時のtimestamp型について
-
長いSQL文を実行するには?
-
RDB経験者向けのAccess参考書
-
Null値を無視してユニークにしたい
-
大量データを更新したら、処理...
-
INSERTできない
-
SQLite:項目が存在しない場合の...
-
powergres(postgres)にalter文...
-
DB2でUNIQUE制約を削除したい
-
SQLで特定データがNULLなら別デ...
-
【初歩】 主キー&ユニーク&AU...
-
DB2 「既存カラムへのnot null...
-
副問い合わせ
おすすめ情報