• [問題点]ログイン
    とログアウトは各ページから行うことが出来、php.l...
  • guest 
    [問題点]ログインとログアウトは各ページから行うことが出来、php.logにも一連の処理の流れは出力されていました。しかし、MAMPのphpMyAdminのusersテーブルの表示で登録されているユーザーのlogin_time等が更新がされないエラーが起きています。

    [やってみたこと]
    mysql_error_log.errに大量にエラー文が記載されていました。

    ①[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

    暗黙的なDEFAULT値を持つTIMESTAMPは非推奨です。--explicit_defaults_for_timestampサーバーオプションを使用してください(詳細についてはドキュメントを参照)。

    ②[Warning] InnoDB: Table mysql/innodb_table_stats has length mismatch in the column name table_name. Please run mysql_upgrade


    ①のエラーは、my.cnfファイルにexplicit_defaults_for_timestamp = 1とコーディングをするとerrorが解決すると見つかりました。
    しかし、my.cnfファイルをVScodeで開きましたが、表示されるファイル名がmysql.serverとなっています。これは、コピー元のmysql.serverがただ表示されてしまっているのでしょうか。(VScodeでファイルを開く際は、「このアプリケーションは"my-huge.cnf"を開きます」と表示されます)

    また、ファイルが開けていた場合にどの箇所に explicit_defaults_for_timestamp = 1 を入力すれば良いのか教えて頂けると幸いです。

    ※my.cnfファイルをMAMP/Library/support-file/mysql.serverのファイルをコピーしてmy-huge.cnfとファイル名変更をして作成しました。

    ②のエラーは、MAMPのメニューバーのToolsのupgrade MySQL databaseからアップグレードを行いました。
    回答 0

     
    ログイン時にusersテーブルのlogin_timeが更新されないのは、ログイン処理時にlogin_timeを更新するSQLの処理が実施されてないからだと思います。

    またmysql_error_log.errのエラー解消にてmy-default.cnfをコピーしてmy.cnfを作成するとのことですが、現在のMAMPだとmy-default.cnfは含まれなくなったようです。

    https://teratail.com/questions/197701

    今回の課題とは関係がないので、UPDATEの処理を記載してlogin_timeが更新されるかをご確認ください。

    guest 
    返信して頂き、ありがとうございます。
    記載して頂いたURLを参考にして、my.cnfを作成しました。
    (VScodeエディタで、新規作成を行いmy.cnfファイルを作成しました。/Applications/MAMP/confにmy.cnfファイルを置きました。)

    UPDATの処理を調べて更新を行ってみました。更新の処理自体は行えましたが、やはりlogin_timeの時間自体は更新がされませんでした。(下記の様に表示されました。)

    0行変更しました。
    UPDATA users set login_time = "2020-3-11 07:15:02" WHERE id = 4;


    1つ下に投稿されている質問を間違えて送信してしまいました。
    大変お手数をお掛けしてしまいますが、削除して頂けると幸いです。



     
    以下の事項をご確認いただければと思います。

    ・「UPDATA」ではなく「UPDATE」です
    ・ idが4であるusersテーブルのレコードは存在しますか?

    「0行変更しました。」とあるので、WHEREの条件にマッチするレコードが存在しないと思われます。

    guest 
    上記の確認事項を確認しながら処理を行いました。
    誤字で間違っていたupdate文を修正しましたが、やはり0行変更しましたと表示されました。

    userテーブルのレコードは存在しました。もう1度、ログインを行ってphp.logを確認しました。debugは下記の様に表示されました。

    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:「 ログインページ
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 画面表示処理開始
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:セッションID:hfnjo29trmtcmhroc407jm0943
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:セッション変数の中身:Array
    (
    )

    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:現在日時タイムスタンプ:1584863392
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:未ログインユーザーです。
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:POST送信があります。
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:バリデーションOKです。
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:クエリ結果の中身:Array
    (
    [password] => $2y$10$or7JnFSnxBTYWzBxvGbCSecAm8lu.VrhIj7r98PWJwvhuPLnXawGu
    [id] => 4
    )

    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:パスワードがマッチしました。
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:ログイン保持にチェックはありません。
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:セッション変数の中身:Array
    (
    [login_date] => 1584863392
    [login_limit] => 3600
    [user_id] => 4
    )

    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:マイページへ遷移します。
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:画面表示処理終了 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:「 マイページ
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 画面表示処理開始
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:セッションID:70ue51i539vs5kamfijn5s5e0f
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:セッション変数の中身:Array
    (
    [login_date] => 1584863392
    [login_limit] => 3600
    [user_id] => 4
    )

    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:現在日時タイムスタンプ:1584863392
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:ログイン期限日時タイムスタンプ:1584866992
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:ログイン済みユーザーです。
    [22-Mar-2020 16:49:52 Asia/Tokyo] デバッグ:ログイン有効期限以内です。


    apache_error.logとmysql_error_log.errに次のコードが記載してありました。

    [apache_error.log]

    [notice] caught SIGTERM, shutting down
    [notice] Digest: generating secret for digest authentication ...
    [notice] Digest: done
    [notice] FastCGI: process manager initialized (pid 1822)
    [notice] Apache/2.2.34 (Unix) mod_wsgi/3.5 Python/2.7.13 PHP/7.4.2 mod_ssl/2.2.34 OpenSSL/1.0.2o DAV/2 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.11 Perl/v5.24.0 configured -- resuming normal operations

    SIGTERMをキャッチし、シャットダウンしました
    ダイジェスト:ダイジェスト認証のシークレットを生成しています...
    ダイジェスト:完了
    FastCGI:プロセスマネージャーの初期化(pid 1822)
    Apache / 2.2.34(Unix)mod_wsgi / 3.5 Python / 2.7.13 PHP / 7.4.2 mod_ssl / 2.2.34 OpenSSL / 1.0.2o DAV / 2 mod_fastcgi / mod_fastcgi-SNAP-0910052141 mod_perl / 2.0.11 Perl / v5。 24.0の構成-通常の操作の再開


    [mysql_error_log.err]
    warningエラーが3つありました。

    [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
    [警告]暗黙的なDEFAULT値を持つTIMESTAMPは非推奨です。 --explicit_defaults_for_timestampサーバーオプションを使用してください(詳細についてはドキュメントを参照)。

    [Warning] setting lower_case_table_names=2 because file system for /Applications/MAMP/db/mysql57/ is case insensitive
    [警告] / Applications / MAMP / db / mysql57 /のファイルシステムでは大文字と小文字が区別されないため、lower_case_table_names = 2を設定します

    [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
    [警告]次のSSLライブラリエラーのため、SSLのセットアップに失敗しました:SSLコンテキストは証明書と秘密キーなしでは使用できません

    3つ目のエラーを調べてみると、接続に SSL/TLS を使った暗号化した接続を行う方法などといったことが出てきました。このエラーはlogin_timeの時間自体は更新がされない原因となりますか?

    大変長くなってしまいまい、申し訳ありません。お手数ですが、ご確認をよろしくお願い致します。

     
    >誤字で間違っていたupdate文を修正しましたが、やはり0行変更しましたと表示されました。

    こちらはphpMyAdminにて実施されたのでしょうか?
    その際のSQLを連携いただければと思います。

    また、こちら側でソースコードにlogin_timeを更新する処理を追記して実行、及びphpMyAdminでSQLを実行してもlogin_timeは更新できました。

    またこちらでもmysql_error_log.errにて同様のエラーが出ておりますが、login_timeの更新はできておりますので、関係はないかと思います。

    ソースコードをにてどのようにlogin_timeの更新処理を実施しているか教えてください。
    またusersテーブルのlogin_timeのカラム設定はどうなっているか(データの型)などを教えてください。

    guest 
    login.phpファイルでのコードです。

    //例外処理
    try{
    // DBへ接続
    $dbh = dbConnect();
    // SQL文作成
    $sql = 'select password,id FROM users WHERE email = :email';
    $data = array(':email' => $email);
    // クエリ実行
    $stmt = queryPost($dbh, $sql, $data);
    // クエリ結果の値を取得
    $result = $stmt->fetch(PDO::FETCH_ASSOC);

    debug('クエリ結果の中身:'.print_r($result,true));

    // パスワード照合
    if(!empty($result) && password_verify($pass, array_shift($result))){
    debug('パスワードがマッチしました。');

    //ログイン有効期限(デフォルトを1時間とする)
    $sesLimit = 60*60;
    // 最終ログイン日時を現在日時に
    $_SESSION['login_date'] = time(); //time関数は1970年1月1日 00:00:00を0として、1秒経過するごとに1ずつ増加させた値が入る
    // ログイン保持にチェックがある場合
    if($pass_save){
    debug('ログイン保持にチェックがあります。');
    // ログイン有効期限を30日にしてセット
    $_SESSION['login_limit'] = $sesLimit * 24 * 30;
    }else{
    debug('ログイン保持にチェックはありません。');
    // 次回からログイン保持しないので、ログイン有効期限を1時間後にセット
    $_SESSION['login_limit'] = $sesLimit;
    }
    // ユーザーIDを格納
    $_SESSION['user_id'] = $result['id'];

    debug('セッション変数の中身:'.print_r($_SESSION,true));
    debug('マイページへ遷移します。');
    header("Location:mypage.php"); //マイページへ
    }else{
    debug('パスワードがアンマッチです。');
    $err_msg['common'] = MSG09;
    }

    } catch (Exception $e) {
    error_log('エラー発生:' . $e->getMessage());
    $err_msg['common'] = MSG07;
    }
    }

    >誤字で間違っていたupdate文を修正しましたが、やはり0行変更しましたと表示されました。

    phpMyAdminで処理を行いました。
    SQLは、 UPDATA users set login_time = "2020-3-11 07:15:02" WHERE id = 4; としました。

    このSQLだとid=4のlogin_timeを"2020-3-11 07:15:02"に変更するという処理になってしまい0行変更しましたと表示されてしまったと考えました。

    userテーブルのlogin_timeカラムの設定はデータ型はDATETIMEに設定してあります。その他の項目は何も設定していません。


    [やってみたこと]
    1. 現在日時をインサートする方法というのが調べて分かりました。下記の処理をphpMyAdminで行うとlogin_timeの時間が変わりました。

    update users set login_time = cast( now() as datetime ) WHERE id = 4;

    実行すると、phpMyAdminで上記の処理を行った現在日時になってしまい、ログインを行った現在日時で変更がされませんでした。

    2. 今度はlogin.phpファイルの$_SESSION['login_date'] = time();の後に、下記のupdate文を追加してログインを行ってみましたが、login_timeは変更されませんでした。

    $sql = 'update users set login_time = cast( now() as datetime ) where id = 4';



     
    // ユーザーIDを格納
    $_SESSION['user_id'] = $result['id'];

    この処理の後に、UPDATEの更新処理を記載してみてください。

    また「login_time = :time WHERE email = :email」として:timeに「date('Y-m-d H:i:s')」、:emailに$emailをプレースホルダとして設定し、実行してみてください。

    guest 
    $sql = 'update users set login_time = :time WHERE email = :email';
    $stmt = $dbh->prepare($sql);
    $params = array(':time' => date('Y-m-d H:i:s'),':email' => $email);
    $stmt->execute($params);

    上記のコードを追加したところ、無事にlogin_timeカラムとupdate_timeカラムが変更されました。

    update文で数値を更新する際に、update文のコード内に更新したい数値を入れなければいけないと思っていました。ご指導、ありがとうございました。