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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

2回答

1610閲覧

ログイン画面を作成したが機能していない理由が分からない

Keichi_Negishi

総合スコア24

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

1クリップ

投稿2020/09/16 06:52

実現したい事、困っている事

データベースに登録している情報と入力された情報が一致するとログインできる仕組みを作りたいです。
しかしログインとして機能しておらず、その理由が分かりません。

環境など

xamppを使用して作成しています。

データベースにはログインのための次の情報が登録されています。
データベース名:staff_data
code:1
name:根岸
password:bep123

検証した内容

・var_dump($data)すると、中には確かにデータ(コードとパスワード)が入っています。

・$staff_pass = md5($staff_pass);をコメントアウトすると、ページは飛びますがログインとして機能していません。
コメントアウトを外すと、「スタッフコードかパスワードが間違っています。」が表示されてしまいます。

コード

<body> <!--/.staff_login.phpの内容 --> <section class="wrapper"> <h1 class="login_hd">スタッフログイン</h1> <form class="form" method="post" action="staff_login_check.php"> <p>スタッフコード</p> <input type="text" name="code"> <p>パスワード</p> <input type="password" name="pass"> <button class="btn" type="button" onclick="submit();">ログインする</button> </form> </section><!--/.wrapper --> </body>

php

1<?php 2 3try{ 4 5 $staff_code = $_POST['code']; 6 $staff_pass = $_POST['pass']; 7 $staff_code = htmlspecialchars($staff_code,ENT_QUOTES,'UTF-8'); 8 $staff_pass = htmlspecialchars($staff_pass,ENT_QUOTES,'UTF-8'); 9 $staff_pass = md5($staff_pass); 10 11 $dsn = 'mysql:dbname=kaigo;host=localhost;charset=utf8'; 12 $user = 'root'; 13 $password = 'keichi2268'; 14 $dbh = new PDO($dsn,$user,$password); 15 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 16 17 $sql = 'SELECT name FROM staff_data WHERE code=? AND password=?'; 18 $stmt = $dbh->prepare($sql); 19 $data[] = $staff_code; 20 $data[] = $staff_pass; 21 $stmt->execute($data); 22 23 $dbh = null; 24 25 //データの中身を配列で返す 26 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 27 28 if($rec==false){ 29 print 'スタッフコードかパスワードが間違っています。<br>'; 30 print '<a href="staff_login.php">戻る</a>'; 31 }else{ 32 header('Location:../kaigo/person_add.php'); 33 exit(); 34 } 35 36}catch(Exception $e){ 37 print 'ただいま障害によりご迷惑をおかけしております'; 38 exit(); 39} 40 41?>

何が間違っているのか、ご教示いただけますと幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

$staff_code = $_POST['code']; $staff_pass = $_POST['pass']; $staff_code = htmlspecialchars($staff_code,ENT_QUOTES,'UTF-8'); $staff_pass = htmlspecialchars($staff_pass,ENT_QUOTES,'UTF-8'); $staff_pass = md5($staff_pass);
}catch(Exception $e){ print 'ただいま障害によりご迷惑をおかけしております'; exit(); }

この辺りの設計がかなりダイナミックに誤っている(10-15年前くらいの教本に書いてそうなコードです)ので、データベースに値を投入するところまで遡らないと解決しない気がします。
(もし独学で使用されている教材のコードであれば、教材の変更をお勧めせざるを得ないです)


とりあえず、まずやることは

  1. phpMyAdminでもコマンドラインのMySQLクライアントでも、MySQL WorkBenchなどのGUIツールでも何でも良いので、実行して正しい結果が出力されるSQLを一つ特定する。

正しいSQLにたどり着けないのであれば、そもそもDB設計 or データ投入時の処理についての理解が足りないので、そっちを先に理解できるようにする。

  1. SQLを1で取得した固定値に置き換えてみて、処理が正しく動くかを確認する。正しく動くなら前後の処理自体は正しいので$dataの処理が誤っているのでどこで誤った値になったか一つづつ遡ってvar_dump()なりxdebugでブレークポイントを仕掛けてチェックする。

正しく動かないなら前後の処理も誤っているのでそのあたりを一つづつ確認。

$sql = 'SELECT name FROM staff_data WHERE code=? AND password=?'; $stmt = $dbh->prepare($sql); $data[] = $staff_code; $data[] = $staff_pass; $stmt->execute($data);

$sql = '1で特定したSQLを固定文字列で入れる'; $stmt = $dbh->prepare($sql); // $data[] = $staff_code; // $data[] = $staff_pass; $stmt->execute();

というあたりかと思います。

投稿2020/09/16 07:16

編集2020/09/16 07:17
tanat

