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

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

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

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

Q&A

解決済

1回答

224閲覧

認証ページ内で戻るを押しても認証ページを見れるようにする方法について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2017/10/31 08:30

index.php
「メールアドレス」「パスワード」を入力してmanagement.phpに入る。

management.php
「名前」「アドレス」「詳細ボタン」
「名前」「アドレス」「詳細ボタン」
「名前」「アドレス」「詳細ボタン」
.
.
(以下略)

⇩詳細ボタンを押す

content-detail.php
「名前」「アドレス」「内容」「戻るボタン」

⇩戻るボタンを押す

management.php
「名前」「アドレス」「詳細ボタン」
「名前」「アドレス」「詳細ボタン」
「名前」「アドレス」「詳細ボタン」
.
.
(以下略)


のようにしたいと思っています。
戻るを押してmanagement.phpに戻った際エラーが出て再度見れなくなってしまうのですが見れるようにするにはどのようにすればいいのでしょうか?

index.php <div> <form action="management.php" method="post"> <p>管理画面</p> <input type="email" placeholder="メールアドレス" name="management-email"> <input type="password" placeholder="パスワード" name="management-password"> <input type="submit" value="管理画面"> </form> </div>
management.php <?php session_start(); $_SESSION = $_POST; if(($_POST['management-email'] != メルアド) || ($_POST['management-password'] != パスワード)){ header('Location: index.php'); } $dsn = 'mysql:dbname=ContactForm; host=localhost'; $user = 'root'; $password = 'パス'; $dbh = new PDO($dsn,$user,$password); $sql = 'SELECT * FROM contacts'; $stmt = $dbh -> prepare($sql); $stmt -> execute(); echo '<table>'."\n"; echo '<tr><th>名前</th><th>メールアドレス</th><th>お問い合わせ内容リンク</th></tr>'."\n"; foreach($stmt as $loop){ echo '<tr>'; echo '<td>'.$loop['name'].'</td>'; echo '<td>'.$loop['email'].'</td>'; echo '<td><a href="content-detail.php?id='.($loop['id']).'">詳細</a></td>'; echo '</tr>'; } echo '</table>'."\n"; echo '<a href="index.php">トップに戻る</a>'; $dbh = null; ?>
content-detail.php <?php session_start(); var_dump($_SESSION); if($_SESSION[""]){ header('Location: index.php'); } $dsn = 'mysql:dbname=ContactForm; host=localhost'; $user = 'root'; $password = 'パス'; $dbh = new PDO($dsn,$user,$password); $sql = 'SELECT * FROM contacts where id = ?'; $stmt = $dbh -> prepare($sql); $stmt -> bindValue(1,$_GET['id']); $stmt -> execute(); echo '<table>'."\n"; echo '<tr><th>名前</th><th>メールアドレス</th><th>お問い合わせ内容リンク</th></tr>'."\n"; foreach($stmt as $loop){ echo '<tr>'; echo '<td>'.$loop['name'].'</td>'; echo '<td>'.$loop['email'].'</td>'; echo '<td>'.$loop['content'].'</td>'; echo '</tr>'; } echo '</table>'."\n"; session_destroy(); ?> <form> <input type="button" name="btn_back" onclick="history.back()" value="戻る"> </form>

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

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

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

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

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

guest

回答1

0

ベストアンサー

ブラウザ側で有効期限切れなどと表示されてしまう直接の原因は、クライアントキャッシュが無効になっていることです。
session_start()の前で以下のように有効期限を設定すればブラウザがエラーを吐くことはなくなるでしょう。
http://php.net/manual/ja/function.session-cache-limiter.php

php

1session_cache_limiter('private_no_expire');

でもtanakamarukiさんのプログラムにはそれ以前に問題があります。
management.phpでpostの中身をセッションに入れ、postで認証処理を行っていることです。
これだと認証処理と一覧画面がごっちゃになってしまっています。
index.phpとmanagement.phpの間に認証のみ行うlogin.phpを噛ませた方がいいでしょう。
処理をわければprivate_no_expireを設定しなくてもよくなります。

index.php

php

1<form action="login.php" method="post">

login.php

php

1<?php 2if(($_POST['management-email'] != メルアド) || ($_POST['management-password'] != パスワード)){ 3 header('Location: index.php'); 4 exit(); 5} 6 7session_start(); 8$_SESSION = $_POST; 9header('Location: management.php'); 10exit();

management.php

php

1<?php 2session_start(); 3 4if(!$_SESSION['management-email']){ 5 header('Location: index.php'); 6 exit(); 7}

投稿2017/10/31 12:17

ooeok

総合スコア469

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

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

退会済みユーザー

退会済みユーザー

2017/11/01 01:44

content-detail.phpからmanagement.phpに戻る際、$_SESSION = $_POST;で$_POSTが無いので$_SESSIONが空になって非表示になっていたということなのでしょうか?
ooeok

2017/11/01 02:43

「戻る」ボタンを押したとき、ブラウザがエラー表示するのはクライアントキャッシュの問題です。 post値が空になっているからではなく、そもそもpostのときはブラウザバックを許していないためです。 なぜそういう設定がデフォルトになっているかというと、同じ値を何度もpostすることを許すと、DBの更新などを行っている場合、更新処理を繰り返してしまうから。 その対処法としてprivate_no_expireを設定することを示しました。 でも本来やるべきではありません。 そこで次にlogin.phpを噛ませる方法を示しました。 login.phpで認証処理(ID/パスワードチェックとセッション生成)だけを行い、他ではセッションチェック(ログインしているかどうか)だけを行います。 これならmanagement.php<->content-detail.php間の遷移はgetになるのでブラウザバックが効きます。 認証とセッションチェックは分離して実装しましょう。
退会済みユーザー

退会済みユーザー

2017/11/01 07:37

ご回答ありがとうございます。 そのほうが確かにわかりやすくていいですね。 ついでにlogout.phpも実装してみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問