
###前提・実現したいこと
Qiita:PHPとMySQLで新規登録とログインを実装する(PDO使用)を参考に、PHPで会員制サイトを作っています。
このサイトで作れるものでは、ID(新規登録時に自動的に発行される番号)を使ってログインするのですが、これをメアドを使ってログインできるようにしたいです。
###発生している問題・エラーメッセージ
メールアドレスを入力する用のフォームとデータベース(phpMyAdmin)を作りました。新規登録でメールアドレスを登録することには成功しました。しかし、正しいメールアドレスとパスワードを入力してログインしようとしても、うまくいきません。
###該当のソースコード
PHP
1<?php 2require 'password.php'; // password_verfy()はphp 5.5.0以降の関数のため、バージョンが古くて使えない場合に使用 3// セッション開始 4session_start(); 5 6$db['host'] = "localhost"; // DBサーバのURL 7$db['user'] = "hogeUser"; // ユーザー名 8$db['pass'] = "hogehoge"; // ユーザー名のパスワード 9$db['dbname'] = "loginManagement"; // データベース名 10 11// エラーメッセージの初期化 12$errorMessage = ""; 13 14// ログインボタンが押された場合 15if (isset($_POST["login"])) { 16 // 1. ユーザIDの入力チェック 17 if (empty($_POST["userid"])) { // emptyは値が空のとき 18 $errorMessage = 'ユーザーIDが未入力です。'; 19 } else if (empty($_POST["password"])) { 20 $errorMessage = 'パスワードが未入力です。'; 21 } 22 23 if (!empty($_POST["userid"]) && !empty($_POST["password"])) { 24 // 入力したユーザIDを格納 25 $userid = $_POST["userid"]; 26 27 // 2. ユーザIDとパスワードが入力されていたら認証する 28 $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']); 29 30 // 3. エラー処理 31 try { 32 $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 33 34 $stmt = $pdo->prepare('SELECT * FROM userData WHERE id = ?'); 35 $stmt->execute(array($userid)); 36 37 $password = $_POST["password"]; 38 39 if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 40 if (password_verify($password, $row['password'])) { 41 session_regenerate_id(true); 42 43 // 入力したIDのユーザー名を取得 44 $sql = "SELECT * FROM userData WHERE id = $userid"; //入力した$useridのユーザー名を取得 45 $stmt = $pdo->query($sql); 46 foreach ($stmt as $row) { 47 $row['name']; // ユーザー名 48 } 49 $_SESSION["USERID"] = $row['name']; 50 header("Location: Main.php"); // メイン画面へ遷移 51 exit(); // 処理終了 52 } else { 53 // 認証失敗 54 $errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。'; 55 } 56 } else { 57 // 4. 認証成功なら、セッションIDを新規に発行する 58 // 該当データなし 59 $errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。'; 60 } 61 } catch (PDOException $e) { 62 $errorMessage = 'データベースエラー'; 63 //$errorMessage = $sql; 64 // $e->getMessage() でエラー内容を参照可能(デバック時のみ表示) 65 // echo $e->getMessage(); 66 } 67 } 68} 69?> 70 71<!doctype html> 72<html> 73 <head> 74 <meta charset="UTF-8"> 75 <title>ログイン</title> 76 </head> 77 <body> 78 <h1>ログイン画面</h1> 79 <!-- $_SERVER['PHP_SELF']はXSSの危険性があるので、actionは空にしておく --> 80 <!-- <form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST"> --> 81 <form id="loginForm" name="loginForm" action="" method="POST"> 82 <fieldset> 83 <legend>ログインフォーム</legend> 84 <div><font color="#ff0000"><?php echo $errorMessage ?></font></div> 85 <!--今回、入力フォームはメールアドレスではなくIDにしました。--> 86 <label for="userid">ユーザーID</label><input type="text" id="userid" name="userid" placeholder="ユーザーIDを入力" value="<?php if (!empty($_POST["userid"])) {echo htmlspecialchars($_POST["userid"], ENT_QUOTES);} ?>"> 87 <br> 88 <label for="password">パスワード</label><input type="password" id="password" name="password" value="" placeholder="パスワードを入力"> 89 <br> 90 <input type="submit" id="login" name="login" value="ログイン"> 91 </fieldset> 92 </form> 93 <br> 94 <form action="SignUp.php"> 95 <fieldset> 96 <legend>新規登録フォーム</legend> 97 <input type="submit" value="新規登録"> 98 </fieldset> 99 </form> 100 </body> 101</html>
HTML
1<label for="mailaddress">メールアドレス</label><input type="text" id="mailaddress" name="mailaddress" placeholder="メールアドレスを入力" value="<?php if (!empty($_POST["mailaddress"])) {echo htmlspecialchars($_POST["mailaddress"], ENT_QUOTES);} ?>">
というのを<legend>ログインフォーム</legend>の中に追加してみました。
(ただし、今は上記のように変更しています。)そして、上の<?php?>の中の"userid"を"mailaddress"に変えました。
しかし、「ユーザーIDあるいはパスワードに誤りがあります。」と出て、ログインがうまくいきませんでした。
回答3件
あなたの回答
tips
プレビュー