前提・実現したいこと
PHPで新規登録画面、ログイン画面、ホーム画面を作成しています。
新規登録画面(register.php)
任意のユーザー名・パスワードを入力しMySQLに重複するユーザー名が無ければ登録完了(重複あればエラー表示)
ログイン画面(login.php)
先程登録したユーザー名・パスワードを入力し、正しければホーム画面に画面遷移
ホーム画面(loginhome.php)
プルダウンメニューでカテゴリを選んで任意の文を投稿できる(投稿ボタンで送信)
発生している問題
新規登録画面での入力・ボタン操作は問題なく動くのですが、
ログイン画面で先程登録完了したユーザー名・パスワードを入力するとログイン失敗になってしまいます。
該当のソースコード(register.php)
<?php $mysqli = new mysqli('localhost', 'root', '', 'users'); $status = "none"; if(!empty($_POST["username"]) && !empty($_POST["password"])){ //パスワードはハッシュ化する $password = password_hash($_POST["password"], PASSWORD_DEFAULT); //ユーザ入力を使用するのでプリペアドステートメントを使用 $stmt = $mysqli->prepare("INSERT INTO users VALUES (?, ?)"); $stmt->bind_param('ss', $_POST["username"], $password); if($stmt->execute()) $status = "ok"; else //既に存在するユーザ名だった場合INSERTに失敗する $status = "failed"; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>新規登録</title> </head> <body> <h1>新規登録</h1> <?php if($status == "ok"): ?> <p>登録完了</p> <?php elseif($status == "failed"): ?> <p>エラー:既に存在するユーザ名です。</p> <?php else: ?> <form method="POST" action="register.php"> ユーザ名:<input type="text" name="username" /> パスワード:<input type="password" name="password" /> <input type="submit" value="登録" /> </form> <?php endif; ?> </body> </html>
該当のソースコード(login.php)
<?php //セッション開始 session_start(); $mysqli = new mysqli('localhost', 'root', '', 'users'); $status = "none"; //セッションにセットされていたらログイン済み if(isset($_SESSION["username"])) $status = "logged_in"; else if(!empty($_POST["username"]) && !empty($_POST["password"])){ //ユーザ名が一致する行を探す $stmt = $mysqli->prepare("SELECT password FROM users WHERE username = ?"); $stmt->bind_param('s', $_POST["username"]); $stmt->execute(); //結果を保存 $stmt->store_result(); //結果の行数が1だったら成功 if($stmt->num_rows == 1){ $stmt->bind_result($pass); while ($stmt->fetch()) { if(password_verify($_POST["password"], $pass)){ $status = "ok"; //セッションにユーザ名を保存 $_SESSION["username"] = $_POST["username"]; break; }else{ $status = "failed"; break; } } }else $status = "failed"; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>ログイン</title> </head> <body> <h1>ログイン</h1> <?php if($status == "logged_in"): http_response_code( 301 ) ; header( "Location: localhost/loginhome.php" ) ; exit ; ?> <p>ログイン済み</p> <?php elseif($status == "ok"): ?> <p>ログイン成功</p> <?php elseif($status == "failed"): ?> <p>ログイン失敗</p> <?php else: ?> <form method="POST" action="login.php"> ユーザ名:<input type="text" name="username" /> パスワード:<input type="password" name="password" /> <input type="submit" value="ログイン" /> </form> <?php endif; ?> </body> </html>
該当のソースコード(loginhome.php)
<?php session_start(); //ログイン状態チェック if(!isset($_SESSION["NAME"])) { header("Location:Login.php"); exit; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>練習サイトの作成</title> <link href="" rel="stylesheet"> </head> <body> <h1>ホーム画面</h1> <p>ようこそ<u><?php echo htmlspecialchars($_SESSION["NAME"],ENT_QUOTES); ?></u>さん</p> <input type="submit" value="トップへ戻る"> <br> <br> <form action="/touroku.php" method="post"> 投稿内容を記入後 カテゴリを選択してください<br /> <textarea name="comment" cols="30" rows="5"></textarea> <select name="category[]"size="2"multiple> <option value="basyo"selected>場所</option> <option value="kikai"selected>機械</option> <option value="sakuhin"selected>作品</option> <option value="seikatsuyouhin"selected>生活用品</option> <option value="shikouhin"selected>嗜好品</option> <option value="tabemono"selected>食べ物</option> <option value="kenchiukubutu"selected>建築物</option> <option value="norimono"selected>乗り物</option> <input type="submit" value="投稿する"> </select> </body> </html>
MySQL
試したこと
入力したユーザー名・パスワードが間違っていないか確認しましたが合っています。
合っていてもログイン失敗になってしまいます。
回答1件
あなたの回答
tips
プレビュー