前提・実現したいこと
PHPの自作アプリにてログイン処理を完成させたい。
現在、PHPで自作アプリを作成中です。
新規登録処理までは実装できたのですが、ログイン処理がうまくいきません。
発生している問題・エラーメッセージ
下記にもコード記載ありますが、login_form.php(ログイン画面)にて、
// ログイン成功時の処理 $result = Company::login($email, $password); $err[] = $_SESSION['msg']; var_dump($err);
この部分を実行すると、メールアドレスとパスワードが一致するのにもかかわらず、エラ〜メッセージが表示されます。
###以下、実行時の処理
####パターン①:全て何も入力しないとき
→バリデーションが働く
####パターン②:メールアドレスまたはパスワードが一致しないとき
→問題なく指定のエラ〜メッセージが表示される
####パターン③:今回問題になる、メールとパスワードが一致しているのにエラーが表示される
パターン②と同様の画面、処理が働く。
エラーメッセージ
該当のソースコード
login_form.php(ログイン画面)
php
1ログイン画面 2<a href="login.php">ログイン完了</a> 3 4<?php 5session_start(); 6require_once(ROOT_PATH .'/Models/Company.php'); 7ini_set('display_errors', "On"); 8 9$err = []; 10 11if($_SERVER['REQUEST_METHOD'] === 'POST'){ 12 $email = filter_input(INPUT_POST, 'email'); 13 $password = filter_input(INPUT_POST, 'password'); 14 15 if(empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) { 16 $err[] = "メールアドレスは必須です。また正しいメールアドレスで入力してください。"; 17 } 18 if(!$password = filter_input(INPUT_POST, 'password')) { 19 $err[] = "パスワードを記入してください。"; 20 } 21 // ログイン成功時の処理 22 $result = Company::login($email, $password); 23 $err[] = $_SESSION['msg']; 24 var_dump($err); 25} 26 27?> 28 29<!DOCTYPE html> 30<html lang="en"> 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 <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"> 36 <link rel="stylesheet" href="/css/register.css"> 37 <title>ログイン画面</title> 38</head> 39<body> 40 <div class="l-wrapper"> 41 <div class="l-container"> 42 <form action="" method="POST"> 43 <h1 id="login-title">ログイン</h1> 44 <?php if(count($err) > 0): ?> 45 <div class="alert alert-danger" role="alert"> 46 <?php foreach($err as $e): ?> 47 <ul> 48 <li><?php echo $e ?></li> 49 </ul> 50 <?php endforeach ?> 51 </div> 52 <?php endif; ?> 53 <div class="mb-3"> 54 <label for="kome"><font color="red">*</font></label> 55 <label for="email" class="form-label">メールアドレス</label> 56 <input type="email" class="form-control" id="email" name="email" placeholder="メールアドレスを入力してください。"> 57 </div> 58 <div class="mb-3"> 59 <label for="kome"><font color="red">*</font></label> 60 <label for="pass" class="form-label">パスワード</label> 61 <input type="password" class="form-control" id="password" name="password" name="password" placeholder="半角英数字で8文字以上"> 62 </div> 63 <div class="login_btn"> 64 <button type="submit" class="btn btn-primary">ログインする</button> 65 </div> 66 <div class="l-link"> 67 <div class="link-home"> 68 <a href="../../index.php">ホーム画面へ戻る</a> 69 </div> 70 <div class="link-register"> 71 <a href="signup_form.php">新規登録はこちら</a> 72 </div> 73 </div> 74 </form> 75 </div> 76 </div> 77</body> 78</html>
Company.php(新規登録・ログインロジック)
<?php require_once(ROOT_PATH .'/Models/Db.php'); ini_set('display_errors', "On"); class Company { /** * ユーザ-の登録 * @param array $userDate * @return bool $result */ public static function createCompany($companyDate) { $result = false; $sql = 'INSERT INTO companies (company_name, company_url, tel, postal_code, company_adress, email, password, role) VALUES (:company_name, :company_url, :tel, :postal_code, :company_adress, :email, :password, :role)'; $company_name = $companyDate['company_name']; $company_url = $companyDate['company_url']; $company_tel = $companyDate['company_tel']; $company_postal = $companyDate['company_postal']; $company_adress = $companyDate['company_adress']; $company_email = $companyDate['company_email']; $company_pass = password_hash($companyDate['company_pass'], PASSWORD_DEFAULT); try { $stmt = connect()->prepare($sql); $stmt->bindValue(':company_name', $company_name, PDO::PARAM_STR); $stmt->bindValue(':company_url', $company_url, PDO::PARAM_STR); $stmt->bindValue(':tel', $company_tel, PDO::PARAM_INT); $stmt->bindValue(':postal_code', $company_postal, PDO::PARAM_INT); $stmt->bindValue(':company_adress', $company_adress, PDO::PARAM_STR); $stmt->bindValue(':email', $company_email, PDO::PARAM_STR); $stmt->bindValue(':password', $company_pass, PDO::PARAM_STR); $stmt->bindValue(':role', 1, PDO::PARAM_INT); $result = $stmt->execute(); return $result; } catch(\Exception $e) { return $result; } } /** * ログイン処理 * @param string $email * @param string $password * @return bool $result */ public static function login($email, $password) { $result = false; // 会社をemailで検索 $company = self::getCompanyByEmail($email); if(!$company) { $_SESSION['msg'] = 'メールアドレスまたはパスワードが一致しません。'; return $result; } // パスワードの照会 if(password_verify($password, $company['password'])) { session_regenerate_id(true); $_SESSION['login_company'] = $company; $result = true; return $result; } else { $_SESSION['msg'] = 'メールアドレスまたはパスワードが一致しません。'; return $result; } } /** * ログイン処理 * @param string $email * @return array|bool $company|false */ public static function getCompanyByEmail($email) { $sql = 'SELECT * FROM companies WHERE email = :email'; try { $stmt = connect()->prepare($sql); $stmt->bindValue(':email', $email, PDO::PARAM_STR); $stmt->execute(); $company = $stmt->fetch(); return $company; } catch(\Exception $e) { return false; } } }
試したこと
・新規登録はでき、データベースにも登録はできているので、接続周りは確認ずみ。
// ログイン成功時の処理 $result = Company::login($email, $password); $err[] = $_SESSION['msg']; var_dump($err);
の、
$err[] = $_SESSION['msg'];
ここの記述に問題あり?
そこで、ログイン処理ロジックの
$_SESSION['msg'] = 'メールアドレスまたはパスワードが一致しません。';
部分を以下のように変更してみた。
$err['msg'] = 'メールアドレスまたはパスワードが一致しません。';
しかし、状況は変わらずでした。
ご教示お願いいたします。
回答2件
あなたの回答
tips
プレビュー