バックエンドの仕組みを理解するために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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/04 13:43