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

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

ただいまの
回答率

90.33%

  • PHP

    21413questions

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

  • MySQL

    6207questions

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

  • phpMyAdmin

    692questions

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

  • ログイン

    121questions

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

ECサイトにおけるログイン機能について

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 631
退会済みユーザー

退会済みユーザー

現在、ECサイトのログイン機能を作成しています。

データベース上に登録されている情報と照らし合わせて、一致するものがあればログインするという感じにしようと思っています。

<!-- login.php -->

<?php require 'function.php'; ?>
<!DOCTYPE html>
<html lang = "ja" dir = "ltr">
<head>
    <meta charset = "UTF-8"/>
    <link rel="stylesheet" href="style.css">
    <title>ログイン</title>
</head>

<body><div id = "login_all"><form method = "POST" action = "">

        <!-- タイトル -->
        <div id = "login_midasi">

            <h2>ログイン</h2>

        </div>

        <!-- 氏名入力ボックス -->
        <div id = "login_name">

            <p>氏名</p>
            <p><input type = "text" name = "login_name" value = ""></p>

        </div>

        <!-- パスワード入力ボックス -->
        <div id = "login_password">

            <p>パスワード</p>
            <p><input type = "text" name = "login_password" value = ""></p>

        </div>

        <!-- ログインボタン -->
        <div id = "login_login">

            <input class = "login_login" name = "login_login" type = "submit" value = "ログイン">

        </div>


</div> </body>
<!-- function.php -->
<!-- login.phpの処理 -->

<?php

    $db['host'] = "localhost";  // DBサーバのurl
    $db['user'] = "root";
    $db['pass'] = "";
    $db['dbname'] = "ec";

    // エラーメッセージの初期化
    $errorMessage = "";

    // ログインボタンが押された場合
    if(isset($_POST['login_login'])) {

        // 1.ユーザIDの入力チェック
        if (empty($_POST['login_name'])) {

            echo $errorMessage = "ユーザIDが未入力です。";

        } else if (empty($_POST['login_password'])) {

            echo $errorMessage = "パスワードが未入力です。";

        } 

    // 2.ユーザIDとパスワードが入力されていたら認証する
    if (!empty($_POST['login_name']) && !empty($_POST['login_password'])) {

        // mysqlへの接続
        $mysqli = new mysqli($db['host'], $db['user'], $db['pass']);

        if ($mysqli->connect_errno) {

            echo('<p>データベースへの接続に失敗しました。</p>' . $mysqli->connect_error);
            exit();

        }

        // データベースの選択
        $mysqli->select_db($db['dbname']);

        // 入力値のサニタイズ
        $userid = $mysqli->real_escape_string($_POST['login_name']);

        // クエリの実行
        $query = "SELECT * FROM user WHERE name = '" . $userid . "'";
        $result = $mysqli->query($query);

        if (!$result) {

             echo('クエリーが失敗しました。' . $mysqli->error);
            $mysqli->close();
            exit();

        }

        while ($row = $result->fetch_assoc()) {

              // パスワード(暗号化済み)の取り出し
              $db_hashed_pwd = $row['password'];

        }

        // データベースの切断
        $mysqli->close();

        // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。
        //if ($_POST["password"] == $pw) {
        if (password_verify($_POST['login_password'], $db_hashed_pwd)) {

            // 4.認証成功なら、セッションIDを新規に発行する
            session_regenerate_id(true);
            $_SESSION['user'] = $_POST['login_name'];
            header("Location: index.php");
            exit;

        } else {

        // 認証失敗
        echo $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。";

        } 
    }else {

        // 未入力なら何もしない

    } 
    } 
?>

このコードを使いログインチェックを行ったところ、
名前とパスワードの両方にデータベース上に存在しない適当な文字列を入力すると

Notice: Undefined variable: db_hashed_pwd in C:\xampp\htdocs\20\function.php on line 97
ユーザIDあるいはパスワードに誤りがあります。

このようにエラーとechoの中身が出ます。
解決方法お教えいただけませんでしょうか。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+4

db_hashed_pwdを定義すればいいのではないかと。

<?php
$db['host'] = "localhost";  // DBサーバのurl
$db['user'] = "root";
$db['pass'] = "";
$db['dbname'] = "ec";

// エラーメッセージの初期化
$errorMessage = "";
$db_hashed_pwd = ""; // 追加。
// ログインボタンが押された場合
if (isset($_POST['login_login'])) {

    // 1.ユーザIDの入力チェック
    if (empty($_POST['login_name'])) {

        echo $errorMessage = "ユーザIDが未入力です。";

    } else {
        if (empty($_POST['login_password'])) {

            echo $errorMessage = "パスワードが未入力です。";

        }
    }

    // 2.ユーザIDとパスワードが入力されていたら認証する
    if (!empty($_POST['login_name']) && !empty($_POST['login_password'])) {
        // mysqlへの接続
        $mysqli = new mysqli($db['host'], $db['user'], $db['pass']);
        if ($mysqli->connect_errno) {

            echo('<p>データベースへの接続に失敗しました。</p>' . $mysqli->connect_error);
            exit();

        }

        // データベースの選択
        $mysqli->select_db($db['dbname']);

        // 入力値のサニタイズ
        $userid = $mysqli->real_escape_string($_POST['login_name']);

        // クエリの実行
        $query = "SELECT * FROM `sample01` WHERE `name` = '" . $userid . "'";
        $result = $mysqli->query($query);

        if (!$result) {

            echo('クエリーが失敗しました。' . $mysqli->error);
            $mysqli->close();
            exit();

        }

        while ($row = $result->fetch_assoc()) {

            // パスワード(暗号化済み)の取り出し
            $db_hashed_pwd = $row['password'];

        }

        // データベースの切断
        $mysqli->close();

        // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。
        //if ($_POST["password"] == $pw) {
        if (password_verify($_POST['login_password'], $db_hashed_pwd)) {

            // 4.認証成功なら、セッションIDを新規に発行する
            session_regenerate_id(true);
            $_SESSION['user'] = $_POST['login_name'];
            header("Location: index.php");
            exit;

        } else {

            // 認証失敗
            echo $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。";

        }
    } else {

        // 未入力なら何もしない

    }
}
?>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/17 10:40

    すばやい回答ありがとございます。うまくいきました!

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    21413questions

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

  • MySQL

    6207questions

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

  • phpMyAdmin

    692questions

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

  • ログイン

    121questions

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