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

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

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

PHP

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

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

Q&A

解決済

1回答

693閲覧

PHPでログインシステムの作成時に直接ログイン後のファイルにアクセルされた場合の対処法

tsukagon

総合スコア30

MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

PHP

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

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

0グッド

0クリップ

投稿2022/07/04 03:55

バックエンドの仕組みを理解するためにMAMP環境でログインシステムをお試しで作成しています。
仕様は以下の通りです。
・MySQLにあらかじめユーザーのIDとパスワードを登録しておく。
・ログインフォームにIDとパスワードを入力して、MySQLのデータと一致したらホーム画面に遷移する。
・さらにホーム画面にいくつかメニューがありそれらをクリックすることで詳細ページへと遷移する。
・セッションを使用しておりログイン中のみ各ページ間の移動、閲覧は可能となっており、ログイン済みでないと各ページに直接アクセスしても内容は閲覧出来ない。

質問したいこと:
ログインしていない状態で、ログイン後のページに直接アクセスすると、ログイン画面に誘導するように作成していますがhome.php内のIf文の書き方が悪いのか、画面上に変数$idとはなんぞや、$passwordとはなんぞやというエラーがこのファイルのパスとエラーの行数などがブラウザに表示されてしまいます。21,22行目でログインフォームから送信されたidとpasswordを受け取って変数$idと$passwordに格納していますが、直接このファイルにアクセスした場合は何も送信していないのでこの行が原因でエラーが出てしまいます。閲覧者にこのエラーが見えてしまうのはまずいと感じ8行目の

ini_set('display_errors', 0);

でエラーが表示されないようにしたのですが根本的な解決にはなっていないように思います。そこで一般的にこのようなエラーは画面上に表示させなくするといった(半ば強制的な?)対処法で十分なのか、またはコードの書き方しだいでエラーそのものを取り除けるのかアドバイスをいただきたいです。これ以外の書き方が分かりませんでした。PHPごり押し勉強二日目の初心者ですので突っ込みどころが多いかと思いますがよろしくお願いします。以下はログインフォームから送信されたIDとpasswordを受け取ってMySQLの情報と一致しなければログインをやり直させる、一致したら詳細ページへのリンクを画面に示すようになっているhome.phpです。

<?php session_start(); $mysql = 'mysql:host=localhost:8889;dbname=test_db;charset=utf8'; $user = 'root'; $passwoad = 'root'; ?> <?php ini_set('display_errors', 0); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>home</title> </head> <body> <?php if(empty($_SESSION['userid'])) {?> <?php $id = $_POST['id']; $password = $_POST['password']; ?> <?php if (empty($id) || empty($password)) { echo 'IDとPasswordを入力してください'; ?> <p><a href='login.php'>ログインページに戻る</a></p> <?php } else { // 例外の可能性があればtry内に記述する // 例外が起こった場合はPDOExceptionをthrowする try { $db = new PDO($mysql, $user, $passwoad); $select = "SELECT * FROM test WHERE id = '$id' AND password= '$password'"; $res = $db->query($select); $res->execute(); // 例外が起こった場合にPDOExceptionを変数$eでキャッチする // 受け取ったエラーメッセージをgetMessageで取得しechoで表示する } catch (PDOException $e) { echo '接続エラー: ' . $e->getMessage(); echo '管理者にお問い合わせ下さい'; } if ($res->rowCount() < 1) { echo 'ログイン出来ませんでした'; ?> <p><a href='login.php'>ログインページに戻る</a></p> <?php } else { // SQL操作が正常完了していればどこからでも呼び出せる$_SESSION変数に各情報を入れておく $row = $res->fetch(); $_SESSION['userid'] = $row['id']; $_SESSION['familyname'] = $row['familyname']; $_SESSION['userpassword'] = $row['password']; $_SESSION['firstname'] = $row['firstname']; $_SESSION['birth'] = $row['birth']; $_SESSION['address'] = $row['address']; $_SESSION['phone'] = $row['phone']; echo 'ログイン中です'; ?> <p><a href='logout.php'>Logout</a></p> <p><a href='play.php'>play</a></p> <p><a href='setting.php'>setting</a></p> <p><a href='shop.php'>shop</a></p> <p><a href='userinfo.php'>userinfo</a></p> <?php } } ?> <?php } else { ?> <?php echo 'ログイン中です'; ?> <p><a href='logout.php'>Logout</a></p> <p><a href='play.php'>play</a></p> <p><a href='setting.php'>setting</a></p> <p><a href='shop.php'>shop</a></p> <p><a href='userinfo.php'>userinfo</a></p> <?php } ?> </body> </html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

$_SESSION['userid']$_POST['id']など配列変数の形でアクセスする変数について、
状況によってはそれらが存在しないこともありうるため、
if (isset($_SESSION['userid'])) { ~ }
あるいは
if (array_key_exists('userid', $_SESSION)) { ~ }
にて検査してください。

詳しくは:
PHP: isset - Manual
PHP: array_key_exists - Manual

ちなみに、$_POSTの存在チェックをする前に、
$_SERVER['REQUEST_METHOD']の存在チェックをするべきです。
この値が'POST'以外のときは$_POSTは存在しないものと考えて良いです。

各ページごとに個別にいろんなログインチェック(のための変数存在チェック)をしなくてもいいように、
includeやrequireを駆使して一連のチェック処理を関数化しておくと良いかもです。

投稿2022/07/04 08:32

編集2022/07/04 08:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tsukagon

2022/07/04 13:43

ご回答ありがとうございます。$_SERVER['REQUEST_METHOD']を使用することで閲覧者がログイン後のページに直接アクセスしたのか、ログインフォームからPOST送信したのかを判別することが出来、もやもやしていた部分を解決することが出来ました。includeやrequireに関しては勉強してさらにすっきりと記述出来るように精進したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問