総合スコア18713

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

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

Keichi_Negishi

2020/09/16 13:05

ご回答ありがとうございます。 >この辺りの設計がかなりダイナミックに誤っている えぇー、そうなんですか? 実は、コードの大部分は教本に記載されているものを使用して書きました。 明日書いて頂いた内容をもとにコードの修正を行いたいと思います。 親切にありがとうございます。
tanat

2020/09/16 16:16 編集

書いたところもそうですが `PHP デバッグ方法`とかで検索してみて、どのようにしてデバッグをするのかを知るのを最初にするとその後の効率が大きく上がりますのでお勧めします。 > えぇー、そうなんですか? > 実は、コードの大部分は教本に記載されているものを使用して書きました。 うーん、であればキリの良いところで別の書籍を当たってみるか、 progate等のweb教材を当たる方が良いかもしれませんね。 出来れば書籍名を知りたいレベルです。 端的に言うと > $staff_pass = htmlspecialchars($staff_pass,ENT_QUOTES,'UTF-8'); > $staff_pass = md5($staff_pass); 典型的に誤った実装なので無駄に問題を複雑にしている上にセキュリティ的には今時こんなの書いてたら即プロとしての資質が疑われるレベルのコードです。 こんなものを真似してはいけません。 少なくとも14年前には専門家から警鐘が鳴らされているような書き方です。 http://takagi-hiromitsu.jp/diary/20060115.html > }catch(Exception $e){ > print 'ただいま障害によりご迷惑をおかけしております'; > exit(); > } こちらは、せっかく例外を検知してもその内容を握りつぶしてデバッグを困難にしています。 SQLにミスがあったり、DB接続が出来なかった場合は理由も分からずに失敗メッセージが出続けることになります。 生産性を大きく落とすコードと言えます。 絶対に真似をしてはいけません。 https://www.php.net/manual/ja/class.exception.php のサンプルコードを読んでみて、 Exception::getMessage() Exception::getTraceAsString() あたりを使って例外発生時に何が起きているかを把握出来るようにしてください。
Keichi_Negishi

2020/09/17 00:03

分かりました。PHPデバッグ方法を調べながらやってみます。 書籍名は谷藤賢一『気づけば プロ並み PHP改訂版』(2017年第1版)です。 1から勉強し直した方が良いと思いましたので、progate等をやってみようと思います。 色々と親切にありがとうございます。
tanat

2020/09/17 01:40

書籍名の情報ありがとうございます。 『気づけば プロ並み』は改定前のものが本当に不味くて各所から大きく批判されたものですね。 参考: https://blog.tokumaru.org/2014/10/php-book.html 改訂後のものは各所の意見を取り入れて改善されたものの、根本部分は変わっていない(コードが改定前の出版年の2013年前後のPHP5.3準拠だったり例外を握りつぶしてたり)ので、雰囲気をざっと掴む以上の使い方はしない方が良いのかなという印象です。 (teratailでもエラーで動かないという質問が結構ヒットしますね) PHPの入門書は安心に学べる定番と言えるものが無い(あってもとても古い)ので代替案を提示できないのが難しいところではあるのですが・・・
guest

0

何が間違っているのか

たくさんあります。

  • パスワードを平文で保存している
  • 画面表示しない情報にhtmlspecialchars()を入れている
  • データ上のパスワードが平文だがmd5()でハッシュ値を条件にしている

php

1echo md5("bep123"); //f5c9f5916ef4cecb8944d9b685dfb1df
  • try-catchで捕捉した例外を出力していない
  • fetch()の返却値は関数自体の正否なので「SELECTの実行結果、0件だった」が判定できるか微妙。
  • 成功した場合に遷移させているが、どこにもユーザー情報を保持しないまま遷移させているので、「誰でログインしたか」保持させる必要がある(例:セッション

PHPで推奨される対応はpassword_hash()によるハッシュ化とpassword_verify()による検証です。

参考:2018年のパスワードハッシュ
「2018年の」というタイトルですが、今でも通じると思いますし、最終的には「ソーシャルログインで十分、どうしてもならフレームワーク採用(自力で実装するな)」は変わらないと思います。

下記のような記事も参考にしてください。
PHPでログイン機能を実装するチュートリアル
PHPログイン機能

投稿2020/09/16 07:15

編集2020/09/16 07:23
m.ts10806

総合スコア80850

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

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

Keichi_Negishi

2020/09/16 13:07

ご回答ありがとうございます。 そんなに間違いだらけだとは... 明日記載の内容をもとに修正作業を行いたいと思います。
m.ts10806

2020/09/16 13:22

出版年数が1年以上前なら疑っていいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問