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

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

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

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

Q&A

解決済

4回答

5140閲覧

SESSIONとDBを使用したログイン機能について

star24star

総合スコア115

PHP

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

0グッド

3クリップ

投稿2015/05/11 01:36

編集2015/05/11 02:12

ログイン画面より入力されたメールアドレス(ID)とPWが
データベースに登録されている情報と一致すればログイン成功(db.phpへ)。
不一致なら失敗でログイン画面(log001.php)をリダイレクトというプログラムを書いたのですが上手く動きません。
間違っている場所などのご指摘を頂けたら幸いです。宜しくお願い致します。

追記:何が上手くいかないのか野報告を忘れていました。申し訳ございません!
DBに登録したID/PWを入力してもログイン成功画面に移動せず、
リダイレクトされてしまいます。

lang

1<?php 2// セッション開始 3 session_start(); 4 5 if (isset($_SESSION['id'])){ 6 // セッションにユーザIDがある=ログインしている 7 // トップページに遷移する 8 header('Location: db.php'); 9 10 } else if (isset($_POST['a_mail']) && isset($_POST['a_pass'])){ 11 // ログインしていないがユーザ名とパスワードが送信されたとき 12 13 // データベースに接続 14 $dsn = 'mysql:host=localhost;dbname=DB名;charset=utf8'; 15 $user = 'ユーザ名'; 16 $password = 'パスワード'; 17 18 try { 19 $db = new PDO($dsn, $user, $password); 20 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 21 // プリペアドステートメントを作成 22 $stmt = $db->prepare( 23 "SELECT * FROM テーブル名 WHERE a_mail=:a_mail AND a_pass=:a_pass" 24 ); 25 26 // パラメータを割り当て 27 $stmt->bindParam(':a_mail', $_POST['a_mail'], PDO::PARAM_STR); 28 $stmt->bindParam(':a_pass', sha1($_POST['a_pass']), PDO::PARAM_STR); 29 30 //クエリの実行 31 $stmt->execute(); 32 33 if ($row = $stmt->fetch()){ 34 // ユーザが存在していたので、セッションにユーザIDをセット 35 $_SESSION['id'] = $row['id']; 36 header('Location: db.php'); 37 exit(); 38 } else { 39 // 1レコードも取得できなかったとき 40 // ユーザ名・パスワードが間違っている可能性あり 41 // もう一度ログインフォームを表示 42 header('Location: log001.php'); 43 exit(); 44 } 45 } catch(PDOException $e){ 46 die('エラー:' . $e->getMessage()); 47 } 48 49 } else { 50 // ログインしていない場合はログインフォームを表示する 51?> 52 53<html> 54<head> 55 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 56 <title>ログイン</title> 57</head> 58<body> 59 <h1>ログインフォーム</h1> 60 <h2>ログイン</h2> 61 <form action="log001.php" method="post"> 62 <p>ユーザ名:<input type="text" name="a_mail"></p> 63 <p>パスワード:<input type="password" name="a_pass"></p> 64 <p><input type="submit" value="ログイン"></p> 65 </form> 66</body> 67</html> 68<?php } ?> 69

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

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

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

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

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

Tak1wa

2015/05/11 01:48

こんにちは。 どううまくいかないですか?(例:db.phpに遷移しない。catchされてしまい○○というエラーが発生する)
Tak1wa

2015/05/11 02:27

可能性としては、1.一致するレコードがない、2.例外が発生している、3.未ログインだがユーザ名とパスワードが送信されていない、のどれかですよね。デバッグ実行またはログ出力などで上記のどのケースでこの現象が起きているのか絞れますか? もうひとつ、特に処理を入れずに「header('Location: db.php');」とした場合は正常に遷移しますか?ご確認お願い致します。
star24star

2015/05/11 03:00

SESSIONが上手くつなげられていないのかもしれませんね・・・。 処理をせずにdb.phpへというのはログインボタンを押したらdb.phpへ飛ぶかということでしょうか? 何も設定しなかったら遷移します。 デバックは調べてみます
Tak1wa

2015/05/11 03:20

何も設定しなかった場合に遷移するのであれば、遷移処理自体に問題はなさそうですね。 先に挙げた3つのどれかでしょうか…。
star24star

2015/05/11 03:30

1は問題なさそうです。 2か3だと思うのですが、まったく検討が付きません・・・
guest

回答4

0

