前提・実現したいこと
次回以降に自動でログインできる「自動ログイン機能」を追加したいです。
プログラムの機能として実装するとなった時、一般的によく使われている手法がありましたら教えていただきたいです。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
PHP
1<?php 2//ログインページ 3session_start(); //クッキーにセッションIDという合言葉を記憶して、サーバーも同じ合言葉を記憶する。 4unset($_SESSION['customer']); //顧客情報を配列$_SESSIONの添え字customerに格納する 5//同名のユーザーが既にログインしている場合はログアウトにする。 6//セッションデータから既に存在する顧客情報を削除する。(unset関数) 7 8$login = ''; //ブラウザで開いたときにNotice: Undefined indexが表示されないように初期化しておく 9$pass = ''; 10$msg = ''; //エラーメッセージ 11 12$host = 'localhost'; //ホスト名 13$username = '44580'; //ユーザー名 14$password = '44580'; //パスワード 15$dbname = '44580'; //データベース名 16$charset = 'utf8'; 17$dsn = 'mysql:dbname='.$dbname.';host='.$host.';charset='.$charset; 18 19//下から飛んできたログインとパスワードをそれぞれ定義する 20if ($_SERVER['REQUEST_METHOD'] === 'POST') { //下からpostで飛んでくるチェックする。 21 if (isset($_POST['login']) === TRUE) { 22 $login = filter_input(INPUT_POST, 'login', FILTER_SANITIZE_FULL_SPECIAL_CHARS); 23//バリデーション処理 24 //FILTER_SANITIZE_FULL_SPECIAL_CHARSはhtmlspecialchars() に ENT_QUOTES を指定してコール 25するのと同じ 26 //$login = htmlspecialchars($_POST['login'], ENT_QUOTES, 'UTF-8'); 27 } 28 if (isset($_POST['password']) === TRUE) { 29 $pass = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_FULL_SPECIAL_CHARS); 30 //$pass = htmlspecialchars($_POST['password'], ENT_QUOTES, 'UTF-8'); 31 } 32 33 try { 34 $dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4')); 35 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 36 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 37 $sql = 'SELECT id, name, login, password 38 FROM customer 39 WHERE login = ? and password = ?'; 40 $stmt = $dbh->prepare($sql); 41 $stmt->bindValue(1, $login, PDO::PARAM_STR); 42 $stmt->bindValue(2, $pass, PDO::PARAM_STR); //文字列はSTRにかえる 43 $stmt->execute([$login, $pass]); 44 45 foreach ($stmt as $row) { //$rowにはデータベースから取得した顧客テーブルの行が格納されている。 46 //var_dump($stmt); 47 $_SESSION['customer'] = ['id'=>$row['id'], 48 'name'=>$row['name'], 49 'login'=>$row['login'], 50 'password'=>$row['password']]; 51 } 52 53 } catch (PDOException $e) { 54 echo '接続できませんでした。理由:'.$e->getMessage(); 55 } 56 if (isset($_SESSION['customer']) === TRUE ) { 57 header("location: ./product.php"); //ログインに成功した場合のみ商品一覧(管理画面)ページに移動できるようにする。 58 exit(); //リダイレクト後は何もさせないようにexitを記述する。 59 //echo 'いらっしゃいませ、' . $_SESSION['customer']['name'] . 'さん。'; 60 } else if ($login === '' || $pass === '') { //ユーザー名 パスワードのどちらかが入力されていないときの処理 61 $msg = 'ログインする際は、ログイン名とパスワードを入力してください。'; 62 //ログインに失敗したらログイン専用ページに遷移する。 63 } else { 64 $msg = 'ログイン名またはパスワードが違います。'; 65 //ログインに失敗したらログイン専用ページに遷移する。 66 } 67} 68//コメントはHTML側ではなく、PHP側に書いておくこと 69 70// ログインページ 71// 「ユーザ名」「パスワード」を入力する項目を表示する。 72// 「ログイン」ボタンをクリックした場合、「ユーザ名」と「パスワード」が登録されているユーザ情報と一致したとき、 73// 「商品一覧ページ」に遷移する。 74// 「ログイン」ボタンをクリックした場合、「ユーザ名」と「パスワード」が登録されているユーザ情報と一致しない、 75// エラーメッセージを表示して、ログインすることができない。 76?> 77<!DOCTYPE html> 78<html lang="ja"> 79 <head> 80 <meta charset="UTF-8"> 81 <title>ログイン専用画面</title> 82 </head> 83 <body> 84 <form method="post"> 85 <h1>ログイン画面</h1> 86 <p class="form-item"> 87 <label>ユーザー名: <input type="text" name="login"></label> 88 </p> 89 <p class="form-item"> 90 <label>パスワード: <input type="password" name="password"></label> 91 </p> 92 <!--<p>--> 93 <!-- <label><input type="checkbox" id="save" name="save" value="on" />次回からは自動的にログインする</label>--> 94 <!--</p>--> 95 <p class="login"> 96 <input type="submit" value="ログイン"> 97 </p> 98 <form> 99 <div class="button"> 100 <a href="membership_registration.php">新規登録フォームはこちらから!</a> 101 </div> 102 </form> 103 </form> 104 <h1 style="color:#f00;"><?php echo $msg; ?></h1> 105 <div class="back"> 106 <a href="login.php">戻る</a> 107 </div> 108 </body> 109</html> 110 111
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。