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

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

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

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

Q&A

解決済

1回答

635閲覧

PHPで初回アクセス時にエラーメッセージが表示される

maguro.sake

総合スコア2

PHP

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

0グッド

1クリップ

投稿2022/11/14 06:10

PHPでTodo管理システムを作っています。今回改修作業として、ログイン画面を作成し担当者IDとパスワードを入力してログインする機能を追加しました。
ところが初回アクセス時に以下のエラーメッセージが発生しました。

Notice: Undefined index: password in /work/public/login.php on line 5

実現したいこと

・初回アクセス時に上記のエラーメッセージが表示されないこと

該当のソースコード

PHP login.php

1<?php 2 3 4 5if($_POST["password"] == "tanaka" && $_POST["user_id"] == 99999) { 6 header('Location: index.php'); 7exit; 8} 9if($_POST["password"] == "yamada" && $_POST["user_id"] == 11111){ 10 header('Location: index.php'); 11exit; 12} 13?> 14<html> 15 <head> 16 <meta charset="UTF-8"> 17 <title>ログイン</title> 18 </head> 19 <body> 20 <h1>ログインページ</h1> 21<form method="POST" action=""> 22 <label>担当者ID</label></br> 23 <input type="text" name="user_id"></br></br> 24 <label>パスワード</label></br> 25 <input type="password" name="password" value=""></br></br> 26 <input type="submit" value="ログイン"> 27</form> 28 </body> 29</html>

PHP index.php

1<?php 2 3require_once(__DIR__ . '/../app/config.php'); 4 5use MyApp\Database; 6use MyApp\Todo; 7use MyApp\Utils; 8 9$pdo = Database::getInstance(); 10 11$todo = new Todo($pdo); 12$todo->processPost(); 13$todos = $todo->getAll(); 14 15?> 16<!DOCTYPE html> 17<html lang="ja"> 18<head> 19 <meta charset="utf-8"> 20 <title>My Todos</title> 21 <link rel="stylesheet" href="css/styles.css"> 22</head> 23<body> 24 <?php 25 if (isset($_POST['password']) && isset($_POST['user_id'])) { 26 $password = $_POST['password']; 27 $user_id = $_POST['user_id']; 28 } 29 30 31 ?> 32 33 <main data-token="<?= Utils::h($_SESSION['token']); ?>"> 34 <header> 35 <h1>Todos</h1> 36 <span class="purge">Purge</span> 37 </header> 38 39 <form> 40 <input type="text" name="title" placeholder="Type new todo."> 41 </form> 42 43 <ul> 44 <?php foreach ($todos as $todo): ?> 45 <li data-id="<?= Utils::h($todo->id); ?>"> 46 <input type="checkbox" <?= $todo->is_done ? 'checked' : ''; ?>> 47 <span><?= Utils::h($todo->title); ?></span> 48 <span class="delete">x</span><span><?= Utils::h($todo->createnow); ?></span> 49 </li> 50 <?php endforeach; ?> 51 </ul> 52 </main> 53 54 <script src="js/main.js"></script> 55</body> 56</html>

試したこと

初回アクセス時とフォーム送信後のアクセスの切り分けができていないときに発生すると言う記述を見かけたので

PHP index.php

1if(empty($_POST)){ 2 echo 'フォームは送信されてないよ'; 3} 4else{ 5 echo 'フォームは送信されたよ'; 6}

というのを

PHP index.php

1<?php 2 3if(empty($_POST)){ 4 echo 'フォームは送信されてないよ'; 5} 6else{ 7 echo 'フォームは送信されたよ'; 8} 9 if (isset($_POST['password']) && isset($_POST['user_id'])) { 10 $password = $_POST['password']; 11 $user_id = $_POST['user_id']; 12 } 13 ?>

の箇所にいれたところ送信されたよが表示されました。

他にもindex.phpに

PHP index.php

1 <?php 2$passowrd = ""; 3 if (isset($_POST['password']) && isset($_POST['user_id'])) { 4 $password = $_POST['password']; 5 $user_id = $_POST['user_id']; 6 } 7 8 9 ?>

という方法も試してみましたが最初のエラーメッセージは消えませんでした。

補足情報
http://localhost:8562/login.php
でアクセスしました。
一度ログインボタンを押すとエラーメッセージは表示されませんでした。

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

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

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

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

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

maguro.sake

2022/11/14 06:39

login.phpに <form method="POST" action="">と入力しているのですがこれではないということでしょうか。 回答に対しての質問の方法がわからなかったのでこちらに入力しました。
guest

回答1

0

ベストアンサー

formなどからリクエストメソッドを明示してない限り、「GET」になります。
URL直打ちやリンクなどからの遷移しての画面表示時はGETになっており、POSTは送信されていないため、提示のNotice(厳密にはエラーではない)が出ます。

対応方法はいくつかあります
・リクエストメソッドPOSTのときのみ$_POSTを参照するように分岐を追加。$_SERVERなど。
filter_input()でリクエスト情報を取得し、結果NULLかどうかで判断。

投稿2022/11/14 06:34

m.ts10806

総合スコア80850

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

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

maguro.sake

2022/11/14 06:47

login.phpに <form method="POST" action="">と入力しているのですがこれではないということでしょうか。
m.ts10806

2022/11/14 07:40

それはあくまで「どういう形でリクエストを送るか」という画面側の定義です。 formの送信ボタンを押したときなどでサブミットされたときにactionに指定された先に対して(指定なしの場合は自身)サーバーサイドに送るリクエストメソッドです。単に画面にアクセスしたときにはGETです。 サーバーサイドのスクリプトとして画面が表示される前に処理が終わるPHPには影響しません。
maguro.sake

2022/11/14 07:57 編集

ありがとうございます。 先程教えていただいた、filter_input()を使って、http://localhost:8562/login.php をブラウザに入力したらログイン画面ではなく直接Todo画面に遷移してしまったのですがこれはなぜですか?
m.ts10806

2022/11/14 10:40

filter_inputが原因ではないと思いますが、そのコードを提示されずに「なぜか」を答えるのは不可能なので、 「質問を受けた結果」として質問本文に現状反映してください。
maguro.sake

2022/11/18 06:08

無事に解決しました。ありがとうございました。
m.ts10806

2022/11/18 06:42

どのように解決となったのでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問