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

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

ただいまの
回答率

88.77%

事前にログイン情報をDBに登録しましだが、ログイン処理が上手く進めません。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 300

dashu_sena

score 2

前提・実現したいこと

phpの初心者です。

Windowsを使用し、開発環境Eclipse、サーバーはXMAPPを使用しています。

現在、たにぐち まこと著「よくわかるPHPの教科書PHP5.5対応版」で学習を進めております。
「ログインの仕組みを作成する」の中で、ユーザーログインする際、画面初期表示でメールアドレス入力欄にエラーメッセージが表示されました。

もし、エラーメッセージを無視して、そのままログイン情報を入力後、ログインボタンを押下すると、画面にエラーメッセージが表示されました。

発生している問題・エラーメッセージ

初期表示-エラーメッセージ.

Notice: Undefined variable: error in C:\pleiades\xampp\htdocs\xampp\workspace\mailForm\login.php on line 60


「ログインする」ボタン押下後.

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, object given in  C:\pleiades\xampp\htdocs\xampp\workspace\mailForm\login.php on line 17

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, object given in C:\pleiades\xampp\htdocs\xampp\workspace\mailForm\login.php on line 18

Warning: mysqli_query() expects parameter 1 to be mysqli, boolean given in C:\pleiades\xampp\htdocs\xampp\workspace\mailForm\login.php on line 20

Warning: mysqli_error() expects parameter 1 to be mysqli, boolean given in C:\pleiades\xampp\htdocs\xampp\workspace\mailForm\login.php on line 20

 

該当のソースコード

DB情報
データベース名:mini_bbs
テーブル名:members

テーブル構造: 定義 AI
id INT(11)
name VARCHER(255)
email VARCHER(255)
password VARCHER(100)
picture VARCHER(255)
created DATETIME
modified TIMESTAMP

手動でDBテーブルmemberに以下の情報を挿入しました。

id name email picture created modified
1 管理者 admin@test.com 2020-05-14 00:00:00 2020-05-14 22:59:59

DB接続<dbconnect.php>

<?php
try {
  $db = new PDO('mysql:dbname=mini_bbs;host=localhost;charset=utf8', 'root', '');
} catch (PDOException $e) {
  echo 'DB接続エラー: ' . $e->getMessage();
}
 ?>

ログイン画面<login.php>

<?php
require ('dbconnect.php');

session_start();

if (isset($_COOKIE['email']) != '') {
    $_POST['email'] = $_COOKIE['email'];
    $_POST['password'] = $_COOKIE['password'];
    $_POST['save'] = 'on';

}

if (!empty($_POST)) {
    //ログイン処理
    if ($_POST['email'] != '' && $_POST['password'] != '') {
        $sql = sprintf('select * from members where email="%s" and password = "%s"',
        mysqli_real_escape_string($db,$_POST['email']),
        mysqli_real_escape_string($db,sha1($_POST['password']))
        );
        $record = mysqli_query(isset($db), $sql) or die (mysqli_error(isset($db)));
        if ($table = mysqli_fetch_assoc($record)) {
            //ログイン成功
            $_SESSION['id'] = $table['id'];
            $_SESSION['time'] = time();

            //ログイン情報を記録する
            if ($_POST['save'] =- 'on') {
                setcookie('email', $_POST['email'], time()+60*60*24*14);
                setcookie('password', $_POST['password'], time()+60*60*24*14);
            }
            header('Location; index.php');exit();
         } else {
            $error['login'] = 'failed';
         }
    } else {
        $error['login']='blank';
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8" />
  <script type="text/javascript" charset="UTF-8"></script>
</head>
<body>
  <div id="lead">
      <p>メールアドレスとパスワードを記入してログインしてください。</p>
      <p>入会手続きがまだの方はこちらからどうぞ</p>
      <p>&raquo;<a href="join/">入会手続きをする</a></p>
  </div>
  <form action="" method="post">
      <dl>
          <dt>メールアドレス</dt>
          <dd>
              <input type="text" name="email" size="35" maxlength="255" value="<?php echo filter_input(INPUT_POST,"email"); ?>" />
              <?php if (isset($error['login'])): ?>
              <p class="error">* メールアドレスとパスワードをご記入ください</p>
              <?php endif; ?>
              <?php if ($error['login'] == 'failed'): ?>
              <p class="error">* ログイン失敗したした。正しくご記入ください。</p>
              <?php endif; ?>
          </dd>
          <dt>パスワード</dt>
          <dd>
              <input type="password" name="password" size="35" maxlength="255" value="<?php echo filter_input(INPUT_POST,"password"); ?>" />
          </dd>
          <dt>ログイン情報の記録</dt>
          <dd>
              <input id="save" type="checkbox" name="save" value="on"><label for="save">次回からは自動的にログインする</label>
          </dd>
      </dl>
     <div><input type="submit" value="ログインする" /></div>
  </form>
</body>
</html>

試したこと

//メールアドレス入力欄 
<input type="text" name="email" size="35" maxlength="255" value="<?php echo filter_input(INPUT_POST,"email"); ?>" />

//パスワード入力欄 
<input type="password" name="password" size="35" maxlength="255" value="<?php echo filter_input(INPUT_POST,"password"); ?>" />

上記に提示しておりましたソースにvalue値を以下の通りで試して修正しましたが、解決しませんでした。

?修正前:
<?php echo htmlspecialchars($_POST['email']); ?>
 
▲修正後:
<?php echo filter_input(INPUT_POST,"email"); ?>

補足情報(FW/ツールのバージョンなど)

環境情報について、以下の通りです。
・Windows10 64bit
・Eclipse バージョン4.4 (PHP バージョン5.5)
・XAMPP:バージョン3.2.1

上記のコードの記述も全て確認しましたが、DBへの接続もできており、ミスしている箇所が見つけられません。

先人のお力をお借りしたく、質問させていただきます。

何卒宜しくお願い申し上げます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2020/05/15 06:26

    > phpの初心者です。

    「初心者アイコン」を質問につけるにとどめてください

    キャンセル

回答 1

checkベストアンサー

+1

接続がPDOで利用がmysqliでは整合性が取れません。
それぞれきちんとPHPマニュアルで確認の上、探す記事は新しめのもの、評価の高いものを選びましょう。

評価高い記事の例
PHPでデータベースに接続するときのまとめ
色々派生記事もありますが、しっかりおさえてください。

前の質問に回答してますが、

・Eclipse バージョン4.4 (PHP バージョン5.5)
・XAMPP:バージョン3.2.1 

まず、PHPのバージョンはサポート切れでないものを選びましょう。
既に5.x系はサポート外です。今ならPHP7.2以上です。
PHPのリリース日とサポート期限

PHP7.2もサポート期限はあと半年程度なので、やはり最新であれば最新であるほど良いです。
学習目的であれば尚更、過去バージョンを使うメリットは一切ありません。
なので、書籍も変えるべきです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/05/15 19:26

    この低評価は何かな。

    キャンセル

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

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

関連した質問

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