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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

NetBeans

NetBeansは Java、HTML5、PHP、C/C++のアプリケーションのフレームワーク、もしくは統合開発環境(NetBeans IDE)の両方を指します

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

解決済

PHPで、ログイン完了後に元のページに戻りたい

thunderbird683
thunderbird683

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

NetBeans

NetBeansは Java、HTML5、PHP、C/C++のアプリケーションのフレームワーク、もしくは統合開発環境(NetBeans IDE)の両方を指します

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

1回答

0評価

0クリップ

1049閲覧

投稿2020/12/02 14:38

前提・実現したいこと

PHPで、ログイン機能の実装を行っています。
作りたいものとしましては、ログイン完了後に、ログインページに入る直前のページに画面遷移できるようにしたいです。

試したこと

$_SERVER['HTTP_REFERER']を使って、ログインページに入る直前のページのURLの値を取得し、それを、header('location:' . $_SERVER['HTTP_REFERER']);という形で、ログイン後の遷移先を設定しました。

発生している問題

このようなことを試した結果、ログイン完了後に画面が遷移せず、ログイン画面から動かない状態になりました。
ログインが成功した際に、ログインページに入る直前のページのURLに移動できるようにするためのアドバイスをいただけますと幸いです。

該当のソースコード

PHP

<!--login.php--> <?php //SQL文関連は、db.phpで行う。 require_once("db.php"); $logonSuccess = false; //$_SERVER['HTTP_REFERER']で、前のページのURLを取得 $url = $_SERVER['HTTP_REFERER']; //ユーザーの資格情報を確認する if ($_SERVER['REQUEST_METHOD'] == "POST") { //ログイン成功時の動作 $logonSuccess = (WishDB::getInstance()->verify_wisher_credentials($_POST['user'], $_POST['userpassword'])); if ($logonSuccess == true) { session_start(); $_SESSION['user'] = $_POST['user']; { //前のページのURLをログイン後の遷移先に設定 header('location:' . $url); exit(); } } } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" media="screen" href="style.css" /> <title>ログイン画面</title> </head> <body> <!--ログイン入力フォーム--> <form name="logon" action="login.php" method="POST" > 名前: <input type="text" name="user"/> パスワード: <input type="password" name="userpassword"/><br> <!--ログイン失敗時の動作--> <?php if ($_SERVER['REQUEST_METHOD'] == "POST") { if (!$logonSuccess) echo "名前かパスワードが一致していません。"; } ?> <input type="submit" value="ログイン"/><br> </form> </body> </html>

PHP

<!--db.php--> <?php class WishDB extends mysqli { // すべてのインスタンス間で共有される自己の単一インスタンス private static $instance = null; //db接続構成変数 private $user = "phpuser"; private $pass = "phpuserpw"; private $dbName = "wishlist"; private $dbHost = "localhost"; /* * このメソッドは静的でなければならず、オブジェクトがまだ存在しない場合は */ // オブジェクトのインスタンスを返す必要がある。 public static function getInstance() { if (!self::$instance instanceof self) { self::$instance = new self; } return self::$instance; } /* * cloneおよびwakeupメソッドは、Singletonクラスのコピーの外部インスタンス化を * 防ぎ、オブジェクトの重複の可能性を排除する。 */ public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } public function __wakeup() { trigger_error('Deserializing is not allowed.', E_USER_ERROR); } // プライベートコンストラクタ private function __construct() { parent::__construct($this->dbHost, $this->user, $this->pass, $this->dbName); if (mysqli_connect_error()) { exit('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); } parent::set_charset('utf-8'); } /*アカウント作成*/ public function create_wisher($name, $password) { $name = $this->real_escape_string($name); $password = $this->real_escape_string($password); $this->query("INSERT INTO wishers (name, password) VALUES ('" . $name . "', '" . $password . "')"); } /*ユーザ資格情報を確認*/ public function verify_wisher_credentials($name, $password) { $name = $this->real_escape_string($name); $password = $this->real_escape_string($password); $result = $this->query("SELECT 1 FROM wishers WHERE name = '" . $name . "' AND password = '" . $password . "'"); return $result->data_seek(0); } } ?>

###テーブルの構成
wishersテーブル(ユーザを管理するテーブル)
id
name(ユーザ名)
password(パスワード)

補足情報(FW/ツールのバージョンなど)

XAMPP、 NetBeans IDE 8.2を使用
PHPのバージョンは、PHP7.0

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

hentaiman

2020/12/02 15:26

様々なサイトでクエリパラメーターとしてback_urlというのがついているのを見た事ありませんか? 既存のサイトを参考にすると解決する事も多々あると思うので色々リサーチしてみましょう。
FKM

2020/12/03 00:27

$_SERVER['HTTP_REFERER']で、echoなどを使って、本当にURLを取得しているか確認してみてください。
thunderbird683

2020/12/03 01:28

$_SERVER['HTTP_REFERER']を、取得できているか、echoを用いて確認したところ、正しく値が表示されているのを確認しました。
FKM

2020/12/03 01:41 編集

リファラは動いているということですね。だとするとセッションが気になりますので、session_startはPHPプログラムの先頭に置くようにしてみてください。でないと、想定外の動きを起こします。そしてif文でちゃんとtrueの方に分岐されているか追跡してみてください。
thunderbird683

2020/12/03 05:42

if文のtrueについてですが、 header('location:' . $url);を、 header('Location: top.php');といった形で書き換えると、top.phpに遷移するようになるので、分岐に関しては問題ないと考えて大丈夫だと思います。 コードを確認して、恐らく考えられる要因としては、クォーテーションの囲み方に問題があると考えます。 ただ、 header('location: $url');という形でクォーテーションを囲んでしまうと、404エラーが発生してしまうといった問題が発生しています。
FKM

2020/12/03 08:29

それならば、ダブルクォートで囲んで、変数をブラケットで囲ったらどうなりますか
thunderbird683

2020/12/03 13:20

header("location: [$url]");という形で、記述したところ、403エラーが出ました。 index.phpのファイルは、ディレクトリ上にあるので、恐らくアクセス権限が関わっている可能性が考えられます。現在アクセス権限の設定方法の確認を行っています。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

NetBeans

NetBeansは Java、HTML5、PHP、C/C++のアプリケーションのフレームワーク、もしくは統合開発環境(NetBeans IDE)の両方を指します

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。