とログアウトは各ページから行うことが出来、php.l...
またmysql_error_log.errのエラー解消にてmy-default.cnfをコピーしてmy.cnfを作成するとのことですが、現在のMAMPだとmy-default.cnfは含まれなくなったようです。
https://teratail.com/questions/197701
今回の課題とは関係がないので、UPDATEの処理を記載してlogin_timeが更新されるかをご確認ください。
記載して頂いた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の条件にマッチするレコードが存在しないと思われます。
誤字で間違っていた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の時間自体は更新がされない原因となりますか?
大変長くなってしまいまい、申し訳ありません。お手数ですが、ご確認をよろしくお願い致します。
こちらはphpMyAdminにて実施されたのでしょうか?
その際のSQLを連携いただければと思います。
また、こちら側でソースコードにlogin_timeを更新する処理を追記して実行、及びphpMyAdminでSQLを実行してもlogin_timeは更新できました。
またこちらでもmysql_error_log.errにて同様のエラーが出ておりますが、login_timeの更新はできておりますので、関係はないかと思います。
ソースコードをにてどのようにlogin_timeの更新処理を実施しているか教えてください。
またusersテーブルのlogin_timeのカラム設定はどうなっているか(データの型)などを教えてください。
//例外処理
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';
$_SESSION['user_id'] = $result['id'];
この処理の後に、UPDATEの更新処理を記載してみてください。
また「login_time = :time WHERE email = :email」として:timeに「date('Y-m-d H:i:s')」、: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文のコード内に更新したい数値を入れなければいけないと思っていました。ご指導、ありがとうございました。
部活の学習一覧
Lesson 01
「WEBサービスと必要な機能」
Lesson 02
「画面を設計しよう!」
Lesson 03
「テーブルを設計しよう!part1」
Lesson 04
「テーブルを設計しよう!part2」
Lesson 05
「テーブルを設計しよう!part3」
Lesson 06
「DB作成」
Lesson 07
「画面を作ろう!」
Lesson 08
「画面を作ろう!part2」
Lesson 09
「ユーザー登録機能を作ろう!」
Lesson 10
「ユーザー登録機能を作ろう!part2」
コーヒーブレイク
「投資の小話」
Lesson 11
「ログイン機能を作ろう!」
Lesson 12
「ログアウト機能を作ろう!」
Lesson 13
「退会機能を作ろう!」
Lesson 14
「プロフィール編集機能を作ろう!」
コーヒーブレイク
「書いて書いて書きまくれ!」
Lesson 15
「パスワード変更機能を作ろう!」
Lesson 16
「パスワードリマインダー機能を作ろう!」
Lesson 17
「商品登録機能を作ろう!」
Lesson 18
「商品登録機能を作ろう!part2」
Lesson 19
「商品登録機能を作ろう!part3」
Lesson 20
「商品一覧表示機能を作ろう!」
Lesson 21
「商品詳細画面を作ろう!」
Lesson 22
「商品検索機能を作ろう!」
Lesson 23
「連絡掲示板機能を作ろう!」
Lesson 24
「お気に入り機能を作ろう!」
Lesson 25
「マイページ機能を作ろう!」
コーヒーブレイク
「はたらくプログラミング 第5話」
ご意見箱
[やってみたこと]
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からアップグレードを行いました。