🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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などのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

1回答

2643閲覧

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

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などのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2020/12/02 14:38

前提・実現したいこと

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

試したこと

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

発生している問題

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

該当のソースコード

PHP

1<!--login.php--> 2<?php 3//SQL文関連は、db.phpで行う。 4require_once("db.php"); 5$logonSuccess = false; 6//$_SERVER['HTTP_REFERER']で、前のページのURLを取得 7$url = $_SERVER['HTTP_REFERER']; 8 9//ユーザーの資格情報を確認する 10if ($_SERVER['REQUEST_METHOD'] == "POST") { 11 //ログイン成功時の動作 12 $logonSuccess = (WishDB::getInstance()->verify_wisher_credentials($_POST['user'], $_POST['userpassword'])); 13 if ($logonSuccess == true) { 14 session_start(); 15 $_SESSION['user'] = $_POST['user']; 16 { 17 //前のページのURLをログイン後の遷移先に設定 18 header('location:' . $url); 19 exit(); 20 } 21 } 22} 23?> 24<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 25<html> 26 <head> 27 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 28 <link rel="stylesheet" type="text/css" media="screen" href="style.css" /> 29 <title>ログイン画面</title> 30 </head> 31 <body> 32 <!--ログイン入力フォーム--> 33 <form name="logon" action="login.php" method="POST" > 34 名前: <input type="text" name="user"/> 35 パスワード: <input type="password" name="userpassword"/><br> 36 <!--ログイン失敗時の動作--> 37 <?php 38 if ($_SERVER['REQUEST_METHOD'] == "POST") { 39 if (!$logonSuccess) 40 echo "名前かパスワードが一致していません。"; 41 } 42 ?> 43 <input type="submit" value="ログイン"/><br> 44 45 </form> 46 </body> 47</html>

PHP

1<!--db.php--> 2<?php 3 4class WishDB extends mysqli { 5 6 // すべてのインスタンス間で共有される自己の単一インスタンス 7 private static $instance = null; 8 //db接続構成変数 9 private $user = "phpuser"; 10 private $pass = "phpuserpw"; 11 private $dbName = "wishlist"; 12 private $dbHost = "localhost"; 13 14/* 15 * このメソッドは静的でなければならず、オブジェクトがまだ存在しない場合は 16 */ 17// オブジェクトのインスタンスを返す必要がある。 18 public static function getInstance() { 19 if (!self::$instance instanceof self) { 20 self::$instance = new self; 21 } 22 return self::$instance; 23 } 24 25 /* 26 * cloneおよびwakeupメソッドは、Singletonクラスのコピーの外部インスタンス化を 27 * 防ぎ、オブジェクトの重複の可能性を排除する。 28 */ 29 30 public function __clone() { 31 trigger_error('Clone is not allowed.', E_USER_ERROR); 32 } 33 34 public function __wakeup() { 35 trigger_error('Deserializing is not allowed.', E_USER_ERROR); 36 } 37 38 // プライベートコンストラクタ 39 private function __construct() { 40 parent::__construct($this->dbHost, $this->user, $this->pass, $this->dbName); 41 if (mysqli_connect_error()) { 42 exit('Connect Error (' . mysqli_connect_errno() . ') ' 43 . mysqli_connect_error()); 44 } 45 parent::set_charset('utf-8'); 46 } 47 48 49 /*アカウント作成*/ 50 public function create_wisher($name, $password) { 51 $name = $this->real_escape_string($name); 52 $password = $this->real_escape_string($password); 53 $this->query("INSERT INTO wishers (name, password) VALUES ('" . $name 54 . "', '" . $password . "')"); 55 } 56 57 /*ユーザ資格情報を確認*/ 58 public function verify_wisher_credentials($name, $password) { 59 $name = $this->real_escape_string($name); 60 $password = $this->real_escape_string($password); 61 $result = $this->query("SELECT 1 FROM wishers WHERE name = '" 62 . $name . "' AND password = '" . $password . "'"); 63 return $result->data_seek(0); 64 } 65 66} 67 68 69?> 70

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

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

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

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

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

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

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

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

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のファイルは、ディレクトリ上にあるので、恐らくアクセス権限が関わっている可能性が考えられます。現在アクセス権限の設定方法の確認を行っています。
guest

回答1

0

ベストアンサー

いまはもうリファラは元のページを返さなくなってきています
それを前提にしているなら精度が低いのでやめた方がよいでしょう。
もしどうしてもというならセッションにそのページを保持しておく感じでしょうか・・・

投稿2020/12/03 08:36

yambejp

総合スコア116688

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

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

FKM

2020/12/03 13:24

そうなんですよね、取ってきたり取ってこなかったりです。信用度の問題になるので、本題が解決したら、リファラを使わないやり方に変えた方がいいでしょうね。
thunderbird683

2020/12/05 12:02

返信が遅くなりましたが、リファラを使う方法は取らないことにしました。回答・コメントしてくださった皆様、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問