PHPでログイン機能を作成しています。
ですが、画面が遷移しません。
login_form.php → login_check.php でエラーがなければ login_admin.phpへ エラーがあればlogin_form.php へリダイレクトする流れです。
原因がわからないのでエラーを出したいのですがどのようにデバッグしたらいいですか?
ご教授いただけると嬉しいです。
login_form.php (画像の画面) htmlは一部抜粋
php
1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6session_start(); 7header("Content-type: text/html; charset=utf-8"); 8 9// クロスサイトリクエストフォージュリ(CSRF)対策 10$_SESSION["token"] = base64_encode(openssl_random_pseudo_bytes(32)); 11$token = $_SESSION["token"]; 12 13// クリックジャッキング対策 14header("X-FRAME-OPTIONS: SAMEORIGIN"); 15 16$errors = ''; 17 18 19 ?> 20 21 22<!DOCTYPE html> 23<html lang="ja"> 24<head> 25 <meta charset="utf-8"> 26 <title>ログインフォーム</title> 27 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 28 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen"> 29 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> 30 31 32</head> 33<body> 34 35 36 37 <!-- パンくずリスト--> 38 <ol class="breadcrumb"> 39 <li><a href="http://192.168.33.15"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>トップ</a></li> 40 <li class="active">ログインフォーム</li> 41 </ol> 42 43 44 <div class="container"> 45 46 <?php if (count($errors) > 0): ?> 47 <?php foreach ((array)$errors as $value): ?> 48 <?php echo "<font color=RED>".$value."</font>"."<br>" ?> 49 <?php endforeach; ?> 50 <?php endif; ?> 51 52 <div id="loginbox" style="margin-top:50px;" class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2"> 53 <div class="panel panel-info" > 54 <div class="panel-heading"> 55 <div class="panel-title">Sign In</div> 56 <div style="float:right; font-size: 80%; position: relative; top:-10px"><a href="#">Forgot password?</a></div> 57 </div> 58 59 <div style="padding-top:30px" class="panel-body" > 60 61 <div style="display:none" id="login-alert" class="alert alert-danger col-sm-12"></div> 62 63 <form id="loginform" class="form-horizontal" role="form" method="post" action="login_check.php"> 64 65 <div style="margin-bottom: 25px" class="input-group"> 66 <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span> 67 <input id="login-username" type="text" class="form-control" name="username" value="" placeholder="username or email"> 68 </div> 69 70 <div style="margin-bottom: 25px" class="input-group"> 71 <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span> 72 <input id="login-password" type="password" class="form-control" name="password" placeholder="password"> 73 </div> 74 75 76 77 <div class="input-group"> 78 <div class="checkbox"> 79 <label> 80 <input id="login-remember" type="checkbox" name="remember" value="1"> Remember me 81 </label> 82 </div> 83 </div> 84 85 86 <div style="margin-top:10px" class="form-group"> 87 <!-- Button --> 88 89 <div class="col-sm-12 controls"> 90 <button name="login" id="btn-login" class="btn btn-success">Login</button> 91 <a id="btn-fblogin" href="#" class="btn btn-primary">Login with Facebook</a> 92 93 </div> 94 </div> 95 96 97 98 99 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 100 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 101 </body> 102 </html>
login_check.php (チェック) html省略
php
1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6session_start(); 7header("Content-type: text/html; charset=utf-8"); 8 9// クロスサイトリクエストフォージュリ(CSRF)対策のトークン判定 10 if ($_POST["token"] != $_SESSION["token"]) { 11 echo "不正アクセスの可能性あり。"; 12 exit(); 13 } 14 15// クリックジャッキング対策 16header("X-FRAME-OPTIONS: SAMEORIGIN"); 17 18// 変数の初期化 19$email = ''; 20 21// セッション変数の定義 22 23// エラーメッセージの配列の初期化 24$errors = array(); 25// セッション変数の初期化 26$_SESSION['errors'] = array(); 27 28// データベース接続 29require_once(__DIR__. '/db.php'); 30 31// 前後にある半角全角スペースを削除する関数 32function spaceTrim($str) { 33 34 // 行頭 35 $str = preg_replace('/^[ ]+/u', '', $str); 36 // 末尾 37 $str = preg_replace('/[ ]+$/u', '', $str); 38 39 return $str; 40} 41 42 43// POST時 44if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == "POST") { 45 46 // ログインボタンが押された場合 47if (isset($_POST["login"])) { 48 // 1. ユーザIDの入力チェック 49 if (empty($_POST["userid"])) { // emptyは値が空のとき 50 $errorMessage = 'ユーザーIDが未入力です。'; 51 } else if (empty($_POST["password"])) { 52 $errorMessage = 'パスワードが未入力です。'; 53 } 54 55 // POSTされたデータを各変数に入れる 56 $username = filter_input(INPUT_POST, 'username'); 57 $password = filter_input(INPUT_POST, 'password'); 58 59 // 前後にある半角全角スペースを削除 60 $username = spaceTrim($username); 61 $password = spaceTrim($password); 62 63 // アカウント入力判定 64 if (empty($_SESSION["username"])) { 65 $errors[] = "usernameもしくは、emailが入力されていません。"; 66 } 67 68 // パスワード入力判定 69 if (empty($_SESSION["password"])) { 70 $errors[] = "パスワードが入力されていません。"; 71 } elseif (preg_match('/^[0-9a-zA-Z]{1,7}$/', $password)) { 72 $errors[] = "パスワードは8文字以上で入力してください。"; 73 } else { 74 $password_hide = str_repeat('*', strlen($password)); 75 } 76} 77 78// エラーがなければ実行する 79if (count($errors) == 0) { 80 try { 81 // 例外処理を投げる(スロー)ようにする 82 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 83 84 // アカウントで検索 85 $statement = $dbh->prepare("SELECT * FROM users WHERE email=(:email)"); 86 $statement->bindValue(":email", $email, PDO::PARAM_STR); 87 $statement->execute(); 88 89 // アカウントが一致 90 if ($row = $statement->fetch()) { 91 $db_password = $row["password"]; 92 93 // パスワードが一致 94 if ($password == $db_password) { 95 96 // セッションハイジャック対策 97 session_regenerate_id(true); 98 99 $_SESSION["username"] = $username; 100 header("Location: login_admin.php"); 101 exit(); 102 } else { 103 $errors[] = "アカウント及びパスワードが一致しません。"; 104 } 105 } else { 106 $errors[] = "アカウント及びパスワードが一致しません。"; 107 } 108 109 if (count($errors) > 0) { 110 $errors = $_SESSION["errors"]; 111 foreach ($errors as $value) { 112 echo $error; 113 } 114 header("Location: login_form.php"); 115 } 116 117 // データベース切断 118 $dbh = null; 119 } catch (PDOException $e) { 120 print("Error:" .$e->getMessage()); 121 die(); 122 } 123} 124 125?>
遷移先 login_admin.php
php
1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6session_start(); 7header("Content-type: text/html; charset=utf-8"); 8 9$username = ''; 10 11 12// ログイン状態のチェック 13if (!isset($_SESSION["username"])) { 14 header("Location: login_form.php"); 15 exit(); 16} 17 18function h($string) { 19 return htmlspecialchars($string, ENT_QUOTES, "UTF-8"); 20} 21 22 ?> 23 24<!DOCTYPE html> 25<html lang="ja"> 26 <head> 27 <meta charset="utf-8"> 28 <title>ログイン</title> 29 </head> 30 <body> 31 32 <?php echo h($username)."さん、こんにちは!"; ?> 33 34 <a href="logout.php">ログアウトする</a> 35 36 </body> 37</html>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。