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

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

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

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

解決済

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

maguro.sake
maguro.sake

総合スコア2

PHP

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

1回答

0グッド

1クリップ

283閲覧

投稿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
でアクセスしました。
一度ログインボタンを押すとエラーメッセージは表示されませんでした。

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

maguro.sake

2022/11/14 06:39

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

回答1

2

ベストアンサー

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

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

投稿2022/11/14 06:34

m.ts10806

総合スコア79945

spoofy_dragon, BeatStar👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

2022/11/18 12:09

こちらの回答が他のユーザーから「説明が不足している回答」という指摘を受けました。

回答へのコメント

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

PHP

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