blue-chicken
@blue-chicken

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

insert,updateを使用してもデータベースを変更できない

解決したいこと

mampを用いたローカル環境で日報登録システムを作成中です。
データベースに登録が無ければ、モーダルで入力した出勤時間、退勤時間、休憩時間、
業務内容をデータベースに登録。
データベースに登録があれば、モーダルで入力した出勤時間、退勤時間、休憩時間、
業務内容をデータベースに更新する動作を行いたいです。

しかし現状、データベースへのinsert,updateが行われません。
グーグルデベロッパーツールのコンソールに"on_content_end〜pattern.id=undefined"と
表示されることが気になりますが、原因と対処方法の特定ができません。

ご教授いただけると幸いです。宜しくお願いいたします。

発生している問題・エラー

ログインすると、今月の業務一覧と日報登録ができるモーダルが表示されます。
データベースには本日の業務情報が既に登録されていますので、これから情報を更新する所です。
スクリーンショット 2022-07-07 21.44.17.png

打刻をし、業務内容を登録。データベースが更新され、今月の業務一覧も更新されるはずです...
スクリーンショット 2022-07-07 21.44.49.png

元の状態に戻ってしまいます。※何も変化がない。
スクリーンショット 2022-07-07 21.45.11.png

該当するソースコード

php側
$pdo = connect_db();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {

  //日報登録情報

  //入力値をPOSTパラメータから取得
  $modal_start_time = $_POST['modal_start_time'];
  $modal_finish_time = $_POST['modal_finish_time'];
  $modal_rest_time = $_POST['modal_rest_time'];
  $modal_comment = $_POST['modal_comment'];

  //対象日のデータがあるかチェクする
  $sql = "SELECT id FROM work WHERE user_id = :user_id AND date = :date LIMIT 1";
  $stmt = $pdo->prepare($sql);
  $stmt->bindValue(':user_id', (int)$session_user['id'], PDO::PARAM_INT);
  $stmt->bindValue(':date', date('Y-m-d'), PDO::PARAM_STR);
  $stmt->execute();
  $user = $stmt->fetch();

  if($work) {
    //対象日のデータがあればUPDATE
    $sql = "UPDATE work SET start_time = :start_time, finish_time = :finish_time, rest_time = :rest_time, comment = :comment WHERE
    id = :id";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':id', (int)$work['id'], PDO::PARAM_INT);
    $stmt->bindValue(':start_time', $modal_start_time, PDO::PARAM_STR);
    $stmt->bindValue(':finish_time', $modal_finish_time, PDO::PARAM_STR);
    $stmt->bindValue(':rest_time', $modal_rest_time, PDO::PARAM_STR);
    $stmt->bindValue(':comment', $modal_comment, PDO::PARAM_STR);
    $stmt->execute();
    
  } else {
    //対象日のデータが無ければINSERT
    $sql = "INSERT INTO work (user_id, date, start_time, finish_time, rest_time, comment) VALUES (:user_id, :date, :start_time, :finish_time, :rest_time, :comment)";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':user_id', (int)$session_user['id'], PDO::PARAM_INT);
    $stmt->bindValue(':date', date('Y-m-d'), PDO::PARAM_STR);
    $stmt->bindValue(':start_time', $modal_start_time, PDO::PARAM_STR);
    $stmt->bindValue(':finish_time', $modal_finish_time, PDO::PARAM_STR);
    $stmt->bindValue(':rest_time', $modal_rest_time, PDO::PARAM_STR);
    $stmt->bindValue(':comment', $modal_comment, PDO::PARAM_STR);
    $stmt->execute(); 
  }
}


### 自分で試したこと
・スペルミスがないかの確認
0

1Answer

まずはプログラムがどのように処理されているか確認しましょう。
var_dumpメソッドなどを使用して処理結果や経路を確認していきます。

SQLが正しく処理されているかも確認しましょう。
executeメソッドは結果を戻り値として返します。

errorInfoメソッドは直近のエラー情報を取得できます。

1Like

