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

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

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

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

Q&A

2回答

971閲覧

PHP 会員登録ログインページでエラー発生

suke1001

総合スコア7

PHP

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

0グッド

0クリップ

投稿2021/07/07 01:37

編集2021/07/08 12:24

PHPを使って会員登録のページを作成している途中ですが、一通りできて会員登録の登録を済ませてログインするとエラーページが出てきます。フィルターの部分と指摘されていますが違うパターンも試しましたがうまく動作しませんでした。このコードはネットで検索したページのコードを参考にしました。そもそも、そのコード自体に不備があるのか、自分の設定に問題があるのかどちらか教えてください。

●参考にしたサイトです。
https://qiita.com/qwertyuiopngsdfg/items/597da67387723a5aedad

login.php(ログインページ)

php

1<?php 2// error_reporting(E_ALL & ~E_NOTICE); 3require_once("dbconnect.php"); 4 5session_start(); 6 7 8if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 9 echo '入力された値が不正です。'; 10 return false; 11} 12 13try { 14 $pdo = new PDO(DSN, DB_USER, DB_PASS); 15 $stmt = $db->prepare('SELECT * FROM members WHERE email=?'); 16 $stmt->execute([$_POST['email']]); 17 $row = $stmt->fetch(PDO::FETCH_ASSOC); 18} catch (\Exception $e) { 19 echo $e->getMessage() . PHP_EOL; 20} 21 22if (!isset($row['email'])) { 23 echo ' メールアドレス又はパスワードが間違っています。'; 24 return false; 25} 26 27if (password_verify($_POST['password'], $row['password'])) { 28 session_regenerate_id(true); 29 $_SESSION['EMAIL'] = $row['email']; 30 echo 'ログインしました。'; 31} else { 32 echo 'メールアドレス又はパスワードが間違っています。'; 33 return false; 34} 35 36 37?>

entry.php(新規登録ページ)

PHP

1<?php 2require("dbconnect.php"); 3session_start(); 4 5if (!empty($_POST)) { 6 if ($_POST['email'] === "") { 7 $error['email'] = "blank"; 8 } 9 if ($_POST['password'] === "") { 10 $error['password'] ="blank"; 11 } 12 13 if (!isset($error)) { 14 $member = $db->prepare('SELECT COUNT(*) as cnt FROM members WHERE email=?'); 15 $member->execute(array( 16 $_POST['email'] 17 )); 18 $record = $member->fetch(); 19 if ($record['cnt'] > 0) { 20 $error['email'] = 'duplicate'; 21 } 22 } 23 24 if (!isset($error)) { 25 $_SESSION['join'] = $_POST; 26 header('Location: check.php'); 27 exit(); 28 } 29} 30?> 31 32<!DOCTYPE html> 33<html> 34 <div class="content"> 35 <head> 36 <meta charset="utf8mb4"> 37 <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0"> 38 <title>アカウント作成</title> 39 <link rel="stylesheet" href="css/style.css"> 40 </head> 41 42 <body> 43 <form action="" method="POST"> 44 <h1>アカウント作成</h1> 45 <p>当サービスをご利用するために、次のフォームに必要事項をご記入ください。</p> 46 <br> 47 48 <div class="control"> 49 <label for="name">ユーザー名</label> 50 <input id="name" type="text" name="name"> 51 </div> 52 53 <div class="control"> 54 <label for="email">メールアドレス<span class="required">必須</span></label> 55 <input id="email" type="email" name="email"> 56 <?php if (!empty($error["email"]) && $error['email'] === 'blank'): ?> 57 <p class="error">※メールアドレスを入力してください</p> 58 <?php elseif (!empty($error["email"]) && $error['email'] === 'duplicate'): ?> 59 <p class="error">※このメールアドレスはすでに登録済みです</p> 60 <?php endif ?> 61 </div> 62 63 <div class="control"> 64 <label for="password">パスワード<span class="required">必須</span></label> 65 <input id="password" type="password" name="password"> 66 <?php if (!empty($error["password"]) && $error['password'] === 'blank'): ?> 67 <p class="error">※パスワードを入力して下さい</p> 68 <?php endif ?> 69 </div> 70 71 <div class="control"> 72 <button type="submit" class="btn">確認する</button> 73 </div> 74 </form> 75 </body> 76 </div> 77</html> 78

check.php(登録確認ページ)

PHP

