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

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

ただいまの
回答率

89.11%

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 3,304

star24star

score 117

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

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

<?php
// セッション開始
  session_start();

  if (isset($_SESSION['id'])){
    // セッションにユーザIDがある=ログインしている
    // トップページに遷移する
    header('Location: db.php');

  } else if (isset($_POST['a_mail']) && isset($_POST['a_pass'])){
    // ログインしていないがユーザ名とパスワードが送信されたとき

    // データベースに接続
    $dsn = 'mysql:host=localhost;dbname=DB名;charset=utf8';
    $user = 'ユーザ名';
    $password = 'パスワード'; 

    try {
      $db = new PDO($dsn, $user, $password);
      $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
      // プリペアドステートメントを作成
      $stmt = $db->prepare(
        "SELECT * FROM テーブル名 WHERE a_mail=:a_mail AND a_pass=:a_pass"
      );

      // パラメータを割り当て
      $stmt->bindParam(':a_mail', $_POST['a_mail'], PDO::PARAM_STR);
      $stmt->bindParam(':a_pass', sha1($_POST['a_pass']), PDO::PARAM_STR);

      //クエリの実行
      $stmt->execute();

      if ($row = $stmt->fetch()){
        // ユーザが存在していたので、セッションにユーザIDをセット
        $_SESSION['id'] = $row['id'];
        header('Location: db.php');
        exit();
      } else {
        // 1レコードも取得できなかったとき
        // ユーザ名・パスワードが間違っている可能性あり
        // もう一度ログインフォームを表示
        header('Location: log001.php');
        exit();
      }
    } catch(PDOException $e){
      die('エラー:' . $e->getMessage());
    }

  } else {
    // ログインしていない場合はログインフォームを表示する
?>

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <title>ログイン</title>
</head>
<body>
  <h1>ログインフォーム</h1>
  <h2>ログイン</h2>
  <form action="log001.php" method="post">
    <p>ユーザ名:<input type="text" name="a_mail"></p>
    <p>パスワード:<input type="password" name="a_pass"></p>
    <p><input type="submit" value="ログイン"></p>
  </form>
</body>
</html>
<?php } ?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • star24star

    2015/05/11 12:00

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

    キャンセル

  • Tak1wa

    2015/05/11 12:20

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

    キャンセル

  • star24star

    2015/05/11 12:30

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

    キャンセル

回答 4

checkベストアンサー

+1

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
を設定してみてください。エラーの時に例外を吐くようになります。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/11 15:10

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

    キャンセル

  • 2015/05/11 15:33

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

    キャンセル

  • 2015/05/11 16:52

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

    キャンセル

+1

横からですが,

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/11 17:10

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

    キャンセル

  • 2015/05/12 00:17

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/13 17:55

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

    キャンセル

  • 2015/05/14 07:37

    回復しました

    キャンセル

  • 2015/05/14 12:15

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる