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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

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

PHP

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

データベース

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

ログイン

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

Q&A

解決済

2回答

2032閲覧

PHPのログイン処理がうまくいかない

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

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

PHP

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

データベース

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

ログイン

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

0グッド

0クリップ

投稿2021/04/14 04:20

編集2021/04/14 06:31

前提・実現したいこと

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'] = 'メールアドレスまたはパスワードが一致しません。';

しかし、状況は変わらずでした。

ご教示お願いいたします。

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

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

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

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

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

K_3578

2021/04/14 05:06

画像は<code>ブロック内だと表示されないので```で囲んだ中から出して頂ければ表示されます。
退会済みユーザー

退会済みユーザー

2021/04/14 05:57

>>画像は<code>ブロック内だと表示されないので```で囲んだ中から出して頂ければ表示されます。 →何のことを指しているのでしょうか??
K_3578

2021/04/14 05:58

Company.php(新規登録・ログインロジック) という<code>ブロックの中に画像入っているように見えますがこれは意図していない物でしょうか。
退会済みユーザー

退会済みユーザー

2021/04/14 06:01

すみません。ご指摘の通りミスでした。 データベースの画像を```の外からだし、画像を表示させました。
guest

回答2

0

ベストアンサー

一度エラーチェックした値が$_SESSION['msg']に入りっぱなしです。

そこからセッションの値が入れ替わっていないので、一度セッションに入った値はそこで
毎回、返されることになります。

PHP

1 2if($_SERVER['REQUEST_METHOD'] === 'POST'){ 3 $email = filter_input(INPUT_POST, 'email'); 4 $password = filter_input(INPUT_POST, 'password'); 5 6 if(empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) { 7 $err[] = "メールアドレスは必須です。また正しいメールアドレスで入力してください。"; 8 } 9 if(!$password = filter_input(INPUT_POST, 'password')) { 10 $err[] = "パスワードを記入してください。"; 11 } 12 // ログイン成功時の処理 13 $result = Company::login($email, $password); 14 $err[] = $_SESSION['msg']; //毎回元に戻される 15 var_dump($err); 16}

なので、$resultがtrueである場合は

PHP

1$_SESSION['msg'] = ""; //処理がうまくいえばセッションを空白にする

このようにして、エラーメッセージを出さないようにしましょう。

投稿2021/04/14 06:55

FKM

総合スコア3640

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

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

退会済みユーザー

退会済みユーザー

2021/04/14 07:03

ありがとうございます! // ログイン成功時の処理 $result = Company::login($email, $password); if($result == true) { $_SESSION['msg'] = ""; header('Location: login.php'); exit; } else { $err[] = $_SESSION['msg']; } このように記述して解決できました!
guest

0

ログイン成功した時に $_SESSION['msg'] をクリアしていないのではないでしょうか。

投稿2021/04/14 05:34

tabuu

総合スコア2449

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

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

退会済みユーザー

退会済みユーザー

2021/04/14 05:58

どのように記述すればいいのでしょうか?
退会済みユーザー

退会済みユーザー

2021/04/14 07:04

解決できました!コメントありがとうございます!
tabuu

2021/04/14 07:04

FKMさんが回答されている通りですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問