1<?php 2require("dbconnect.php"); 3session_start(); 4 5 6if (!isset($_SESSION['join'])) { 7 header('Location: entry.php'); 8 exit(); 9} 10 11if (!empty($_POST['check'])) { 12 $hash = password_hash($_SESSION['join']['password'], PASSWORD_BCRYPT); 13 14 $stmt = $db->prepare("INSERT INTO members SET name=?, email=?, password=?"); 15 $stmt->execute(array( 16 $_SESSION['join']['name'], 17 $_SESSION['join']['email'], 18 $hash 19 )); 20 21 unset($_SESSION['join']); 22 header('Location: thank.php'); 23 exit(); 24} 25?> 26 27<!DOCTYPE html> 28<html lang="ja"> 29<head> 30 <meta charset="utf8mb4"> 31 <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0"> 32 <title>確認画面</title> 33 <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet"> 34 <link rel="stylesheet" href="css/style.css"> 35</head> 36<body> 37 <div class="content"> 38 <form action="" method="POST"> 39 <input type="hidden" name="check" value="checked"> 40 <h1>入力情報の確認</h1> 41 <p>ご入力情報に変更が必要な場合は、下のボタンを押し、変更を行ってください。</p> 42 <p>ご登録情報は後から変更する事ができます。</p> 43 <?php if (!empty($error) && $error === "error"): ?> 44 <p class="error">会員登録に失敗しました。</p> 45 <?php endif ?> 46 <hr> 47 48 <div class="control"> 49 <p>ニックネーム</p> 50 <p><span class="fas fa-angle-double-right"></span><span class="check-info"><?php echo htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES); ?></span></p> 51 </div> 52 53 <div class="control"> 54 <p>メールアドレス</p> 55 <p><span class="fas fa-angle-double-right"></span><span class="check-info"><?php echo htmlspecialchars($_SESSION['join']['email'], ENT_QUOTES); ?></span></p> 56 </div> 57 58 <br> 59 <a href="entry.php" class="back-btn">変更する</a> 60 <button type="submit" class="btn next-btn">登録する</button> 61 <div class="clear"></div> 62 </form> 63 </div> 64</body> 65</html> 66

dbconnect.php(データベース接続ページ)

PHP

1<?php 2 3try { 4 $db = new PDO('mysql:dbname=myapp;host=db;charset=utf8mb4', 'myappuser', 'myapppass'); 5} catch (PDOException $e) { 6 echo "データベース接続エラー :".$e->getMessage(); 7} 8?> 9

●エラーページです。
エラーページです。

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

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

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

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

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

itagagaki

2021/07/07 01:46

コードは画像ではなくテキストでMarkdownの記法で載せてください。
suke1001

2021/07/07 01:49

すみません、まだうまく使いこなせていなのでお許しください。気をつけます。
m.ts10806

2021/07/07 03:34

質問は編集できます
suke1001

2021/07/07 22:13

ご指摘ありがとうございます。編集しました。
m.ts10806

2021/07/08 00:16

入力画面も提示してください。 あと、filter_varでチェックしている$_SESSION['email']がどこで定義されているのか
suke1001

2021/07/08 00:36

入力画面は消してしまったのでPC触れる環境になりましたら、もう一回提示します。
guest

回答2

0

if (!filter_var($_SESSION['email'], FILTER_VALIDATE_EMAIL)) {

この処理以前にセッションに値入れてないからでは。
若干エスパーすると、フォーム送信された値のチェックなら$_POSTになるでしょうね。

投稿2021/07/08 00:18

m.ts10806

総合スコア80861

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

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

suke1001

2021/07/08 00:32

ありがとうございます! ご指摘いただいた箇所ですが、「SESSION」ではなく「POST」でした。編集したときに無意識に触ってしまったみたいで、コードが変わっていました。 すみません。
m.ts10806

2021/07/08 00:35

では送信フォームにその項目がないか、フォームリクエストではなく直接そのページにアクセスしてるかのどちらかですね。 送信フォームのコードが提示されないことにはなんとも言えませんが
m.ts10806

2021/07/08 00:36

他者がコピペで再現できるよう配慮願います。
suke1001

2021/07/08 00:37

いつもご丁寧にありがとうございます。PC触れる環境になりましたら提示します。
guest

0

$_POST["email"]を直接参照しているからでしょう

PHP

1$email=filter_input(INPUT_POST,"email");

のように一度変数にうけて$emailを利用して条件式をつくってください

投稿2021/07/07 01:45

yambejp

総合スコア115010

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

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

suke1001

2021/07/07 01:54

早速ご回答ありがとうございます!急用で作業できなくなってしまったので夜、実践させてもらいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問