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

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

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

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

Q&A

解決済

1回答

1234閲覧

PHP 新規登録後ログインしようとするとログイン失敗してしまう

negiiti

総合スコア16

PHP

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

0グッド

0クリップ

投稿2019/01/07 08:30

編集2019/01/09 01:29

前提・実現したいこと

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

イメージ説明
イメージ説明

試したこと

入力したユーザー名・パスワードが間違っていないか確認しましたが合っています。
合っていてもログイン失敗になってしまいます。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/01/07 08:49

mysqlのアクセスで、トランザクション処理していないのはなぜ?
rururu3

2019/01/07 08:50

usersテーブルの情報および、どういうデータが入ってるかを記載していただけれると幸いです
退会済みユーザー

退会済みユーザー

2019/01/07 09:38

ファイルは分けて記述した方がわかりやすいかと
m.ts10806

2019/01/08 02:15

PDO使った方がいい気がする。。
negiiti

2019/01/09 01:55

ありがとうございます。ファイル分け、MySQL画像データの添付をしました。 トランザクション処理・PDOは存じ上げませんでした。 今回のソースコードは、今はもう閲覧できないのですがチームラボオンラインスキルアップ課題(https://team-lab.github.io/skillup/2/2.html)を元に書いていたので、書くべき処理が抜けているのかもしれません…
guest

回答1

0

ベストアンサー

php

1<?php 2var_dump(password_hash('aaaa', PASSWORD_DEFAULT));

でやったら

string(60) "$2y$10$Sg9mXpfYh3p0vlUsb286aOakNtayf6Y7Sojz4YTDMl2otP1mXVDNq"

ってなったのでpasswordのchar(41)では少なすぎるかもしれないですね。

http://php.net/manual/ja/function.password-hash.php
255ぐらいが適切ですって書いてるのでchar(255)にしてみたらいかがでしょう

投稿2019/01/09 02:12

rururu3

総合スコア5545

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

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

negiiti

2019/01/09 03:58

255に変更した所、無事ログイン成功できました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問