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

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

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

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

Q&A

1回答

1180閲覧

php ログイン機能のエラー

kudouyuya

総合スコア15

PHP

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

0グッド

0クリップ

投稿2020/06/02 09:22

編集2020/06/02 13:44

phpの課題でログイン機能作ってます。Mysqlに登録したメールアドレスとパスワードを打ち込んで
ログインボタンを押してログインする流れなんですが、画面遷移が起こらずにエラーが出てしまいます。
ご意見いただけたら嬉しいです。

新規登録画面のソースコード  index.php

session_start(); require('../dbconnect.php'); if (!empty($_POST)) { if ($_POST['name'] === '') { $error['name'] = 'blank'; } if ($_POST['email'] === '') { $error['email'] = 'blank'; } if (strlen($_POST['password']) < 4) { $error['password'] = 'length'; } if ($_POST['password'] === '') { $error['password'] = 'blank'; } $fileName = $_FILES['image']['name']; if (!empty($fileName)) { $ext = substr($fileName, -3); if ($ext != 'jpg' && $ext != 'gif' && $ext != 'png') { $error['image'] = 'type'; } } if(empty($error)) { $member = $db->prepare('SELECT COUNT(*) AS cnt FROM members WHERE email=?'); $member->execute(array($_POST['email'])); $record = $member->fetch(); if ($record['cnt'] > 0) { $error['email'] = 'duplicate'; } } if (empty($error)) { $image = date('YmdHis') . $_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], '../member_picture/' . $image); $_SESSION['join'] = $_POST; $_SESSION['join']['image'] = $image; header('Location: check.php'); exit(); } } if ($_REQUEST['action'] == 'rewrite' && isset($_SESSION['join'])) { $_POST = $_SESSION['join']; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>会員登録</title> <link rel="stylesheet" href="../style.css" /> </head> <body> <div id="wrap"> <div id="head"> <h1>会員登録</h1> </div> <div id="content"> <p>次のフォームに必要事項をご記入ください。</p> <form action="" method="post" enctype="multipart/form-data"> <dl> <dt>ニックネーム<span class="required">必須</span></dt> <dd> <input type="text" name="name" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST['name'], ENT_QUOTES)); ?>" /> <?php if ($error['name'] === 'blank'): ?> <p class="error"> * ニックネームを入力してください</p> <?php endif; ?> </dd> <dt>メールアドレス<span class="required">必須</span></dt> <dd> <input type="text" name="email" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST['email'], ENT_QUOTES)); ?>" /> <?php if ($error['email'] === 'blank'): ?> <p class="error"> * メールアドレスを入力してください</p> <?php endif; ?> <?php if ($error['email'] === 'duplicate'): ?> <p class="error"> * 指定されたメールアドレスは、既に登録されています</p> <?php endif; ?> <dt>パスワード<span class="required">必須</span></dt> <dd> <input type="password" name="password" size="10" maxlength="20" value="<?php print(htmlspecialchars($_POST['password'], ENT_QUOTES)); ?>" /> <?php if ($error['password'] === 'blank'): ?> <p class="error"> * パスワードを入力してください</p> <?php endif; ?> <?php if ($error['password'] === 'length'): ?> <p class="error"> * 4文字以上で入力してください</p> <?php endif; ?> </dd> <dt>写真など</dt> <dd> <input type="file" name="image" size="35" value="test" /> <?php if ($error['image'] === 'type'): ?> <p class="error"> * 写真などは[.gif]または[.jpg][.png]の画像を指定してください</p> <?php endif; ?> <?php if (!empty($error)): ?> <p class="error"> * 恐れ入りますが、画像を改めて指定してください</p> <?php endif; ?> </dd> </dl> <div><input type="submit" value="入力内容を確認する" /></div> </form> </div> </body> </html> コード

登録内容の確認画面のソースコード check.php