リダイレクトされるというのがどこに対してなのかがわからないのでなんとも言えませんが…

試しに実行してみましたが、正しい情報を入力したらdb.phpに遷移しました。(db.phpは用意してないのでエラーですが。)
db.phpがどうなっているかと、具体的にデータベースに入っている値と画面に入力した値が気になります。

HTTPの通信内容的に、db.phpにリクエストしているのであればdb.php側の問題かと思います。
db.phpにリクエストしていないのであれば、パスワードのハッシュ値がおかしいのかもしれません。

投稿2015/05/15 02:14

TaMaMhyu

総合スコア1356

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

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

0

僕もこの前まで同じことしてたので参考程度にコード載せましょうか?

投稿2015/05/11 08:04

come25136

総合スコア258

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

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

star24star

2015/05/11 15:15

是非そうして頂けますとあり難いです! お手数をおかけしますがよろしくお願い致します!
come25136

2015/05/12 13:25

いい忘れてましたが僕のやつはmailではなくidを使います ちょっと書き換えればmailにも対応できると思います
come25136

2015/05/12 14:06

コードの方に質問があれば質問するの方から質問してください^^ 念の為にコメントしてくれるとありがたいです
come25136

2015/05/13 08:55

すいません(_ _) GitHubの方で"我々のロボットが、貴方を人間ではないとみなしています" 問題が出てまして現在回復待ち状態なのでもうしばらくお待ちください
star24star

2015/05/14 03:15

返信が遅れてしまい大変申し訳ございません! 是非参考にさせていただきますね! ありがとうございます
guest

0

横からですが,

IDのinput要素で,メールアドレスを使用するなら
<input type="email" name="...">

を使用すると,メールアドレスのフォーマットでないとsubmitが有効にならないのでお勧めです.

投稿2015/05/11 06:42

katzC4ISR

総合スコア66

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

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

come25136

2015/05/11 08:10

この要素はHTML5で追加されたものなのでメールアドレスの確認はPHP側でした方がいいと思います
star24star

2015/05/11 15:17

INPUTでそんな要素が追加されていたのですね! ありがとうございます。今後の参考にいたします メールアドレスをPHP側で確認するのも調べてみます!
guest

0

ベストアンサー

lang

1$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

を設定してみてください。エラーの時に例外を吐くようになります。

これで実行して、確認をしてみてください。

投稿2015/05/11 03:36

orange0190

総合スコア1698

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

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

star24star

2015/05/11 04:27

ありがとうございます! $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);を 入れた行(6)にエラーメッセージが出てしまいます Notice: Undefined variable: db in C:\xampp\htdocs\kadai4\log001.php on line 6 Fatal error: Call to a member function setAttribute() on null in C:\xampp\htdocs\kadai4\log001.php on line 6
orange0190

2015/05/11 04:34

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); の後に記述してください。
star24star

2015/05/11 04:36

申し訳ございません。ちゃんと見れば分かることですよね。 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);の後ろに入れてみたところ、エラー表示はなにもありませんでした
orange0190

2015/05/11 04:40

確認ですが、提示されているソースがlog001.phpでよろしいんですよね?
star24star

2015/05/11 04:48

はい!そうです!
orange0190

2015/05/11 05:10

では、bindParamをする前に var_dump($_POST['a_mail']); var_dump($_POST['a_pass']); をして、きちんと値が渡ってきているかを確認しましょう。
star24star

2015/05/11 05:41

えっと、Notice: Undefined index: a_mail in C:/・/・/log001.php on line 5 NULL と出るのでセットされていないのかもしれません・・・
orange0190

2015/05/11 05:57

その場合、そもそもデータベースへの確認処理が動作していません。 もう一度formの各要素から確認しましょう。
orange0190

2015/05/11 06:01

もしくはDOCTYPEの宣言がないためかもしれません。 <!DOCTYPE html> をhtmlタグの前に入れてみてください。
star24star

2015/05/11 06:10

DBにすら繫がっていないと言うことでしょうか それともDBには繋がっているがa_mailとa_passが見つからないのでしょうか
orange0190

2015/05/11 06:33

isset($_POST['a_mail']) && isset($_POST['a_pass']) の条件を満たさないため、再びformが表示されてるということです。
orange0190

2015/05/11 07:52

さらに情報を載せておきます。 必要ない感じがしますが、formに以下の属性を設定してみてください。 enctype="multipart/form-data"
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問