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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

3415閲覧

mysqlにてデーターベースからパスワードとidを取り出し、loginフォームを作りたい

YamamotoAtsushi

総合スコア17

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2017/06/11 15:14

編集2017/06/18 04:57

mysqlにid,userid,name,passwordを登録し、idとパスワードを取り出しログイン画面を出したいのですが、
うまくいきません。下記にコードとエラー画面、試したことを記載しますので教えて頂ければと思います。
まだ、phpのmysqlについて習って日が浅いのでどなたかご教授頂ければと思います。
よろしくお願いいたします。

ログイン画面 login.php

php

1<?php 2require 'password.php'; 3// セッション開始 4session_start(); 5 6$db['host'] = "localhost"; // DBサーバのurl 7$db['user'] = "testuser"; 8$db['pass'] = "testpass"; 9$db['dbname'] = "booksample"; 10 11// エラーメッセージの初期化 12$errorMessage = ""; 13 14// ログインボタンが押された場合 15if (isset($_POST["login"])) { 16 // 1.ユーザIDの入力チェック 17 if (empty($_POST["userid"])) { 18 $errorMessage = "ユーザIDが未入力です。"; 19 } else if (empty($_POST["password"])) { 20 $errorMessage = "パスワードが未入力です。"; 21 } 22 23 // 2.ユーザIDとパスワードが入力されていたら認証する 24 if (!empty($_POST["userid"]) && !empty($_POST["password"])) { 25 // mysqlへの接続 26 $mysqli = new mysqli($db['host'], $db['user'], $db['pass']); 27 if ($mysqli->connect_errno) { 28 print('<p>データベースへの接続に失敗しました。</p>' . $mysqli->connect_error); 29 exit(); 30 } 31 32 // データベースの選択 33 $mysqli->select_db($db['dbname']); 34 35 var_dump($db['dbname']); 36 37 // 入力値のサニタイズ 38 $userid = $mysqli->real_escape_string($_POST["userid"]); 39 var_dump($userid); 40 // クエリの実行 41 $query = "SELECT * FROM users WHERE name = '" . $userid . "'"; 42 43 $result = $mysqli->query($query); 44 var_dump($query); 45 var_dump($result); 46 if (!$result) { 47 print('クエリーが失敗しました。' . $mysqli->error); 48 $mysqli->close(); 49 exit(); 50 } 51 52 53 54 while ($row = $result->fetch_assoc()) { 55 // パスワード(暗号化済み)の取り出し 56 $db_hashed_pwd = $row['password']; 57 } 58 59 var_dump($db_hashed_pwd); 60 61 // データベースの切断 62 $mysqli->close(); 63 64 // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。 65 //if ($_POST["password"] == $pw) { 66 if (password_verify($_POST["password"], $db_hashed_pwd)) { 67 // 4.認証成功なら、セッションIDを新規に発行する 68 session_regenerate_id(true); 69 $_SESSION["USERID"] = $_POST["userid"]; 70 header("Location: main.php"); 71 exit; 72 } else { 73 // 認証失敗 74 $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。"; 75 } 76 } else { 77 // 未入力なら何もしない 78 } 79} 80 81 82 var_dump($db_hashed_pwd); 83 84 85?> 86<!doctype html> 87<html> 88 <head> 89 <meta charset="UTF-8"> 90 <title>サンプルアプリケーション</title> 91 </head> 92 <body> 93 <h1>ログイン機能 サンプルアプリケーション</h1> 94 <!-- $_SERVER['PHP_SELF']はXSSの危険性があるので、actionは空にしておく --> 95 <!--<form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST">--> 96 <form id="loginForm" name="loginForm" action="" method="POST"> 97 <fieldset> 98 <legend>ログインフォーム</legend> 99 <div><?php echo $errorMessage ?></div> 100 <label for="userid">ユーザID</label><input type="text" id="userid" name="userid" value=""> 101 <br> 102 <label for="password">パスワード</label><input type="password" id="password" name="password" value=""> 103 <br> 104 <input type="submit" id="login" name="login" value="ログイン"> 105 </fieldset> 106 </form> 107 </body> 108</html>

