前提
現在PHPを使ってログイン機能の実装を試みています。既に新規登録してMyAdminに入力したデータ(ユーザー名、メールアドレス、パスワード(ハッシュ化済み))を送ることはできます。送られたデータはID付きで保管されています。
ログインするときにはメールアドレスとパスワードを入力してもらい、MyAdminに登録されてあるデータと照合し、一致する場合にはログイン成功となり、その他の場合にはログイン失敗となるようにしています。
しかしログインしたときにどうも登録された内容が確認できないようで、試しにvar_dumpを挟んでみると、どんな登録したデータにも「MyAdminに一致するデータがありません」と言わんばかりに"array(0) { }"と帰ってきます。恐らくメールアドレスとパスワードを照合する部分に何かしらのミスがあるのかなと思います。下のエラーメッセージにはログイン完了.phpファイル26行目にvar_dump($result, $err)としています。
どこにミスがあるのか教えてくださると嬉しいです。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- ログイン機能を動作するようにする
発生している問題・エラーメッセージ
bool(false) array(0) { }
該当のソースコード
ログイン完了.php
php
1<?php 2session_start(); 3 4require_once 'UserLogic.php'; 5 $err = []; 6 if(!$email = filter_input(INPUT_POST, 'email')) { 7 $err[] = 'メールアドレスを記入してください'; 8 } 9 if(!$password = filter_input(INPUT_POST, 'password')) { 10 $err[] ='パスワードを入力してください'; 11 } 12 13 if(count($err) > 0) { 14 $_SESSION = $err; 15 header('Location: ログイン.php'); 16 return; 17 } 18 19 $result = UserLogic::login($email, $password); 20 21 // if(!$result) { 22 // header('Location: ログイン.php'); 23 // return; 24 25 // } 26 var_dump($result, $err); 27 return; 28?> 29<!DOCTYPE html> 30<html lang="ja"> 31<head> 32 <meta charset="UTF-8"> 33 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 34 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 35 <title>ログイン完了</title> 36</head> 37<body> 38 <?php if(count($err) > 0) : ?> 39 <?php foreach($err as $e) : ?> 40 <p><?php echo $e ?></p> 41 <?php endforeach ?> 42 <?php else : ?> 43 <p>おかえり!</p> 44 <?php endif ?> 45 <a href="ログイン.php">戻る</a> 46</body> 47</html>
UserLogic.php
php
1<?php 2require_once 'dbconnect.php'; 3class UserLogic { 4 public static function createUser($userData) { 5 $result = false; 6 $sql = 'INSERT INTO users (username, email, password) VALUES (?, ?, ?)'; 7 8 $arr = []; 9 $arr[] = $userData['username']; 10 $arr[] = $userData['email']; 11 $arr[] = password_hash($userData['password'], PASSWORD_DEFAULT); 12 13 try{ 14 $stmt = connect()->prepare($sql); 15 $result = $stmt->execute($arr); 16 return $result; 17 } catch(\Exception $e){ 18 echo $e->getMessage(); 19 echo $e->getTraceAsString(); 20 die(); 21 // return $result; 22 } 23 } 24 25 public static function login($email, $password) { 26 $result = false; 27 $user = self::getUserByEmail($email); 28 29 if(!$user) { 30 $_SESSION['msg'] = 'emailが一致していないよ;;'; 31 return $result; 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 $_SESSION['msg'] = 'パスワードが一致していないよ;;'; 42 return $result; 43 } 44 45 public static function getUserByEmail($email) { 46 $sql = 'SELECT * FROM users WHERE email = ?'; 47 48 $arr = []; 49 $arr[] = $email; 50 51 52 try{ 53 $stmt = connect()->prepare($sql); 54 $stmt->execute($arr); 55 $user = $stmt->fetch(); 56 } catch(\Exception $e){ 57 echo $e->getMessage(); 58 echo $e->getTraceAsString(); 59 die(); 60 // return $result; 61 } 62 } 63}
dbconnect.php
php
1<?php 2require_once 'env.php'; 3function connect() { 4 $host = DB_HOST; 5 $db = DB_NAME; 6 $user = DB_USER; 7 $pass = DB_PASS; 8 9 $dsn = "mysql:host=$host;dbname=$db;charaset=utf8mb4"; 10 try { 11 $pdo = new PDO($dsn, $user, $pass, [ 12 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 13 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 14 ]); 15 return $pdo; 16 } catch(PDOExeption $e) { 17 echo '接続失敗です;;' . $e->getMessage(); 18 exit(); 19 } 20} 21

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/20 07:03
2022/09/20 08:08
2022/09/21 02:50