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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

Q&A

解決済

1回答

242閲覧

PHPとMySQLを使ったログイン機能を実装したい

DjangoUser

総合スコア24

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

0グッド

0クリップ

投稿2024/03/02 10:06

実現したいこと

・ログイン機能をPHPとMySQLで実装したいです。

前提

HTML、CSS、PHP、MySQLを使ってログイン機能付きのWebサイトを作成しています。 ログイン機能を実装中に以下の問題が発生しました。

発生している問題

正しく作成したフォームに入力したにもかかわらず、以下のような表示が出ています。
ユーザー名またはパスワードが違います。

該当のソースコード

PHP

1<?php 2// データベース接続情報 3$host = "SQLサーバーのURL"; 4$dbname = "データベース名"; 5$user = "データベースのユーザー名"; 6$password = "データベースのパスワード"; 7 8try { 9 // データベースに接続 10 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $password); 11 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 12 13 // ユーザー名を使用してユーザー情報を取得 14 $stmt = $pdo->prepare("SELECT * FROM テーブル名 WHERE username = :username"); 15 $stmt->bindParam(":username", $_POST["username"]); 16 $stmt->execute(); 17 $user_info = $stmt->fetch(PDO::FETCH_ASSOC); 18 19 if ($user_info && password_verify($_POST["password"], $user_info["password"])) { 20 // 認証成功 21 echo "ログイン成功!"; 22 } else { 23 // 認証失敗 24 echo "ユーザー名またはパスワードが違います。"; 25 } 26} catch (PDOException $e) { 27 echo "データベースエラー:" . $e->getMessage(); 28} 29?>

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4  <meta charset="UTF-8"> 5  <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6  <link rel="stylesheet" href="./css/style.css" type="text/css"> 7  <title>タイトル</title> 8 </head> 9 <body> 10  <div class="header"> 11   <img src="./img/header_logo.png" alt="ロゴ"> 12   <h1>h1タイトル</h1> 13  </div> 14  <div class="menu"> 15   <a href="./index.html">ホーム</a> 16   <a href="about.html"></a> 17   <a href="./about_staff.html"></a> 18   <a href="./about_teacher.html"></a> 19   <a href="./access.html"></a> 20   <a href="./login.html">関係者ログイン</a> 21  </div> 22  <div class="login-form"> 23   <form action="./php/login.php" method="post"> 24    <h2>関係者ログイン</h2> 25    <label for="username">ユーザー名:</label> 26    <input id="username" name="username"> 27    <br> 28    <label for="password">パスワード:</label> 29    <input id="password" name="password" type="password"> 30    <br> 31    <button name="login" type="submit">ログイン</button> 32   </form> 33  </div> 34</body> 35</html>

CSS

1html{ 2background-color: lightskyblue; 3} 4.header{ 5display: flex; 6} 7.header>h1{ 8color: white; 9margin: auto; 10} 11.header>img{ 12margin: auto; 13} 14.menu{ 15display: flex; 16margin: 15px; 17background-color: lightblue; 18} 19.menu>a{ 20margin: 10px; 21color: white; 22} 23.login-form{ 24text-align: center; 25} 26.login-form>h2{ 27background-color: blue; 28color: white; 29} 30.about_main>img{ 31width: 600px; 32height: auto; 33}

試したこと

・サーバーのphpMyAdminを使用し、列の名前を変更
・ユーザー名とパスワードを別々に認証するように変更しようとするも、方法がわからず。
・全体のコードの書き直し(上記のは最終的に作成した物です。)

補足情報(FW/ツールのバージョンなど)

Webサーバー:ロリポップのレンタルサーバー(ライトプラン)
サーバーのPHPのバージョン:8.2.12
サーバーのMySQLのバージョン:8.0
手元の環境
OS:Windows 10 Home 22H2
開発ツール・エディタ:Visual Studio Code 1.87.0

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

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

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

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

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

tezcello

2024/03/02 16:25

そのエラーメッセージをが返るのは > if ($user_info && password_verify($_POST["password"], $user_info["password"])) { の条件が偽の場合ですね。 なので、具体的に何がダメだったのかを var_dump($user_info,$_POST["password"], $user_info["password"],password_verify($_POST["password"], $user_info["password"])); とでもして確認しては?
DjangoUser

2024/03/03 01:00

確認したところ、 array(4) { ["id"]=> int(2) ["username"]=> string(9) "テスト" ["password"]=> string(9) "TTeesstt0" ["role"]=> string(7) "STUDENT" } string(9) "TTeesstt0" string(9) "TTeesstt0" bool(false) このようになりました。 なお、個人情報漏洩防止のために、テストユーザーを作成して試行しています。
Eggpan

2024/03/03 09:08

パスワードがハッシュ化されてなさそうなので、password_verifyに失敗しているのではないですか? password_verifyで検証する場合、password_hashで生成したパスワードを利用する必要があります。
tezcello

2024/03/03 14:56

既に指摘されていますが、最初にパスワードを登録する際に、password_hash()を使っていない様子ですから、password_verify()は利用できません。 パスワード登録時の処理を見直してください。 パスワードを平文で登録するのは、セキュリティ的にあり得ないので、ハッシュ値を保存する様に仕様を改めるべきだと思います。
DjangoUser

2024/03/04 04:47

コメントありがとうございます。password_verify()の第二引数をpassword_hash()で生成した値にしてみて試したところ問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
guest

回答1

0

ベストアンサー

そのエラーメッセージをが返るのは

if ($user_info && password_verify($_POST["password"], $user_info["password"])) {

の条件が偽の場合ですね。
なので、具体的に何がダメだったのかを調べる必要があります。

そして、最初にパスワードを登録する際に、password_hash()を使っていない様子ですから、password_verify()は利用できません。
パスワード登録時の処理を見直してください。

投稿2024/03/04 06:30

tezcello

総合スコア167

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

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

DjangoUser

2024/03/04 07:16

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問