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

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

ただいまの
回答率

90.49%

  • PHP

    20787questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 1,986

star24star

score 109

ログイン画面より入力されたメールアドレス(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 13: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

    キャンセル

  • 2015/05/11 13:34

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

    キャンセル

  • 2015/05/11 13:36

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

    キャンセル

  • 2015/05/11 13:40

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

    キャンセル

  • 2015/05/11 13:48

    はい!そうです!

    キャンセル

  • 2015/05/11 14:10

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

    キャンセル

  • 2015/05/11 14:41

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

    キャンセル

  • 2015/05/11 14:57

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

    キャンセル

  • 2015/05/11 15:01

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

    キャンセル

  • 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/12 00:15

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

    キャンセル

  • 2015/05/12 22:06

    GitHubにコードを載せました(初めてのGitHubなのでミスがあるかもしれません)
    https://github.com/homebox25136/login_from

    キャンセル

  • 2015/05/12 22:25

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

    キャンセル

  • 2015/05/12 23:06

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

    キャンセル

  • 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にリクエストしていないのであれば、パスワードのハッシュ値がおかしいのかもしれません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

関連した質問

  • 解決済

    php ログインについて

    お世話になります。 現在phpでログイン画面を作っているのですがうまくいかず困っています。 ********** <?php require_once 'h.php'; # 

  • 解決済

    ユーザー登録画面を作成中ですが、エラーが出てしまいます。

    webサービスのユーザー登録画面を作成中ですが、エラーが出てしまいます。どのように修正すれば良いかアドバイスを頂けませんでしょうか? 以下登録画面のHTML&PHPです。 コード

  • 解決済

    PHP とMYSQLで企業情報の登録するやり方

    前提・実現したいこと 皆様こんちわphp初心者です。HTMLで作ったフォームからPHPとMYSQLで企業情報を登録する物を作ってますが、 この先、どのようにDBに反映できるよう

  • 解決済

    会員制サイト:メールアドレスでログイン

    前提・実現したいこと Qiita:PHPとMySQLで新規登録とログインを実装する(PDO使用)を参考に、PHPで会員制サイトを作っています。 このサイトで作れるものでは、ID

  • 受付中

    PHPのFatal errorについて

    気づけばプロ並みPHP という書籍で勉強しているのですが Fatal error: Uncaught exception 'PDOException' with message

  • 受付中

    フォームで受け取ったデータをデータベースに登録したい。

    新規登録画面を作成中です(入力内容をデータベースに保存) フォームで受け取ったデータを作成済みのテーブルに登録したいのですが、 うまくいきません。 調べてるうちにどんどんわか

  • 解決済

    【PHP】ログイン機能の実装

    PHP初心者です。 PHPの勉強がてら、会員制のページを作成してます。 新規会員登録機能は実装できていますが、 ログイン機能の実装がうまくいきません。 やりたいことを実

  • 解決済

    MySQLへの登録ができない

    フォームに入力したデータをデーバベースに登録したいのですが、「登録が完了しました」というメッセージが表示されているのですが、なぜかデータベースには登録されていません。もしかしたら、

同じタグがついた質問を見る

  • PHP

    20787questions

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