Comments

  1. @blue-chicken

    Questioner

    ご回答ありがとうございます。
    ご指摘をいただいた通りに、まずは①var_dumpメソッドを使用して見ました。
    →NULLが表示されました。すなわち、変数に値が入っていないということですか?下記の位置にvar_dumpメソッドを記載したのですが、適切な位置に記載できていますでしょうか。
    お手数をおかけいたしますが、ご確認のほど宜しくお願いいたします。
    尚、引き続き他の対処も試していきます。


    } else {
    //対象日のデータが無ければINSERT
    $sql = "INSERT INTO work (user_id, date, start_time, finish_time, rest_time, comment) VALUES (:user_id, :date, :start_time, :finish_time, :rest_time, :comment)";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':user_id', (int)$session_user['id'], PDO::PARAM_INT);
    $stmt->bindValue(':date', date('Y-m-d'), PDO::PARAM_STR);
    $stmt->bindValue(':start_time', $modal_start_time, PDO::PARAM_STR);
    $stmt->bindValue(':finish_time', $modal_finish_time, PDO::PARAM_STR);
    $stmt->bindValue(':rest_time', $modal_rest_time, PDO::PARAM_STR);
    $stmt->bindValue(':comment', $modal_comment, PDO::PARAM_STR);
    $stmt->execute();
    }

    echo'<pre>';
    var_dump($work);
    echo'</pre>';
    exit;
  2. var_dumpメソッドの使用を提案したのはデバックするためです。
    基本的には"あなた"がコードの動作を理解・確認するためのもので、「適切な位置」とはそれが実現できる位置です。

    行った操作に対して、プログラムの1行1句がどのように動いているか確信を持っていますか?
    変数の中身に何が入っていて、それがどのように変化し、条件分岐のどこを通るのか説明できますか?
    確信がないところでvar_dumpメソッドを使って確認しましょう。

    例えば変数の中身や、メソッドの戻り値を出力したりします。
    または適当な値を出力して「プログラムがそこを通った」ことを確認するのも良いでしょう。


    nullは値を持たないことを示すので、変数$workは値を持っていないことになります。
    ただ記載のコードを見ると変数$workがいきなり登場するので、それ以上の状況は分からないです。
    (おそらく記載外で初期化されているような雰囲気ですが・・・)
  3. @blue-chicken

    Questioner

    引き続き回答させていただきます。
    executeメソッド(戻り値を取得)の説明を読ませていただきました。
    ②executeメソッド(戻り値を取得)は実行後、当初の質問に添付している画像と
    同じ結果になりました。

    errorInfoメソッド(直近のエラー情報を取得)の説明を読ませていただきました。
    ③errorInfoメソッド(直近のエラー情報を取得)を実行後、"Array ( [0] => HY000 [1] => 1364 [2] => Field 'id' doesn't have a default value )"が表示されました。

    ①、②、③から、変数が定義されていない可能性を踏まえて、再度コードを見直します。

    以上経過報告をさせていただきました。ご確認宜しくお願いいたします。
  4. @blue-chicken

    Questioner

    @blue32a 様

    コメント拝見させていただきました。@blue32a 様のご指摘の通り、
    $workが値を持っておりませんでした。
    以下のコードの最後に "$work = $stmt->fetch();"を記入することで
    解決することができました。

    //対象日のデータがあるかチェクする
    $sql = "SELECT id FROM work WHERE user_id = :user_id AND date = :date LIMIT 1";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':user_id', (int)$session_user['id'], PDO::PARAM_INT);
    $stmt->bindValue(':date', date('Y-m-d'), PDO::PARAM_STR);
    $stmt->execute();
    $work = $stmt->fetch();
  5. @blue-chicken

    Questioner

    @blue32a 様
    対処方法から、デバッグを行う意味に至るまで、教えて下さり誠にありがとうございました。

    「行った操作に対して、プログラムの1行1句がどのように動いているか確信を持っていますか?
    変数の中身に何が入っていて、それがどのように変化し、条件分岐のどこを通るのか説明できますか?」

    何も意識しておりませんでしたので、胸に刺さりました。
    何のためにデバッグ処理をするのか、もう一度見直してこれから取り組んでいきます。
    貴重なお言葉をいただき、非常に勉強になりました。
    この度は、ありがとうございました。

Your answer might help someone💌