メイン画面 main.php

php

1<?php 2session_start(); 3 4// ログイン状態のチェック 5if (!isset($_SESSION["USERID"])) { 6 header("Location: logout.php"); 7 exit; 8} 9 10?> 11 12<!doctype html> 13<html> 14 <head> 15 <meta charset="UTF-8"> 16 <title>サンプルアプリケーション</title> 17 </head> 18 <body> 19 <h1>ログイン機能 サンプルアプリケーション</h1> 20 <!-- ユーザIDにHTMLタグが含まれても良いようにエスケープする --> 21 <p>ようこそ<?=htmlspecialchars($_SESSION["USERID"], ENT_QUOTES); ?>さん</p> 22 <ul> 23 <li><a href="logout.php">ログアウト</a></li> 24 </ul> 25 </body> 26</html> 27

logout.php

php

1<?php 2session_start(); 3 4if (isset($_SESSION["USERID"])) { 5 $errorMessage = "ログアウトしました。"; 6} 7else { 8 $errorMessage = "セッションがタイムアウトしました。"; 9} 10// セッション変数のクリア 11$_SESSION = array(); 12 13@session_destroy(); 14?> 15 16<!doctype html> 17<html> 18 <head> 19 <meta charset="UTF-8"> 20 <title>サンプルアプリケーション</title> 21 </head> 22 <body> 23 <h1>ログイン機能 サンプルアプリケーション</h1> 24 <div><?php echo $errorMessage; ?></div> 25 <ul> 26 <li><a href="login.php">ログイン画面に戻る</a></li> 27 </ul> 28 </body> 29</html>

出ているエラー
Notice: Undefined variable: db_hashed_pwd in C:\xampp\htdocs\login\login.php on line 59
59行目が、var_dumpで調べてもデーターベースからパスワードを引き出せていないというものでした。
空のnullという文字が出てきてしまいます。
試したことは、$query = "SELECT * FROM users WHERE name = '" . $userid . "'";のあとに

php

1$query = "SELECT * FROM users WHERE password;

をつけたり、
hash(sha1,"password")でパスワードを切れていないかを調べましたが、切れていないようです。
データーベース扱いが初めてなものでどなたかご教授頂ければと思います。
宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

php

