前提・実現したいこと
MAMP上でPHPを使い簡素なログイン機能を作っています。
新規登録からメールアドレス、ユーザー名、パスワードを入力し、その情報をDBテーブルに格納し、
ログインの際にはメールアドレスとパスワードを入力し、そのメールアドレスの行からパスワードが一致したらログイン成功というようなものです。
いくつかのパターンのときにエラーが返され、その原因を解明したいです。
原因がわかる方いらっしゃいましたら、教えていただきたいです。
よろしくお願いします。
発生している問題・エラーメッセージ・試したこと
新規登録では問題なくデータをテーブルに格納できるのですが、ログインの際にうまくいきません。
現在パターンとして三つあり、
一つ目は、実際にはありえないのですが、新規登録の際にメールアドレスとパスワードが数字のみで登録した場合(例えば、メールアドレス:111、ユーザー名:sample、パスワード:111)、その情報を使ってログインすると成功します。
二つ目は、メールアドレスとパスワードに文字が入っている場合(例えば、メールアドレス:sample@gmail.com、ユーザー名:sample、パスワード:sample)、では、'データベースエラー' が返されます。
三つ目は、メールアドレスは文字入り、パスワードが数字のみ(例えば、メールアドレス:sample@gmail.com、ユーザー名:sample、パスワード:111)では、'ユーザーIDあるいはパスワードに誤りがあります。1' が返されます。
該当のソースコード
php
1<?php 2session_start(); 3 4$db['host'] = "localhost"; 5$db['user'] = "root"; 6$db['pass'] = "root"; 7$db['dbname'] = "(データーベース名)"; 8 9//userdata:テーブル構成 10//mailadress (varchar(50) (UNIQUE) 11//username (varchar(20)) 12//password (varchar(100)) 13 14 15$errorMessage = ""; 16 17// ログインボタンが押された場合 18if (isset($_POST["login"])) { 19 // 1. ユーザIDの入力チェック 20 if (empty($_POST["mailadress"])) { // emptyは値が空のとき 21 $errorMessage = 'メールアドレスが未入力です。'; 22 } else if (empty($_POST["password"])) { 23 $errorMessage = 'パスワードが未入力です。'; 24 } 25 26 if (!empty($_POST["mailadress"]) && !empty($_POST["password"])) { 27 // 入力したユーザIDを格納 28 $mailadress = $_POST["mailadress"]; 29 30 // 2. ユーザIDとパスワードが入力されていたら認証する 31 $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']); 32 33 // 3. エラー処理 34 try { 35 $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 36 37 $stmt = $pdo->prepare('SELECT * FROM userdata WHERE mailadress=?'); 38 $stmt->execute(array($mailadress)); 39 40 $password = $_POST["password"]; 41 42 43 if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 44 if (password_verify($password, $row['password'])){ 45 $sql="SELECT * FROM userdata WHERE mailadress=$mailadress"; 46 $stmt=$pdo->query($sql); 47 foreach($stmt as $row){ 48 $row['username']; 49 } 50 $_SESSION["username"] = $row['username']; 51 header("Location: https://www.google.com"); 52 exit(); 53 }else { 54 $errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。1'; 55 } 56 } else { 57 $errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。2'; 58 } 59 } catch (PDOException $e) { 60 $errorMessage = 'データベースエラー'; 61 } 62 } 63} 64 65 66if (isset($_POST["signUp"])) { 67 // 1. ユーザIDの入力チェック 68 if (empty($_POST["username"])) { // 値が空のとき 69 $errorMessage = 'ユーザーIDが未入力です。'; 70 } else if (empty($_POST["mailadress"])) { 71 $errorMessage = 'メールアドレスが未入力です。'; 72 } else if (empty($_POST["password"])) { 73 $errorMessage = 'パスワードが未入力です。'; 74 } else if (empty($_POST["password2"])) { 75 $errorMessage = 'パスワードが未入力です。'; 76 } 77 78 if (!empty($_POST["username"]) &&!empty($_POST["mailadress"]) && !empty($_POST["password"]) && !empty($_POST["password2"]) && $_POST["password"] === $_POST["password2"]) { 79 // 入力したユーザIDとパスワードを格納 80 $mailadress=$_POST["mailadress"]; 81 $username = $_POST["username"]; 82 $password = $_POST["password"]; 83 84 // 2. ユーザIDとパスワードが入力されていたら認証する 85 $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']); 86 87 // 3. エラー処理 88 try { 89 $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 90 91 $stmt = $pdo->prepare("INSERT INTO userdata(mailadress,username,password) VALUES (?,?,?)"); 92 93 $stmt->execute(array($mailadress,$username, password_hash($password, PASSWORD_DEFAULT))); 94 95 $signUpMessage = ''.$username.'さん、登録が完了しました。あなたの登録メールアドレスは '. $mailadress. ' です。パスワードは '. $password. ' です。'; // ログイン時に使用するIDとパスワード 96 } catch (PDOException $e) { 97 $errorMessage = 'データベースエラー'; 98 } 99 } else if($_POST["password"] != $_POST["password2"]) { 100 $errorMessage = 'パスワードに誤りがあります。'; 101 } 102} 103?> 104 105 106 107 108<!doctype html> 109<html> 110 <head> 111 <meta charset="UTF-8"> 112 <title>ログイン</title> 113 </head> 114 <body> 115 <h1>ログイン画面</h1> 116 <form id="loginForm" name="loginForm" action="index.php" method="POST"> 117 <fieldset> 118 <legend>ログインフォーム</legend> 119 <div> 120 <font color="#ff0000"><?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?></font> 121 </div> 122 <label for="mailadress">メールアドレス</label><input type="text" id="mailadress" name="mailadress" placeholder="メールアドレスを入力" value="<?php if (!empty($_POST["mailadress"])) {echo htmlspecialchars($_POST["mailadress"], ENT_QUOTES);} ?>"> 123 <br> 124 <label for="password">パスワード</label><input type="password" id="password" name="password" value="" placeholder="パスワードを入力"> 125 <br> 126 <input type="submit" id="login" name="login" value="ログイン"> 127 </fieldset> 128 </form> 129 <br> 130 <h1>新規登録画面</h1> 131 <form id="loginForm" name="loginForm" action="index.php" method="POST"> 132 <fieldset> 133 <legend>新規登録フォーム</legend> 134 <div><font color="#ff0000"><?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?></font></div> 135 <div><font color="#0000ff"><?php echo htmlspecialchars($signUpMessage, ENT_QUOTES); ?></font></div> 136 <label for="mailadress">メールアドレス</label><input type="text" id="mailadress" name="mailadress" placeholder="メールアドレスを入力" value="<?php if (!empty($_POST["mailadress"])) {echo htmlspecialchars($_POST["mailadress"], ENT_QUOTES);} ?>"> 137 <br> 138 <label for="username">ユーザー名</label><input type="text" id="username" name="username" placeholder="ユーザー名を入力" value="<?php if (!empty($_POST["username"])) {echo htmlspecialchars($_POST["username"], ENT_QUOTES);} ?>"> 139 <br> 140 <label for="password">パスワード</label><input type="password" id="password" name="password" value="" placeholder="パスワードを入力"> 141 <br> 142 <label for="password2">パスワード(確認用)</label><input type="password" id="password2" name="password2" value="" placeholder="再度パスワードを入力"> 143 <br> 144 <input type="submit" id="signUp" name="signUp" value="新規登録"> 145 </fieldset> 146 </form> 147 </body> 148</html>
補足情報
PHP(7.3)
回答2件
あなたの回答
tips
プレビュー