前提・実現したいこと
ログイン機能でEメール検索またはパスワードの照会ができるようにし、ログイン機能を実装させたい。
現在、ログイン機能を実装しています。
ユーザーの新規登録は実装できたのですが、ログイン機能の実装ができません。
その中でも、Eメール検索またはパスワードの照会ができないため、作業が止まっている状況です。
発生している問題・エラーメッセージ
ログイン画面
ログインすると、Eメール検索またはパスワードの照会ができず、リダイレクトされる。
該当のソースコード
ログインフォーム
php
1<?php 2session_start(); 3 4$err = $_SESSION; 5 6$_SESSION = array(); 7session_destroy(); 8?> 9 10<!DOCTYPE html> 11<html lang="en"> 12<head> 13 <meta charset="UTF-8"> 14 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 15 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 16 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> 17 <link rel="stylesheet" href="/css/user.css"> 18 <title>worldcup</title> 19</head> 20<body> 21 <h2>ログイン</h2> 22 <?php if(isset($err['msg'])): ?> 23 <div class="login-err"><?php echo $err['msg']; ?></div> 24 <?php endif; ?> 25 <div class="signup-wrapper"> 26 <form action="login.php" method="POST" class="edit-form"> 27 <div class="mb-3"> 28 <label for="email" class="form-label">Eメール</label> 29 <?php if(isset($err['email'])): ?> 30 <div class="login-err"><?php echo $err['email']; ?></div> 31 <?php endif; ?> 32 <input type="email" class="form-control" id="email" name="email" value="" placeholder="Eメールアドレスを入力してください。"> 33 </div> 34 <div class="mb-3"> 35 <label for="password" class="form-label">パスワード</label> 36 <?php if(isset($err['password'])): ?> 37 <div class="login-err"><?php echo $err['password']; ?></div> 38 <?php endif; ?> 39 <input type="password" class="form-control" id="password" name="password" value="" placeholder="パスワードを入力してください。"> 40 </div> 41 <button type="submit" class="btn btn-primary">ログイン</button> 42 </form> 43 <a class="btn btn-primary register" href="signup_form.php" role="button">新規登録画面へ</a> 44 </div> 45</body> 46</html>
ログイン完了画面
php
1<?php 2ini_set('display_errors', "On"); 3session_start(); 4require_once(ROOT_PATH .'/Models/User.php'); 5 6$err = []; 7 8// Eメール未入力のバリデーション 9if(!$email = filter_input(INPUT_POST, 'email')) { 10 $err['email'] = 'メールアドレスを入力してください。'; 11} 12 13// パスワード未入力のバリデーション 14if(!$password = filter_input(INPUT_POST, 'password')) { 15 $err['password'] = 'パスワードを入力してください。'; 16} 17 18// バリデーションに引っかかった時、ログインフォームにリダイレクト 19if(count($err) > 0) { 20 $_SESSION = $err; 21 header('Location: login_form.php'); 22 return; 23} 24 25 26// ログイン成功の処理 27$user = new User(); 28$result = $user->login($email, $password); 29var_dump($result); 30 31// ログイン失敗の処理 32// if(!$result) { 33// header('Location: login_form.php'); 34// return; 35// } 36?> 37 38<!DOCTYPE html> 39<html lang="en"> 40<head> 41 <meta charset="UTF-8"> 42 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 43 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 44 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> 45 <link rel="stylesheet" href="/css/user.css"> 46 <title>worldcup</title> 47</head> 48<body> 49 <?php if(count($err) > 0): ?> 50 <?php foreach($err as $e): ?> 51 <p><?php echo $e ?></p> 52 <?php endforeach ?> 53 <?php else: ?> 54 <h2>ログイン完了</h2> 55 <?php endif ?> 56 <a href="../Players/index.php">選手一覧へ</a> 57</body> 58</html>
User.php ログインロジック
php
1<?php 2require_once(ROOT_PATH .'/Models/Db.php'); 3 4class User extends Db { 5 6 // Eメール検索 7 public function getUserByEmail($email) { 8 $sql = 'SELECT * FROM users WHERE email = :email'; 9 10 try 11 { 12 $sth = $this->dbh->prepare($sql); 13 $sth->bindValue(':email', $email, PDO::PARAM_STR); 14 $sth->execute(); 15 $user = $sth->fetch(PDO::FETCH_ASSOC); 16 return $user; 17 } catch(\Exception $e) { 18 return false; 19 } 20 } 21 22 // ログイン機能 23 public function login($email, $password) { 24 $result = false; 25 $user = $this->getUserByEmail($email); 26 27 // Eメール検索に失敗したときの処理 28 if(!$user) { 29 $_SESSION['msg'] = "Eメールが一致しません"; 30 return $result; 31 } 32 33 // パスワードの照会 34 if(password_verify($password, $user['password'])) { 35 session_regenerate_id(true); 36 $_SESSION['login_user'] = $user; 37 $result = true; 38 return $result; 39 } 40 41 // パスワード照会の失敗 42 $_SESSION['msg'] = "パスワードが一致しません"; 43 return $result; 44 } 45}
Db.php データベースの接続
php
1<?php 2 require_once(ROOT_PATH .'/database.php'); 3 4 class Db { 5 protected $dbh; 6 7 public function __construct($dbh = null) { 8 if(!$dbh) { 9 try { 10 $this->dbh = new PDO( 11 'mysql:dbname='.DB_NAME. 12 ';host='.DB_HOST, DB_USER, DB_PASSWD 13 ); 14 $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 15 } catch (PDOException $e) { 16 echo "接続失敗:".$e->getMessage()."\n"; 17 exit(); 18 } 19 } else { 20 $this->dbh = $dbh; 21 } 22 } 23 public function get_db_handler(){ 24 return $this->dbh; 25 } 26 }
試したこと・確認したこと
・データベースの接続は、ユーザーの新規登録などできるので問題ない。
・Eメール検索のgetUserByEmailのロジック部分は、
$user = new User(); $result = $user->getUserByEmail($email); var_dump($result);
で調べてみて、以下のように結果かえってくることは試しました。なので、getUserByEmailのロジックも特に問題ないと思ってます。
・
$user = new User(); $result = $user->login($email, $password); var_dump($result);
こちらを実行すると、bool(false)が返ってくる。なので原因はloginロジックにあり?
・loginロジックの中身を検証
php
1 // Eメール検索に失敗したときの処理 2 if(!$user) { 3 $_SESSION['msg'] = "Eメールが一致しません"; 4 return $result; 5 } 6 // パスワードの照会 7 if(password_verify($password, $user['password'])) { 8 session_regenerate_id(true); 9 $_SESSION['login_user'] = $user; 10 $result = true; 11 return $result; 12 }
■Eメール検索に失敗したときの処理をコメントアウト→つまりパスワード照会ができているか検証→NULLが返ってくる
■パスワード照会処理をコメントアウト→bool(false)が返ってくる
■$user['password']の中身を調べると、ハッシュ化された値は確認できる。
足りない情報があればお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。