質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

2085閲覧

ログイン機能でEメール検索またはパスワードの照会ができない。bool(false)

退会済みユーザー

退会済みユーザー

総合スコア0

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2021/03/20 04:19

編集2021/03/20 08:22

前提・実現したいこと

ログイン機能で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 }

usersテーブルの構造
イメージ説明

試したこと・確認したこと

・データベースの接続は、ユーザーの新規登録などできるので問題ない。
・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']の中身を調べると、ハッシュ化された値は確認できる。

足りない情報があればお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ユーザーの新規登録画面で、無駄に$email,$passwordを定義していたことが原因でした。

投稿2021/03/20 09:05

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問