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

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

ただいまの
回答率

88.91%

PHPでログイン機能がうまく動かないです。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 178
退会済みユーザー

退会済みユーザー

実現したい事

PHPの学習の一環でログイン機能を作っており、その実装がしたいです。
メールアドレスとパスワードを使ってログインする機能の実装を試みています。(パスワードのハッシュ化は行っていません。)

問題

ログインページから、メールアドレスとパスワードを入力してログインボタンを押しても本来行くはずのマイページに行きません。

状況
・データベースには登録済み仮ユーザーの値が入っている
・マイページのphp上(mypage.php)のエラーページへのリダイレクトは機能している

このような状況なので、データベースのデータと入力されたデータの照合に何か問題があると感じているのですが、原因がわかりません。

もしわかる方がいらっしゃいましたら、ご教授いただけると幸いです。

コード

<?php
  mb_internal_encoding("utf8");
  session_start();

  if (empty($_SESSION['id'])) {
    try {
      $pdo = new PDO ("mysql:dbname:XXXXX;host:XXXXXX;", "XXXXX", "XXXX");
    }catch (PDOException $e){
      die("<p>申し訳ございません。現在サーバーが混み合っており一時的にアクセスができません。
      <br>
      しばらくたってから再度ログインしてください。</p>
      <a href='http://localhost/login_mypage/login.php'>ログイン画面へ</a>"
      );
    }

    $stmt = $pdo -> prepare("select * from login_mypage where mail = ? and password = ?");

    $stmt -> bindValue(1, $_POST['mail']);
    $stmt -> bindValue(2, $_POST['password']);

    $stmt -> execute();
    $pdo = NULL;

    while ($row = $stmt -> fetch()){
      $_SESSION['id'] = $row['id'];
      $_SESSION['name'] = $row['name'];
      $_SESSION['mail'] = $row['mail'];
      $_SESSION['password'] = $row['password'];
      $_SESSION['picture'] = $row['picture'];
      $_SESSION['comments'] = $row['comments'];
    }

    // 値がなければエラー画面にリダイレクト
    if (empty($_SESSION['id'])){
      header("Location:login_error.php");
    }

    // ログイン保持にチェックがあれば、セッションに代入
    if (!empty($_POST['login_keep'])){
      $_SESSION['login_keep'] = $_POST['login_keep'];
    }
  }

  // ログインしていてログイン情報保持のセッションがある場合は、Cookieを作成
  if (!empty($_SESSION['id']) && !empty($_SESSION['login_keep'])) {
    setcookie('mail', $_SESSION['mail'], time()+60*60*24*7);
    setcookie('password', $_SESSION['password'], time()+60*60*24*7);
    setcookie('login_keep', $_SESSION['loginkeep'], time()+60*60*24*7);
    // ログインキープのセッションがなければCookie削除
  }else if (empty($_SESSION['login_keep'])){
    setcookie('mail', time()-1);
    setcookie('password', time()-1);
    setcookie('login_keep', time()-1);
  }

?>

ログイン画面のコード

ログイン画面のフォームのコードです。

<form action="mypage.php" method="post">
      <div class="form_contents">
        <div class="mail">
          <label>メールアドレス</label>
          <br>
          <input type="text" class="formbox" size="40" value="<?php if (isset($_SESSION['mail'])) {
            echo $_SESSION['mail'];
           } ?>" name="mail">
        </div>
        <div class="password">
          <label>パスワード</label>
          <br>
          <input type="password" class="formbox" size="40" value="<?php if (isset($_SESSION['password'])) {
            echo $_SESSION['password'];
           } ?>" name="password">
        </div>
        <div class="checkbox">
          <label><input type="checkbox" size="40" value="login_keep" name="login_keep" <?php if (isset($_COOKIE['login_keep'])) {
            echo "checked='checked'";
          } ?> >ログイン状態を保持する</label>
        </div>
        <div class="login_button">
          <input type="submit" class="submit_button" size="35" value="ログイン">
        </div>
      </div>
    </form>

試したこと

mypage.phpの最初のif文がおかしいかなと思い、

if (isset($_POST['mail'])) {・・・

に変更してみましたが、機能せずでした。
また、ここteratailで似たような質問を参考にしましたが、どれもうまくいかずでしたので、質問させていただきました。

お手数をおかけいたしますが、何卒お力添えいただけると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kai0310

    2020/07/18 14:46

    ログインボタンとなるものが見当たりません。該当部分のコードをご提示ください。
    formタグの部分など

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/07/18 14:47

    申し訳ございません。
    直ちに追加いたします。
    ご指摘いただき有難うございます!

    キャンセル

  • m.ts10806

    2020/07/18 16:25

    ひとつ前の質問、解決しないまま放置ですか…

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/07/18 16:57

    m.ts10806さん、
    前回の質問にお答えいただき有難うございます。

    放置ではなく、前回のモノは個人で自主的にやっているもので、こちらが提出課題として挙げられたのでこちらを先に対応したいと考えているためです。
    放置しているように感じさせてしまい、大変申し訳ございません。
    こちらの問題が解決し、登録内容の編集機能等の実装などの課題を終えてから、前回の自主的に取り組んでいたものに取り組んでいきたいと考えております。何卒よろしくお願い致します。

    キャンセル

回答 1

-1

login.phpのログインボタンのnameタグに「login」を追加し、mypage.phpの初めのif文を

if (isset($_POST['login']))

に変更すると解決しました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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