1/* 2 while ($row = $result->fetch_assoc()) { 3 // パスワード(暗号化済み)の取り出し 4 $db_hashed_pwd = $row['password']; 5 } 6*/ 7 //$rows = $results->fetch_all(); 8 $rows = $result->fetch_all(); 9 header('Content-type: text/plain'); 10 var_dump($rows); 11 exit; 12```とやってみて、ちゃんと取得できているか確認してみるのはいかがですか? 13(間違えてました。修正しました。) 14 15追記 16--- 17`userid`が存在していなかったときの処理が入っていないですね。
if (password_verify($_POST["password"], $db_hashed_pwd)) { ↓↓↓↓ if (isset($db_hashed_pwd) && password_verify($_POST["password"], $db_hashed_pwd)) {

```あと、useridnameに入っている、って言うのに違和感を感じますが、どうなんでしょう?
実は、

php

1$query = "SELECT * FROM users WHERE userid = '" . $userid . "'"; 2```だったりしません?

投稿2017/06/18 07:37

編集2017/06/18 14:09
shi_ue

総合スコア4437

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

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

YamamotoAtsushi

2017/06/18 12:12

有難うございます。上記を確認してみますm(_ _)m
YamamotoAtsushi

2017/06/18 12:29

回答ありがとうございます。上記で確認するとnullということと致命的なエラーという言葉が出てくるようです。私の方でも工夫し見てますので、よい案があれば教えて頂ければと思います。
shi_ue

2017/06/18 13:08

コードが間違ってました。訂正しました。
YamamotoAtsushi

2017/06/18 13:14

ありがとうございます 確認した結果、$result内が全てnull(空)と出ていました。同じような質問した方がいてうまくいったということを書かれていたようなのですが、結果は同じように出ます。 object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(4) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } string(0) "" と出るようです。 お忙しい中すいません、、ご教授頂ければと思います
shi_ue

2017/06/18 13:24

$rowsはどうですか? Array ( ) って出ません?
YamamotoAtsushi

2017/06/18 13:51

遅い時間まで回答有難う御座います。はい。この「rows」というものが曲者で定義されていないものです! null空の配列というもので出てきます。これを超えない限り中々ログインまでたどり着かないようです。 私の方でも色々試してみます。
shi_ue

2017/06/18 14:02

いえ、曲者ではなく、SELECTの結果が0行なんです。 つまり、存在しない users をSELECTしています。
YamamotoAtsushi

2017/06/18 14:29

有難うございます。選択された結果がないということですね。了解いたしました。 上記2点確認致します。遅くまで申し訳ありません。
YamamotoAtsushi

2017/06/20 11:41

色々アドバイス頂きありがとうございます。どうもdb_hashed_password が違うと出るようです。再度、hash化したパスワードを含め、echoで出力してみたいと思います。
YamamotoAtsushi

2017/06/21 13:17

echoで$db_hashed_pwd を調べた結果ですが、きちんとhash化されたパスワードが検出されました。 おそらくですが、下記部分がおかしいのかなと思います。 if (password_verify($_POST["password"], $db_hashed_pwd)) { // 4.認証成功なら、セッションIDを新規に発行する session_regenerate_id(true); $_SESSION["USERID"] = $_POST["userid"]; header("Location: main.php"); exit; } else { // 認証失敗 $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。"; } } else { // 未入力なら何もしない } } どなたか書き方をご教授頂ければと思います。宜しくお願い致します。
shi_ue

2017/06/21 14:17

59行目のnoticeは直ったんですか?
rururu3

2017/06/21 14:49

テストとして password_verify($_POST["password"], $db_hashed_pwd) が正常に期待する戻り値になってるか確認するために、 上記だけを処理するPHPファイル作成してみて $_POST["password"]には想定パスワード文字列、 $db_hashed_pwdには出力された文字列を直接入れてみてチェックしてみてはいかがでしょうか ``` <?php $_ret = password_verify('想定してるパスワード', '$db_hashed_pwdの文字列'); var_dump($_ret); ``` って言う感じですね
rururu3

2017/06/22 03:07

あとheader関数での処理するならば、関数呼ばれる前に文字出力してはいけないはずなのでvar_dumpとかの出力はなくした方がいいかと
shi_ue

2017/06/22 05:09

rururu3さん、ぜひ回答してあげてください。
YamamotoAtsushi

2017/06/24 12:07

shi_ueさん、rururu3さんお二方とも有難うございます。rururu3さんの言う通りpassword_verfyでデバックしてみたら、falseということが出てきました。phpのホームページを調べたらpassword_verfyはpassword_hash関数のpassword_default関数を使って登録したパスワードでないと一致しないみたいです。なので、事前に登録した関数がhash256であったみたいなので、従来通り登録したパスワードをhash化し、データーベースに登録したhash化した関数と一致させるequal文を使わせて頂きました。 お二方とも有難う御座いますm(_ _)m
guest

0

ベストアンサー

テストとして
password_verify($_POST["password"], $db_hashed_pwd)
が正常に期待する戻り値になってるか確認するために、
上記だけを処理するPHPファイル作成してみて
$_POST["password"]には想定パスワード文字列、
$db_hashed_pwdには出力された文字列を直接入れてみてチェックしてみてはいかがでしょうか

<?php $_ret = password_verify('想定してるパスワード', '$db_hashed_pwdの文字列'); var_dump($_ret);

って言う感じですね

あとheader関数での処理するならば、関数呼ばれる前に文字出力してはいけないはずなのでvar_dumpとかの出力はなくした方がいいかと

投稿2017/06/24 02:42

rururu3

総合スコア5545

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問