session_start(); require('../dbconnect.php'); if (!isset($_SESSION['join'])) { header('Location: index.php'); exit(); } if (!empty($_POST)) { $statement = $db->prepare('INSERT INTO members SET name=?, email=?, password=?, picture=?, created=NOW()'); echo $statement->execute(array( $_SESSION['join']['name'], $_SESSION['join']['email'], sha1($SESSION['join']['password']), $_SESSION['join']['image'])); unset($_SESSION['join']); header('Location: thanks.php'); exit(); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>会員登録</title> <link rel="stylesheet" href="../style.css" /> </head> <body> <div id="wrap"> <div id="head"> <h1>会員登録</h1> </div> <div id="content"> <p>記入した内容を確認して、「登録する」ボタンをクリックしてください</p> <form action="" method="post"> <input type="hidden" name="action" value="submit" /> <dl> <dt>ニックネーム</dt> <dd> <?php print(htmlspecialchars($_SESSION['join'] ['name'], ENT_QUOTES)); ?> </dd> <dt>メールアドレス</dt> <dd> <?php print(htmlspecialchars($_SESSION['join'] ['email'], ENT_QUOTES)); ?> </dd> <dt>パスワード</dt> <dd> 【表示されません】 </dd> <dt>写真など</dt> <dd> <?php if ($_SESSION['join']['image'] !== ''): ?> <img src="../member_picture/<?php print(htmlspecialchars($_SESSION['join']['image'], ENT_QUOTES)); ?>"> <?php endif; ?> </dd> </dl> <div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a> | <input type="submit" value="登録する" /></div> </form> </div> </div> </body> </html> コード


DB接続ファイル  dbconnect.php

try { $db = new PDO('mysql:dbname=mini_bbs;host=127.0.0.1; charset=utf8', 'root', 'root'); } catch(PDOException $e) { print('DB接続エラー :' . $e->getMessage()); } コード

ログイン画面のソースコード  login.php

session_start(); require('dbconnect.php'); ini_set('display_errors', "On"); if (!empty($_POST)) { if ($_POST['email'] !== '' && $_POST['password'] !== '') { $login = $db->prepare('SELECT * FROM members WHERE email=? AND password=?'); $login->execute(array( $_POST['email'], sha1($_POST['password']) )); $member = $login->fetch(); if ($member) { $_SESSION['id'] = $member['id']; $_SESSION['time'] = time(); header('Location: index.php'); exit(); } else { $error['login'] = 'failed'; } } else { $error['login'] = 'blank'; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="style.css" /> <title>ログインする</title> </head> <body> <div id="wrap"> <div id="head"> <h1>ログインする</h1> </div> <div id="content"> <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 print(htmlspecialchars($_POST['email'], ENT_QUOTES)); ?>" /> <?php if ($error['login'] === 'blank'): ?> <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 print(htmlspecialchars($_POST['password'], ENT_QUOTES)); ?>" /> </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> </div> <div id="foot"> <p><img src="images/txt_copyright.png" width="136" height="15" alt="(C) H2O Space. MYCOM" /></p> </div> </div> </body> </html> コード


                エラー内容

Notice:未定義の変数:54行目の/Applications/MAMP/htdocs/mini_bbs/login.phpのエラーNotice:54行目の/Applications/MAMP/htdocs/mini_bbs/login.phpの null型の値の配列オフセットにアクセスしようとしていますNotice:未定義の変数:57行目の/Applications/MAMP/htdocs/mini_bbs/login.phpのエラーNotice:57行目の/Applications/MAMP/htdocs/mini_bbs/login.phpの null型の値の配列オフセットにアクセスしようとしています

このようなエラーが出ます。解決のアドバイスをいただきたいです。

ちなみに新規登録画面で登録した内容は、ちゃんとDBに登録されています。
DBに登録したメールアドレスとパスワードを打ち込んでも、ログイン出来ずにエラ〜メッセージが
表示されます。
あと、PHPMYADMINでSQLを直接メールアドレスとsha1を適用したパスワード挿入して、実行できるか確認してみたら
実行できました。登録した内容が表示されました。

そしてこのエラー内容の
54行目は、<?php if ($error['login'] === 'blank'): ?>
57行目は、<?php if ($error['login'] === 'failed'): ?>です。

長々と申し訳ありません。

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

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

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

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

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

m.ts10806

2020/06/02 11:08

コードはマークダウンのcode機能で、ファイル毎に対応の上ご提示ください
kudouyuya

2020/06/02 13:46

ご指摘ありがとうございます。登録したばかりで使い方が分からずお手数おかけしました。 無事に変更することができました。
guest

回答1

0

記載されているのが一つのphpファイルだとしたら

if ($error['login'] === 'blank')
でNotice起こる原因は$error変数が未定義か定義されてるけどloginっていうキー値が存在しないかです。
処理の優先順位を考えて
<?php if (empty($error['login']) === false && $error['login'] === 'blank'): ?>
とかにすればいいんじゃないかな

投稿2020/06/02 09:59

rururu3

総合スコア5545

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

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

kudouyuya

2020/06/02 13:52 編集

rururu3さん、迅速な回答ありがとうございます。 質問内容を編集して、他のファイルもマークダウンのコード機能でアップしたのでご意見頂ければ 嬉しいです。 ご提案いただいた方法を試してみたのですがログイン出来ませんでした。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問